先看結論:本週把雙精度留在 CPU
PyTorch 官方 MPS 文件指出,MPS 後端不支援 float64;因此遇到 PyTorch 2.15 MPS 雙精度報錯時,確實需要雙精度的計算應先移到 CPU,不要直接把整個模型降成 float32。PyTorch 2.15 MPS 後端文件
本週建議動作:先確認錯誤來自資料型別還是 MPS 後端不可用,再用專案實際輸入做最小重現;只有研究判據容許單精度時,才試跑 MPS 並與 CPU 參考結果比較。
適合你閱讀:
高校研究生:在 Mac 執行 PyTorch 科研程式,遇到 double 或 float64 錯誤,正考慮切換 CPU 或調整計算流程。
科研人員與模型開發者:想使用 MPS,但需要確認精度要求及算子支援範圍。
課題組技術管理者:要為 Apple Silicon macOS 建立可重現的環境與結果驗收流程。
先分清報錯類型:精度限制不等於 MPS 無法使用
PyTorch 2.15 官方發布說明列出 Apple Silicon 的 MPS 更新,但新增功能不代表後端已支援所有資料型別或算子。官方發布日期為 2026 年 10 月 28 日;版本更新與 float64 支援狀態是兩項不同資訊,遇到錯誤仍應以 MPS 後端文件所列能力為準。PyTorch 2.15 發布說明
| 你看到的情況 | 較可能的問題 | 下一步檢查 |
|---|---|---|
錯誤訊息提到 float64、double,或張量轉到 MPS 時失敗 |
MPS 不支援該雙精度資料型別 | 找出建立該張量的程式碼及其前後的 .to() 呼叫 |
torch.backends.mps.is_available() 回傳 False |
執行環境未能使用 MPS;不等同於 float64 限制 |
再查 MPS 是否已建置,以及系統與裝置條件 |
| 後端檢查通過,但模型在特定操作失敗 | 可能是該算子、資料型別或操作組合的支援邊界 | 用最小程式單獨執行出錯操作 |
PyTorch MPS 為什麼不支援 float64? 官方文件確認 MPS 不支援 float64 與 complex128。這是後端能力限制,不是把套件重新安裝一次就必然能解除的故障;如果你的科學計算必須保留雙精度,應將相關運算安排在 CPU,而不是只因 MPS 可用便假設所有張量都能移過去。MPS 後端文件的資料型別說明
先用官方提供的檢查方式判斷 MPS 是否存在、是否可用:
import torch
print(torch.backends.mps.is_built())
print(torch.backends.mps.is_available())
is_built() 與 is_available() 回答的是不同問題:前者檢查 PyTorch 是否包含 MPS 支援,後者檢查目前環境能否使用 MPS。兩者都不能證明你的模型內每個操作都能在 MPS 執行;可用性檢查的定義見 PyTorch MPS 文件。
PyTorch 2.15 出現 double 張量錯誤,該怎麼處理? 先找出錯誤訊息指向的張量建立、載入或裝置轉換位置;若錯誤發生在將雙精度張量送往 MPS,就把必須保留精度的步驟留在 CPU。不要只改模型輸入型別,因為參數、常數張量或中間結果仍可能是 double。
設備分工:必須保留精度就用 CPU,容許單精度再試 MPS
| 計算需求 | 建議路徑 | 需要留意的地方 |
|---|---|---|
| 研究方法或既有結果要求雙精度 | CPU 上執行相關步驟 | 確認輸入、模型參數與中間張量都沒有意外轉往 MPS |
專案判據允許 float32,且目標操作可在 MPS 執行 |
建立獨立的 MPS 試跑路徑 | 對照 CPU 輸出及下游研究結論,不預設結果等價 |
| 模型混用 CPU 與 MPS | 只在明確劃分的邊界搬移張量 | 追蹤張量裝置與型別,避免隱性轉換及額外傳輸 |
科研計算中哪些步驟應留在 CPU 雙精度? 凡是研究設計、方法文件或團隊驗收標準明確要求雙精度的計算,都不應在未驗證前改成 float32。如果只有少數步驟需要雙精度,可先把這些步驟留在 CPU,再評估其餘操作是否能獨立放到 MPS;但分段計算可能涉及張量搬移,必須核對每個邊界的裝置與資料型別。
出錯點常不在模型主體,而在資料載入後、預處理或計算中途的型別轉換。請檢查張量的 dtype 與 device,並逐一查看 .to() 的目標裝置及型別;官方 .to() 文件說明此介面可轉換張量的裝置與資料型別,不能只看呼叫前的設定來推斷最終狀態。torch.Tensor.to() 文件
降為單精度:先建立隔離試跑,再檢查結果
若研究問題允許單精度,可在獨立分支或副本中建立 float32 路徑,避免改動原本的基準流程。先用專案中實際觸發錯誤的資料做最小重現,再依序確認輸入、參數及中間結果的型別;接著逐項執行目標操作,記錄哪些操作確實在 MPS 完成、哪些仍須回到 CPU。
請勿把「移除錯誤」當成「驗證完成」。官方數值精度說明指出,不同運算路徑與硬體可能造成數值結果差異;是否可接受,應由你的研究設計或團隊預先訂定的驗收判據決定,而不是套用一個通用誤差百分比。PyTorch 數值精度說明
把 PyTorch 模型改成 float32 後,怎樣確認結果可靠? 對同一組輸入,以固定的專案條件分別執行 CPU 參考路徑與 MPS 試跑,檢查輸出差異、研究所依賴的關鍵統計量,以及下游結論是否改變。若差異超出你預先定義的研究或團隊判據,就保留 CPU 雙精度路徑,並記錄造成差異的操作;若有非有限值,也可用 torch.isfinite() 文件所述介面檢查張量中的 NaN 或無窮值。
| 驗收項目 | 怎麼做 | 通過依據 |
|---|---|---|
| 輸入與環境一致 | CPU 與 MPS 使用相同資料、模型設定及專案條件 | 執行紀錄可重現,差異來源可追查 |
| 型別與裝置正確 | 記錄關鍵張量的 dtype、device,檢查轉換位置 |
雙精度步驟留在 CPU;MPS 路徑沒有未預期的型別轉換 |
| 數值與下游結果 | 比對輸出、關鍵統計量及研究結論 | 符合研究設計或團隊事前訂定的驗收判據 |
| 異常值檢查 | 使用 torch.isfinite() 檢查結果 |
沒有未解釋的非有限值;若有,須追查計算來源 |
故障重現:用專案最小案例追蹤張量流向
以下流程可以把精度問題、後端問題與算子問題分開處理:
- 保留完整錯誤訊息。 記下報錯位置、張量的
dtype與device,不要先改型別或吞掉例外,否則可能失去重現線索。 - 確認 MPS 狀態。 執行上方的
is_built()與is_available()檢查;若 MPS 不可用,先按環境條件排查,不要把它誤判為雙精度限制。 - 縮小重現範圍。 從原始程式抽出建立出錯張量及觸發錯誤操作的最小片段,保留相同型別與裝置目標。
- 追蹤轉換位置。 搜尋
.to()、模型載入、資料預處理及常數張量建立處,逐段確認 CPU、MPS 與資料型別。 - 依精度要求選擇路徑。 必須使用
float64的步驟留在 CPU;只有研究判據容許單精度時,才建立float32的 MPS 試跑。 - 逐項測試算子並驗收。 不從 MPS 可用推定全模型可跑;完成操作測試後,再按前表對照數值及下游結論。
若需排查 MPS 的行為,可參照官方 MPS 環境變數說明,但不要把環境變數當成解除 float64 支援限制的修補方式。它們適合在有明確診斷目的時調整或記錄執行環境,不能取代最小重現與研究結果驗收。
Mac 驗證環境:補足 MPS 測試,不替代精度判斷
如果課題組只有 Linux 或 Windows 設備,這些環境可以用來執行 CPU 參考計算,卻不能代替 Apple Silicon macOS 上的 MPS 實際驗收。當問題只涉及雙精度要求,先留在 CPU 通常更直接;當你需要確認 MPS 可用性、特定算子行為或完整程式在 macOS 上的執行情況,才需要準備可實際連線的 Mac 環境。
MPS 檢查通過,是否代表模型全程使用 GPU? 不代表。檢查結果只表示目前環境可使用 MPS,並未驗證模型內所有算子,也不能證明每個張量都位於 MPS。請追蹤關鍵操作的裝置與型別,對不支援的路徑另行處理,並以實際執行及結果驗收作最後判斷。
哪些任務仍應留在 CPU? 研究方法要求雙精度的步驟、MPS 不支援的資料型別,以及尚未確認可在 MPS 執行的操作,都應先保留 CPU 路徑。若要把特定操作移到 MPS,先確認算子與資料型別,再檢查轉換前後的結果;不要以自動降精度或遇錯回退取代明確驗收。
最後更新於 2026 年 11 月 11 日;版本、MPS 資料型別限制及數值精度資訊,已按本文引用的 PyTorch 官方發布說明、MPS 後端文件與數值精度說明核對。若後續版本改變 MPS 支援範圍,應重新檢查相關文件及專案實測結果。
若你只需確認雙精度流程,先以現有 CPU 環境建立可信的參考結果;若實驗室缺少 Apple Silicon Mac,且工作確實需要 macOS 上的 MPS 驗收,遠端 Mac 可作為補充測試環境,但租用不能代替精度驗證或機構審批。選用前先核對實際系統、晶片資訊與連線方式,再參考 VpsHold 的遠端 Mac 環境及方案比較資訊判斷是否符合你的測試需求。
