You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch CUDA训练远慢于CPU的问题排查求助

你的PyTorch模型CUDA跑起来比CPU慢的核心原因及修复方案

我帮你揪出了几个让CUDA性能反而不如CPU的关键问题,核心都是设备不匹配导致的频繁数据拷贝——这可是GPU加速的头号大忌,下面逐个拆解:

1. 模型参数没迁移到CUDA设备(最致命的问题)

你把输入和标签张量都放到了cuda:0,但你的StepNN里的线性层参数还老老实实地待在CPU上!每次前向传播时,GPU上的输入会被传到CPU计算线性层,结果又传回GPU过激活函数,来回的数据拷贝开销比计算本身大N倍,直接把CUDA的优势拖没了。

修复方法:初始化模型后,直接把整个模型移到目标设备上,这比单独给每个层加.cuda()灵活得多,还能适配CPU/CUDA切换:

nn = StepNN(4,8,3).to(device)  # 把模型所有参数一次性移到指定设备

2. 自定义Autograd函数里硬编码设备(隐藏的坑)

看你写的forward_step函数里,手动指定了device = device,这种硬编码的方式很危险——如果输入在GPU上,这里生成的张量会跑到CPU,又会触发不必要的数据拷贝。正确的做法是跟着输入张量的设备走:

def forward_step(ctx, input):
    return (input > 0.5).float()  # 自动继承输入的设备,不用手动指定

这样不管输入在CPU还是CUDA,输出都会在同一个设备上,避免跨设备拷贝。

3. 冗余的设备赋值(测试时容易踩的小坑)

你代码里先写了dname = 'cuda:0',又立刻改成dname = 'cpu',测试CUDA性能的时候记得把dname = 'cpu'注释掉,不然实际跑的还是CPU,白忙活一场。

补充:关于你提到的自定义backward函数

你说的def backward(ctx, input): return backward_sigm(ctx, input)这类函数,是自定义Autograd的标准写法,本身不会影响性能,性能问题完全是前面说的设备不匹配导致的。

内容的提问来源于stack exchange,提问作者user8426627

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:19:36