GitHub Repo
PyTorch 社群回報融合 SGD 初始化缺口,AMP 跳過首步後可能污染動量狀態
10 月 21 日的 PyTorch 社群回報指出,融合 SGD 在梯度溢位而跳過首次更新時,可能留下未初始化的動量緩衝區,影響下一次有效更新。另一名參與者表示已在 CPU 重現,但尚無維護者確認或正式修復版本。

PyTorch 於 10 月 21 日新增一則訓練正確性回報:當 torch.optim.SGD 同時設定 momentum>0 與 fused=True,若 GradScaler 因梯度出現無窮大而跳過首次更新,優化器可能留下未初始化的動量狀態,並在下一次有效更新時讀取。回報者提供最小重現程式,表示在 2.14.1 與 10 月 20 日的 nightly 上,CPU、CUDA 均出現問題。社群回報
這項交互作用涉及混合精度訓練的保護流程。官方 AMP 範例說明,GradScaler 會先還原梯度尺度,遇到 inf 或 NaN 時跳過更新,避免異常梯度改寫參數。因此,檢查這類問題時,除了確認參數當下沒有變動,也需要觀察優化器是否留下會影響後續運算的狀態。AMP 文件
另一名參與者表示已在 CPU 重現,並將原因追到融合路徑:程式先配置動量緩衝區,核心遇到溢位旗標便提前返回,但外層仍保存該緩衝區。下一輪遂把它視為既有動量。回報中的確定性模式會讓未初始化記憶體填入 NaN,使參數隨後變成 NaN;這是揭露缺口的測試條件,不能解讀為所有訓練都必然出現相同結果。重現與原始碼分析
官方 SGD 文件規定,首次動量應直接取當次梯度,且首次不套用 dampening;融合版本則透過合併運算改善效能,目前並非預設選項。這表示修補除了避免讀取未初始化值,也須維持首次有效更新的數學語義。SGD 文件
對使用這組設定的工程團隊,合理的驗證方向是刻意讓首步溢位,再比較 fused=True 與 fused=False 的參數及動量狀態。後續應追蹤維護者確認、涵蓋非零 dampening 的回歸測試,以及修補實際進入哪個版本;截至查核時,討論仍停留在社群重現與修補建議,尚未連結修補 PR。議題狀態