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

