PyTorch 設計理念#
建立日期:2022 年 6 月 10 日 | 最後更新日期:2025 年 4 月 16 日
本文件旨在幫助貢獻者和模組維護者理解 PyTorch 隨著時間推移所形成的高層設計原則。這些原則並非硬性規定,而是作為指導,幫助權衡不同的顧慮,並解決在開發 PyTorch 過程中可能出現的意見分歧。有關貢獻、模組維護以及如何將意見分歧上報給核心維護者的更多資訊,請參閱 PyTorch 治理。
設計原則#
原則 1:易用性優先於效能#
這個原則可能會讓人感到意外!正如一位 Hacker News 使用者所寫:“PyTorch 太棒了! […] 雖然我有些困惑。一個機器學習框架怎麼會不痴迷於速度/效能呢?” 參見 Hacker News 對 PyTorch 的討論。
Soumith 在其關於 壯大 PyTorch 社群 的部落格文章中對此進行了深入探討,但從宏觀上講:
PyTorch 的首要目標是易用性
次要目標是實現合理的效能
我們相信,保持靈活性以支援在其抽象之上進行構建的研究人員至關重要。我們無法預知未來的工作負載將是什麼樣子,但我們希望它們首先構建在 PyTorch 之上,而這需要靈活性。
更具體地說,我們以易用性優先的方式運作,並努力避免在沒有清晰權衡的情況下,輕易地進入限制優先的模式(例如,靜態形狀、僅限圖模式)。通常,人們傾向於一開始就施加嚴格的使用者限制,因為這可以簡化實現,但這伴隨著風險:
效能提升可能不足以彌補使用者的不便,因為效能收益不夠引人注目,或者它僅適用於相對狹窄的子問題集。
即使效能收益引人注目,這些限制也可能導致生態系統分裂成不同的限制集,這些限制集很快就會讓使用者難以理解。
我們希望使用者能夠無縫地將他們的 PyTorch 程式碼遷移到不同的硬體和軟體平臺,能夠與不同的庫和框架互操作,並體驗 PyTorch 使用者體驗的全部豐富性,而不是一個最少公分母的子集。
原則 2:簡單優於容易#
這裡,我們借鑑了 Python 禪意:
顯式優於隱式
簡單優於複雜
更簡潔地描述這兩個目標是 簡單優於容易。讓我們從一個例子開始,因為在日常英語中,“簡單”和“容易”經常被互換使用。考慮如何模擬 PyTorch 中的 裝置:
簡單 / 顯式(易於理解、除錯):每個張量都與一個裝置相關聯。使用者明確指定張量裝置移動。需要跨裝置移動的操作會導致錯誤。
容易 / 隱式(易於使用):使用者無需擔心裝置;系統會自行確定全域性最優裝置放置。
在這種特定情況下,並且作為一項通用的設計理念,PyTorch 傾向於暴露簡單且顯式的構建塊,而不是對實踐者來說“容易使用”的 API。簡單的版本對於新的 PyTorch 使用者來說是立即可以理解和除錯的:如果您在程式中實際呼叫需要跨裝置移動的操作時,會收到一個清晰的錯誤。容易的解決方案可能會讓新使用者一開始移動得更快,但除錯這樣的系統可能會很複雜:系統是如何做出決定的?用於插入此類系統的 API 是什麼?其 IR 中物件的表示是什麼?
關於此類設計的經典論證來自 分散式計算筆記(TLDR:不要統一建模具有非常不同效能特徵的資源,細節會暴露)和 端到端原則(TLDR:在堆疊的較低層構建智慧功能可能會阻止在堆疊的較高層構建高效能功能,而且通常不起作用)。例如,我們可以構建運算子級別或全域性裝置移動規則,但確切的選擇並不明顯,並且構建一個可擴充套件的機制會帶來不可避免的複雜性和延遲成本。
這裡需要注意的是,這並不意味著更高級別的“容易”API 沒有價值;例如,在堆疊的較高層支援大型叢集中異構計算的高效張量計算當然是有價值的。相反,我們的意思是,專注於簡單的低階構建塊有助於為易於使用的 API 提供資訊,同時在使用者需要偏離常規路徑時仍能保持良好的體驗。它還為創新和更具主觀性工具的增長留下了空間,其速度我們無法在 PyTorch 核心庫中支援,但最終會從中受益,正如我們的 豐富生態系統 所證明的那樣。換句話說,不一開始就自動化,可以讓我們有可能更快地達到良好的自動化水平。
原則 3:Python 優先,並具備一流的語言互操作性#
這個原則最初是Python 優先
PyTorch 不是一個單體 C++ 框架的 Python 繫結。它是深度整合到 Python 中的。你可以像使用 NumPy、SciPy、scikit-learn 或其他 Python 庫一樣自然地使用它。你可以使用你最喜歡的庫用 Python 本身編寫新的神經網路層,並使用 Cython 和 Numba 等包。我們的目標是在合適的情況下不重複造輪子。
多年來,PyTorch 需要處理的一個問題是 Python 的開銷:我們首先用 C++ 重寫了 autograd 引擎,然後是大部分運算子定義,然後開發了 TorchScript 和 C++ 前端。
儘管如此,在 Python 中工作仍然為我們的使用者提供了最佳體驗:它靈活、熟悉,或許最重要的是,它擁有龐大的科學計算庫和擴充套件生態系統可供使用。這一事實促使了我們最近的一些貢獻,這些貢獻試圖在曲線的 Python 易用性端附近達到帕累托最優點。
TorchDynamo,一個 Python 幀評估工具,能夠以最少的使用者干預來加速現有的 PyTorch eager-mode 程式。
torch_function 和 torch_dispatch 擴充套件點,它們使得可以在 C++ 內部基礎上構建 Python 優先的功能,例如 torch.fx tracer 和 functorch。
這些設計原則並非硬性規定,而是經過艱苦取捨的選擇,它們奠定了 PyTorch 成為如今這款可除錯、可 hack、靈活框架的基礎。隨著我們擁有更多的貢獻者和維護者,我們期待與您一起將這些核心原則應用於我們的庫和生態系統。我們也願意在學習新事物和人工智慧領域不斷發展時不斷完善它們,因為我們知道它將會發展。