返回首頁

GitHub Repo

TensorFlow 社群回報 CPU 批次矩陣乘法異常,特定 float32 輸入可能產生錯誤結果

10 月 23 日的 TensorFlow 社群回報指出,特定 CPU 配置執行 float32 批次矩陣乘法時,可能無警告地產生大幅偏離且不固定的結果。回報附有重現程式與停用 oneDNN 的對照測試,但根因、影響範圍及正式修復仍待確認。

Max Eddy · CC BY-SA 4.0 · Image source
zh-Hant

TensorFlow GitHub 於 10 月 23 日出現一則數值正確性回報:三維 float32 張量在 CPU 執行 tf.matmul,當批次大小介於 2 至 16、乘積加總維度達 20,000 以上時,可能得到明顯錯誤的輸出,而且沒有例外或警告。回報者在 TensorFlow 2.20.0 與 2.21.0 觀察到問題,環境為 WSL2 下的 Ubuntu、AMD Ryzen 9 7950X,尚不能推廣至其他處理器或作業系統。社群回報

回報以 NumPy float64 結果為參考,比較批次矩陣乘法、逐筆二維乘法及 float64 路徑;後兩者在測試中正常。停用 oneDNN 後,原本異常的組合也恢復接近參考值。同一組輸入重複呼叫仍會出現不同輸出,顯示問題值得進一步檢查,但這些對照尚不足以確認底層根因。測試程式與輸出

這類運算本身符合 API 用法。官方文件說明,tf.matmul 支援二維以上張量,最內側兩維執行矩陣相乘,外側維度代表批次。因此,工程團隊若在相似配置看到異常,應檢查實際運算形狀與執行路徑,並以小型參考計算確認數值,而非只依賴流程是否成功結束。對研究程式而言,錯誤中間值也可能讓後續演算法失效,增加定位困難。矩陣乘法文件

官方過往已說明,oneDNN 最佳化可能因浮點運算順序而帶來些微數值差異,並提供 TF_ENABLE_ONEDNN_OPTS=0 作為停用方式。此次回報的幅度與重複執行差異,則需要獨立驗證。受影響疑慮的團隊可在啟動 TensorFlow 前設定該變數進行對照,再衡量效能代價;截至查核時,議題仍開啟,未見維護者重現結論或連結的修補。下一步應關注其他 CPU 的測試、Nightly 是否受影響,以及最終修復版本。oneDNN 官方說明

來源

  1. TensorFlow issue #129498:CPU float32 批次矩陣乘法錯誤回報
  2. tf.linalg.matmul API 文件
  3. What's new in TensorFlow 2.9?