PyTorch模型调用.to(device)后仍不走GPU,主因是设备未对齐、参数越界或底层链路异常;需依次验证nvidia-smi、CUDA版本、torch安装包、张量显式迁移及环境变量等。

PyTorch模型调用 .to(device) 后仍不走GPU,大概率不是代码写错了,而是设备没对齐、参数炸了,或底层链路断了。
torch.cuda.is_available() 返回 False 怎么办
这是最基础的“拦路虎”,但原因往往不在 PyTorch 本身。先确认硬件和驱动是否真正就绪:
-
nvidia-smi命令必须能正常输出 GPU 型号、温度、驱动版本;如果报command not found,说明 NVIDIA 驱动压根没装 - 驱动版本要 ≥ 对应 CUDA 的最低要求(例如 CUDA 12.1 要求驱动 ≥ 530.30.02);
nvidia-smi显示的 “CUDA Version” 是驱动支持上限,不是你系统里装的 CUDA Toolkit 版本 -
python -c "import torch; print(torch.version.cuda)"输出为None?说明你装的是 CPU-only 版本,得重装:比如用pip install torch --index-url https://download.pytorch.org/whl/cu121(对应 CUDA 12.1) - Conda 环境下务必确认当前激活环境装的是 GPU 版:运行
conda list | grep torch,检查输出中是否含cuda或gpu字样
RuntimeError: expected device cpu but got cuda 是什么问题
这是典型的设备错位错误——模型在 GPU 上,输入张量却还在 CPU 上,PyTorch 拒绝混合运算。
- 所有参与计算的张量都得显式迁移:
model.to(device)不等于自动把x和y也搬过去 - 常见漏点:数据加载器返回的
batch是 CPU 张量,必须加batch = {k: v.to(device) for k, v in batch.items()}(如果是字典)或x, y = x.to(device), y.to(device) - 损失函数、标签、甚至中间生成的 mask、positional encoding 都可能卡在 CPU;出错时看报错栈,定位第一个非 GPU 张量出现的位置
- 别混用
.cuda()和.to(device):前者硬编码设备,后者可回退,统一用.to(device)更安全
model.to(device) 卡死或内存爆掉怎么办
这不是慢,是模型结构本身越界了——.to(device) 触发参数张量初始化+拷贝,一旦某层权重尺寸失控,直接触发显存/内存溢出。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 先跑
sum(p.numel() for p in model.parameters()):超 10 亿参数(≈4GB FP32 权重)就要警惕,消费级 GPU(如 T4 16GB)根本扛不住 - 重点查全连接层输入维度:比如
nn.Linear(2097152, 4096)单层权重就占 ≈34 GB(2097152 × 4096 × 4 bytes),远超显存;这通常源于卷积后未下采样,flatten尺寸误算成 512×64×64 - 验证实际特征图尺寸:用
dummy_input = torch.randn(1, 3, 256, 256)逐层前向,打印每层输出.shape,确认是否真缩小到了预期尺寸(如 64×64) - 修复方向:加
nn.MaxPool2d(2)或设stride=2的卷积;降低通道数(512→256);用nn.AdaptiveAvgPool2d替代硬 flatten
服务器上 nvidia-smi 正常但 PyTorch 不认 GPU
这种情况多见于容器、多用户或权限受限环境,PyTorch 看得见驱动,但拿不到设备句柄。
- 检查
CUDA_VISIBLE_DEVICES环境变量是否被设为空或错误值(如export CUDA_VISIBLE_DEVICES=""会屏蔽所有 GPU) - Docker 容器启动时必须加
--gpus all(或--gpus device=0),旧版用--runtime=nvidia已废弃 - 某些 HPC 集群限制非 root 用户访问
/dev/nvidia*设备节点,需联系管理员添加 udev 规则或使用 Slurm 的--gres=gpu:1 - PyTorch 2.x 在部分镜像中绑定的是 CUDA 11.8,但系统加载了 CUDA 12.x 运行时库,导致
torch.cuda.is_available()返回 False;用ldd $(python -c "import torch; print(torch.__file__)") | grep cuda查真实链接路径
最易被忽略的一点:设备迁移不是“一劳永逸”。模型在 GPU 上,不代表每次 forward 的输入、label、loss、optimizer.step() 所依赖的梯度都自动同步到位——只要有一个 tensor 掉队,整个链路就退回 CPU。动手前先 print(x.device), print(model.device),别靠猜。

















