The bug that taught me more about PyTorch than years of using it
7 months ago
- #Debugging
- #PyTorch
- #MPS
- 训练损失曲线最初被误认为是超参数问题,但实际是由PyTorch的bug引起
- 该bug与PyTorch的MPS后端相关:在Apple Silicon(MPS)上对非连续张量执行`addcmul_`和`addcdiv_`运算时会静默失败
- 调试过程贯穿了PyTorch的抽象层——从优化器内部实现一直追踪到GPU内核代码
- 通过对比有效操作(`mul_`)和失效操作(`addcmul_`)并分析它们对非连续张量的处理方式,最终定位问题
- 解决方案是显式处理非连续张量:使用临时连续缓冲区并复制结果
- 该bug已在PyTorch v2.4修复,但在旧版macOS上随机操作(`normal_`、`uniform_`等)仍存在类似问题
- 重要经验包括:隔离可观测现象、检查张量元数据、记录调试步骤以便后续追溯