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 服務說明及方案資訊,再按專案的資料安全、軟體需求與使用期間判斷是否適合;若任務長期穩定且高負載,或依賴本機實體介面,租用未必是合適選擇。