A bug that taught me more about PyTorch than years of using it
Плато обучения в модели PyTorch оказалось не ошибкой гиперпараметров, а багом в бэкенде фреймворка. Автор провёл детективное расследование, которое научило его больше о PyTorch, чем годы использования. Проблема заключалась в ядре MPS для Apple Silicon, где операции addcmul_ и addcdiv_ при работе с ненепрерывными тензорами молча записывали результаты во временный буфер вместо самого тензора.
Из-за инициализации весов энкодера как транспонированных декодера они получали ненепрерывную память, которая наследовалась состояниями оптимизатора Adam. Это приводило к тому, что exp_avg_sq.addcmul_() не обновлялся, оставаясь нулевым, что полностью останавливало обновление параметров. Исправить проблему можно, сделав веса непрерывными при инициализации, обновив PyTorch до версии ≥2.4 или перейдя на macOS 15+.