返回首頁

GitHub Repo

Transformers 社群回報 Mask2Former 參數註冊缺漏,投影層可能未隨模型移至 GPU

10 月 17 日的 Transformers 社群回報指出,Mask2Former 部分投影層以一般 Python 串列保存,可能漏出最佳化器與裝置搬移流程。社群已提出修補,但正式修復版本與實際分割準確率影響仍待確認。

Andrew Wippler from Lancaster, USA · CC BY 2.0 · Image source
zh-Hant

Transformers 於 10 月 17 日收到 Mask2Former 問題回報:Transformer 解碼器的 input_projections 使用一般 Python 串列保存,投影層因而未註冊為 PyTorch 子模組。回報者指出,v5.20.0 原始碼存在此寫法,並附上最小重現程式;這些參數可能未納入最佳化器,也不會隨模型移至 CUDA。問題回報

Mask2Former 支援語意、實例與全景分割。官方文件說明,enforce_input_projection 預設為關閉;開啟後,即使輸入通道數與解碼器隱藏維度相同,仍會加入 1×1 卷積投影。此次重現將兩個維度都設為 64,並開啟該選項,因此不能直接推論所有預訓練模型的預設推論流程都會失敗。模型與設定文件

重現程式逐一比對投影層權重與 module.parameters(),列出 12,480 個未註冊參數。這個數字屬於該測試設定,並非所有模型的固定缺漏量。回報亦指出,CUDA 執行可能出現輸入在 GPU、權重仍在 CPU 的型別不一致錯誤;若以模型列舉出的參數建立最佳化器,則可能漏更新這些投影權重。重現內容

技術關鍵是容器的註冊行為。PyTorch 文件明確說明,nn.ModuleList 雖可像串列索引,內含模組仍會正式註冊,並由父模組的方法辨識。據此判斷,檢查訓練流程不能只看前向運算是否成功,還須確認可訓練權重是否出現在參數清單、儲存狀態與正確裝置上。PyTorch 文件

討論串中已有貢獻者表示提交 PR #49703,將容器改為 nn.ModuleList(),並加入參數註冊測試。截至查核時,問題仍開啟,尚未確認正式修復版本,也沒有下游準確率量測。自行修改投影設定的團隊可先核對參數清單與裝置,再追蹤修補審查及既有檢查點的載入結果。修補提案說明

來源

  1. Mask2Former input_projections 未註冊問題與修補討論
  2. Mask2Former 模型與設定文件
  3. torch.nn.ModuleList API 文件