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
相关产品推荐
相关产品推荐

