为何PyTorch CUDA任务运行在CPU上?GPU负载0%问题求助
问题描述
- 执行修正后的代码
torch.device('cuda' if torch.cuda.is_available() else 'cpu')(原代码存在笔误torch.code.is_available())返回cuda,确认PyTorch检测到CUDA可用 - 训练模型时,任务管理器显示GPU负载为0%,CPU负载维持在35-40%
- PyTorch安装命令:
pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121 - 系统监控截图:

排查与解决步骤
强制模型与数据迁移到CUDA设备
这是最常见的疏漏,必须确保训练流程中所有参与计算的元素都移到CUDA上:device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 模型移到cuda model = model.to(device) # 损失函数移到cuda(如果有自定义损失或需要的话) criterion = criterion.to(device) for inputs, labels in dataloader: # 输入数据与标签移到cuda inputs = inputs.to(device) labels = labels.to(device) # 训练前清空梯度 optimizer.zero_grad() # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播+优化 loss.backward() optimizer.step()任何未迁移到CUDA的元素都会导致CPU承担计算,GPU闲置。
切换任务管理器的GPU监控项
任务管理器默认显示的「3D」负载不代表CUDA计算负载,右键GPU监控栏,勾选「CUDA」,查看PyTorch实际使用的CUDA核心负载。验证PyTorch CUDA实际计算能力
运行以下代码快速验证CUDA是否能正常运算:import torch print("CUDA可用:", torch.cuda.is_available()) print("GPU数量:", torch.cuda.device_count()) # 测试大张量矩阵乘法 x = torch.randn(2048, 2048).cuda() y = torch.randn(2048, 2048).cuda() z = torch.matmul(x, y) print("运算结果所在设备:", z.device) # 应输出cuda:0如果这段代码正常运行且设备显示cuda,说明底层CUDA环境没问题,问题出在训练代码的device配置。
调整模型规模与batch size
若模型过小、batch size极低,GPU的计算量不足以触发持续负载,会表现为0%。尝试增大batch size(注意显存容量,避免OOM),或用更大的模型测试GPU占用情况。优化数据加载流程
若数据加载在CPU上耗时过长,GPU会处于等待状态,表现为负载为0。可尝试:- 给DataLoader设置
num_workers > 0,开启多进程加载数据 - 提前将全部数据加载到GPU(显存足够时)
- 使用TorchVision的预处理加速工具,减少CPU预处理耗时
- 给DataLoader设置
内容的提问来源于stack exchange,提问作者Max Osad
相关产品推荐
相关产品推荐

