Sửa lỗi PyTorch RuntimeError: "Expected all tensors to be on the same device" trong HuggingFace

beginner🧠 AI Tools2026-05-25| Python 3.8+, PyTorch 1.10+, HuggingFace Transformers, GPU hỗ trợ CUDA

Error Message

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat2 in method wrapper_CUDA_mm)
#huggingface#pytorch#cuda#device-mismatch#transformers

Tình huống lỗiĐây là một tình huống kinh điển trong PyTorch: bạn đã tải thành công một mô hình nặng như Llama-3 hoặc Whisper lên GPU, nhưng ngay khi bắt đầu quá trình suy luận (inference), mọi thứ đều bị lỗi. Có khả năng bạn đã di chuyển mô hình bằng model.to('cuda'), tuy nhiên các tensor được trả về từ tokenizer vẫn đang nằm trong RAM hệ thống.

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

Tại sao lỗi này xảy raNguyên tắc của PyTorch rất khắt khe. Nó không thể thực hiện các phép toán học, chẳng hạn như nhân ma trận (mat2 trong lỗi trên), nếu dữ liệu bị chia tách trên các phần cứng khác nhau. Trọng số mô hình của bạn hiện đang ở cuda:0 (GPU), nhưng các ID đầu vào lại đang ở cpu.

Sự mất kết nối này xảy ra vì model.to('cuda') chỉ di chuyển các tham số và bộ đệm của mô hình. Hàm tokenizer() theo mặc định sẽ tạo ra các tensor mới trên CPU. Khi GPU cố gắng xử lý các đầu vào này, nó gặp phải rào cản bộ nhớ vì không thể truy cập trực tiếp vào không gian bộ nhớ của CPU cho phép tính cụ thể đó.

Giải pháp tức thời: Di chuyển thủ côngĐể mã chạy được, hãy di chuyển toàn bộ dictionary đầu vào lên GPU. Vì các tokenizer của HuggingFace trả về một đối tượng dạng dictionary (BatchEncoding), bạn có thể sử dụng dictionary comprehension ngắn gọn để chuyển mọi tensor cùng một lúc.

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# Phát hiện phần cứng
device = "cuda" if torch.cuda.is_available() else "cpu"

# Khởi tạo mô hình và chuyển nó lên GPU
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2").to(device)

inputs = tokenizer("Tại sao tensor của tôi nằm sai thiết bị?", return_tensors="pt")

# SỬA: Đồng bộ đầu vào với thiết bị của mô hình
inputs = {k: v.to(device) for k, v in inputs.items()}

output = model.generate(**inputs)

Các phương pháp hay nhất về lâu dài### 1. Tận dụng device_map="auto"Đối với các LLM hiện đại, hãy sử dụng thư viện accelerate. Bằng cách thiết lập device_map="auto", HuggingFace sẽ tự động quản lý việc sắp xếp các lớp mô hình trên VRAM hiện có và xử lý việc điều hướng đầu vào cho bạn.

# Yêu cầu: pip install accelerate
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    device_map="auto"
)

2. Tạo các Tensor tức thời (On-the-Fly)Nếu quá trình forward pass tùy chỉnh của bạn tạo ra các tensor mới (như attention mask hoặc tăng vị trí), đừng bao giờ mã hóa cứng (hardcode) chúng vào CPU. Thay vào đó, hãy luôn tham chiếu đến thuộc tính device hiện có của mô hình để đảm bảo tính tương thích.

# TRÁNH: Mặc định là CPU và gây ra lỗi
mask = torch.ones((1, 10))

# ƯU TIÊN: Tự động kế thừa thiết bị hiện tại của mô hình
mask = torch.ones((1, 10), device=model.device)

3. Phím tắt với PipelineNếu bạn thích sự đơn giản, hãy sử dụng API pipeline. Việc truyền device=0 đảm bảo rằng cả mô hình và bất kỳ dữ liệu nào truyền vào nó đều được xử lý tự động trên GPU, loại bỏ nhu cầu gọi .to() thủ công.

from transformers import pipeline

# device=0 ánh xạ tới cuda:0
pipe = pipeline("sentiment-analysis", model="distilbert-base-uncased", device=0)

# Đầu vào được di chuyển lên GPU ngầm bên dưới
pipe("Cách sửa lỗi này hoạt động hoàn hảo!")

Xác minh nhanhXác minh thiết lập của bạn bằng cách kiểm tra một tham số duy nhất từ mô hình và so sánh nó với các tensor đầu vào của bạn. Việc kiểm tra bằng 2 dòng lệnh này giúp tiết kiệm hàng giờ gỡ lỗi:

print(f"Vị trí mô hình: {next(model.parameters()).device}")
print(f"Vị trí đầu vào: {inputs['input_ids'].device}")

Nếu một cái hiển thị cuda:0 và cái kia hiển thị cpu, bạn vẫn đang gặp tình trạng không khớp. Cả hai phải đồng nhất thì mã mới có thể thực thi.

Related Error Notes