PyTorch 官方的 2.14 版發布說明列出 Apple Silicon 相關的 MPS 改進;但版本更新不代表你的環境或科研程式中的每個算子都能使用 MPS。本週先確認建置是否包含 MPS、目前系統能否提供 MPS,再區分裝置遷移、未實作算子與資料型別問題;不要把 CPU fallback 正常執行,當成 GPU 加速已正常。

適合正在處理 torch.backends.mps.is_available() 回傳 False,或模型遷移後出現算子錯誤的研究生、博士生與科研人員。 若你負責實驗室環境設定,也可以用本文的檢查項目整理可重複核對的診斷紀錄。

最後更新於 2026 年 10 月 23 日;版本狀態與 MPS 條件核對自 PyTorch 2.14 發布說明及MPS 後端文件。

PyTorch 2.14 MPS 不可用:分清建置與執行狀態

is_built() 和 is_available() 回答的不是同一件事。前者用來確認目前載入的 PyTorch 是否建置了 MPS 支援;後者檢查目前環境是否能實際使用 MPS。建置支援存在,不等於這台 Mac、目前的系統與所載入的套件組合已能執行 MPS。兩個檢查的定義可參考官方 MPS 後端文件。

先在出錯的終端機執行下列診斷程式,保存輸出;不要先卸載套件或重建整個環境:

import platform
import sys
import torch

print("python:", sys.executable)
print("torch:", torch.__version__)
print("torch path:", torch.__file__)
print("machine:", platform.machine())
print("macOS:", platform.mac_ver()[0])
print("MPS built:", torch.backends.mps.is_built())
print("MPS available:", torch.backends.mps.is_available())

解讀時分成三種狀態:

  • is_built() 為 False:目前載入的 PyTorch 建置沒有 MPS 支援。優先查套件來源、安裝環境與實際匯入路徑,不要把它當成個別算子失敗。
  • is_built() 為 True、is_available() 為 False:支援已編入套件,但目前執行環境無法提供 MPS。核對實際使用的 Python、處理器架構與 macOS 條件,並以官方 MPS 文件列出的環境要求為準。
  • 兩者皆為 True:只能說 MPS 可用性檢查通過,不能證明你的模型、資料型別與科研流程都能在 MPS 執行。

為什麼明明是 Apple Silicon Mac,MPS 仍顯示不可用?
Apple Silicon Mac 是必要的排查線索,不是單獨的保證。你還要確認目前啟動的 Python 是否就是安裝 PyTorch 的環境,以及 macOS 和 PyTorch 建置是否符合官方文件的條件。若不同終端機輸出的 sys.executable 或 torch.__file__ 不同,先處理環境指向,再判斷硬體問題。

匯入或安裝異常:先核對 Python 環境

若匯入失敗,或在終端機、Notebook、排程工作之間看到不同結果,先不要立即換 PyTorch 版本。這些症狀常與解譯器、套件安裝位置或啟動方式不一致有關;單看套件管理工具回報「已安裝」,無法證明程式正在載入同一份套件。

沿著這條時間線逐項確認:

  • 重現當下:在實際出錯的工作環境執行診斷程式,記錄 sys.executable、torch.__version__ 和 torch.__file__。
  • 核對啟動方式:確認 Notebook 核心、IDE 執行設定與終端機呼叫的 Python 路徑相同。若路徑不同,先切換至正確環境後重測。
  • 核對套件來源:回看 PyTorch 是透過哪個套件管理方式安裝,並檢查實際載入版本。安裝選項請依官方本地安裝選擇器提供的當前資訊確認,不要套用未核實的固定命令或版本組合。
  • 記錄系統條件:將處理器架構、macOS 版本、Python 路徑與 PyTorch 版本一併保存。這些資訊能幫你和實驗室同事重現同一個環境,而不是依照模糊的「在我的 Mac 可以」推測。
  • 修正後重跑:只改動已找到的環境差異,再重新執行 is_built()、is_available() 和最小測試。一次換多項依賴,會讓故障原因更難定位。

如果匯入本身失敗,先解決套件或環境錯誤;如果可以匯入但 MPS 不可用,則依前一節核對執行條件。這兩種情況不應直接合併成「MPS 壞掉」。

模型與算子錯誤:區分遷移、支援範圍與資料型別

模型或張量移往 MPS 時失敗、執行特定運算時報錯,以及使用某種資料型別時無法運作,成因不同。先從錯誤發生的位置判斷,再縮小問題範圍。

  • 移動裝置時失敗:檢查模型、輸入張量和運算中建立的新張量是否都在預期裝置上。若其中一部分留在 CPU,錯誤可能是裝置不一致,而不是算子缺少支援。
  • 特定運算才失敗:保留最小重現案例,逐步移除模型層或前處理,找出最先出錯的運算。PyTorch MPS 算子支援並不代表所有模型路徑都已支援;以對應版本的 MPS 文件及實際錯誤為依據。
  • 資料型別相關錯誤:檢查輸入與中間結果的 dtype。MPS 有已知資料型別邊界;例如官方文件說明 float64 並非 MPS 支援的型別。可對照官方 MPS 資料型別說明,不要因為模型能搬到裝置上,就推定所有型別都能執行。

PyTorch MPS 算子不支援時,CPU fallback 能不能處理?
可以把 fallback 當作診斷或暫時執行的選項,但不能假設它能解決所有不支援的算子與資料型別問題,更不能據此宣稱整個工作負載都在 GPU 上執行。官方列出控制 MPS fallback 行為的環境變數及其說明。啟用後仍要檢查錯誤是否消失、哪些運算可能轉回 CPU,以及結果是否符合研究流程的驗收要求。

注意:fallback 使程式繼續執行,不等於已排除裝置限制。若研究結果要和其他環境比較,請記下是否啟用 fallback,並以同一份輸入、相同資料前處理與明確的結果判準進行複核。

執行路徑與結果:用最小樣例驗證

is_available() 回傳 True,或程式執行完成,都不能單獨證明代表性科研任務已在預期裝置上執行,也不能證明結果可接受。先以小型樣例檢查裝置,再使用專案本身的基線資料與判準驗收。

import torch

if not torch.backends.mps.is_available():
    raise RuntimeError("目前環境無法使用 MPS")

device = torch.device("mps")
x = torch.randn(4, 4, device=device)
y = x @ x

print("input device:", x.device)
print("output device:", y.device)
print("output dtype:", y.dtype)

這段程式只確認簡單張量操作的裝置路徑,不能代替模型驗收。接著使用專案中的代表性輸入,逐步檢查模型參數、資料張量、關鍵算子與輸出裝置。若已啟用 fallback,另行記錄環境變數設定,避免把混合執行誤認為全程使用 MPS。

結果複核時,以研究問題與既有流程為準:比較同一輸入下的輸出、指標與可接受誤差,並保留隨機種子、前處理設定、軟體版本和裝置紀錄。PyTorch 的可重現性說明指出,隨機行為的可重現性受設定與環境影響;因此不能只比較一次輸出,便推論兩條執行路徑等價。

PyTorch MPS 的科研結果如何和 CPU 結果複核?
使用相同程式版本、同一批輸入與一致的資料前處理,分別保存 CPU 和 MPS 的輸出與評估指標,再依研究專案事先設定的容許範圍判斷。若兩端結果不符,不要只以調高容許誤差結案;先查隨機性、精度、裝置切換與 fallback,再判斷是否適合將 MPS 納入正式流程。

排查清單與計算路線

按可觀察證據完成檢查,不要在尚未定位前同時重裝套件、修改 dtype、啟用 fallback 和改動模型:

  • [ ] 在實際出錯的 Python 環境執行診斷程式,保存 Python 與 PyTorch 路徑。
  • [ ] 分別記錄 is_built() 和 is_available(),不以其中一項推斷另一項。
  • [ ] 對照官方 MPS 環境條件,確認處理器架構、macOS 與 PyTorch 建置。
  • [ ] 將錯誤分類為匯入、裝置遷移、特定算子或資料型別問題。
  • [ ] 用最小樣例確認輸入與輸出裝置,再以代表性科研任務驗收。
  • [ ] 若使用 fallback,記錄設定並檢查實際執行路徑。
  • [ ] 以專案基線核對結果,保存輸入、環境與評估紀錄。
路線 適合情況 主要限制 放行前要確認
MPS 環境檢查通過,代表性任務中的關鍵算子可執行 仍需逐項驗證算子、dtype 與執行路徑 輸出符合專案判準,且 fallback 狀態有紀錄
CPU MPS 尚未定位完成,或目前任務可在 CPU 路徑驗證 不應把 CPU 成功當成 MPS 問題已解決 CPU 結果可重現,且符合研究流程要求
HPC 任務依賴實驗室既有 HPC 環境,或需沿用該環境的計算流程 必須確認程式、資料與依賴能在 HPC 上部署 執行環境、輸入輸出及結果判準已和專案流程對齊
暫停遷移 關鍵算子或結果差異尚未查明 會延後切換,卻能避免未驗證環境進入正式分析 保留錯誤案例,待支援條件或研究流程確認後再測
故障證據 優先處理 不宜直接推論
is_built() 為 False 查 PyTorch 建置與實際套件路徑 不代表 Mac 硬體故障
已建置但不可用 查目前 Python、系統條件與裝置可用性 不代表特定模型算子不支援
只有特定運算報錯 建立最小重現並核對算子與 dtype 不代表整個 MPS 安裝失敗
fallback 後程式可完成 查執行路徑並複核科研結果 不代表全程由 MPS 加速

如果你的現有方案是只用 CPU,可能無法直接驗證 MPS 路徑;若改投 HPC,則要處理環境與資料流程是否吻合;若購買本機 Mac,則需要承擔設備成本與環境維護。對只需短期驗證 Apple Silicon、重現 MPS 故障或測試科研程式的人,按需求租用遠端 Mac 可先完成環境驗收,而不必把購置設備當成排查的第一步。你可先查看 VMSPIN 的遠端 Mac 服務說明及方案資訊,再按專案的資料安全、軟體需求與使用期間判斷是否適合;若任務長期穩定且高負載,或依賴本機實體介面,租用未必是合適選擇。