为何Apple M2 GPU训练的模型性能远逊于CPU训练的模型?
问题原因分析
核心问题:标签类型错误
在GPU训练代码中,你将标签转换为了float类型:
images, labels = images.to(device).float(), labels.to(device).float()
PyTorch的交叉熵损失(CrossEntropyLoss)默认要求标签为整数类型(torch.long)——因为标签代表类别索引(MNIST是0-9的整数)。将标签转为float后,损失函数无法正确计算类别与预测结果的匹配度,导致反向传播完全失效,权重更新没有实际意义,最终模型学不到任何有效特征,测试准确率只能达到随机猜测的水平(对应MNIST的10个类别,准确率约10%)。
其他需注意的细节(非核心)
- 冗余的设备转移:GPU训练时,
model_gpu(x)的输出已经在GPU上,无需额外调用.to(device):y = model_gpu(x).to(device) # 此步骤多余,可简化为y = model_gpu(x) - 模型设备绑定检查:训练前需确保
model_gpu已正确转移到GPU:model_gpu = model.to(device) # 必须执行此步骤才能让模型在GPU上运行
修复方案
修改GPU训练代码中的标签转换逻辑,将标签转为long类型:
images = images.to(device).float() labels = labels.to(device).long() # 替换原float类型转换
重新训练后,模型准确率应能与CPU训练的结果一致。
内容的提问来源于stack exchange,提问作者user23360353
相关产品推荐
相关产品推荐

