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

PyTorch模型CPU与GPU训练准确率差异较大的原因问询

准确率差异的可能原因

  • Softmax维度未指定导致计算逻辑不一致
    你代码中所有nn.Softmax()调用都没有显式指定dim参数,PyTorch不同设备、不同版本对未指定dim的Softmax处理逻辑存在差异。问答任务输出的start/end logits维度为[batch_size, seq_len],正确的操作应该指定dim=1在序列维度做Softmax,未指定时CPU和GPU的维度广播、计算规则不一致,直接导致输出概率分布偏差。
  • 张量设备未显式对齐引发的精度问题
    代码中attn = torch.FloatTensor(self.weights).view(1, -1, 1)没有显式移动到CUDA设备,当其余张量都在GPU上时,PyTorch会触发隐式设备迁移,这个过程中容易出现精度截断、数值计算顺序变化的问题,叠加Tesla K80的开普勒架构本身的浮点计算特性,进一步放大误差。
  • CUDA版本与PyTorch、硬件适配不匹配
    你使用的CUDA 10.1版本过老,若当前PyTorch版本高于1.6,官方已停止对CUDA 10.1的支持,底层Transformer算子实现不匹配会导致Attention计算输出偏差。同时Tesla K80算力仅为3.7,高版本PyTorch默认编译的CUDA算子通常没有适配这么低的算力,运行时会触发兼容性 fallback 实现,计算精度损失严重。
  • 损失计算逻辑存在数值稳定性缺陷
    你采用Softmax + torch.log + NLLLoss的组合计算损失,该操作本身数值稳定性差,GPU默认使用float32精度计算时极易出现log(0)的数值下溢问题,导致损失计算错误,模型更新方向偏离。CPU默认使用float64精度计算,这类问题出现概率低很多,最终准确率差距明显。正确的实现应该直接使用CrossEntropyLoss,或者用LogSoftmax替代Softmax + torch.log的组合。
  • K80硬件特性导致的累积误差
    Tesla K80不支持FP16计算,且部分新CUDA算子针对安培、图灵架构优化,在K80上运行时的兼容性实现和CPU原生实现本身就存在微小误差,训练过程中多轮迭代后误差会被不断放大,最终导致模型收敛效果远差于CPU版本。

内容的提问来源于stack exchange,提问作者r.b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:45:02