編輯:alan
在新的一年裡,PyTorch 也迎來了重大更新!
繼 2 發布之後在版本 1 之後,全球 521 名開發人員為最新版本的 PyTorch 2 貢獻了 3,628 次提交版本 2。
新版本整合了 FlashAttention-2,與之前的版本相比,效能提高了約 2 倍。
pytorch 2.2 還引入了乙個新的 TorchInductor 高階擴充套件,稱為 Aotinductor,旨在為非 Python 伺服器端編譯和部署 PyTorch 程式。
火炬。 在 pytorch 中分布式支援乙個名為 Device Mesh 的新抽象,用於初始化和表示 ProcessGroups。
另外,pytorch 22提供標準化、可配置的日誌記錄機制,——火炬日誌。
pytorch 2.2.也在火炬上Compile 進行了許多改進,包括改進了對編譯優化器的支援,以及火炬電感融合和布局優化。
最後,值得注意的是,PyTorch 將放棄對 macOS x86、PyTorch 2 的支援2.X 是支援 macOS X64 的最後乙個版本。
pytorch 2.2 個新功能
首先,請注意,如果您從原始碼構建 pytorch 22. 海灣合作委員會 94 或更高版本,PyTorch 庫已從 C++14 遷移到 C++ 17。
FlashAttention-2 通過優化 GPU 上不同執行緒塊和扭曲之間的工作分割槽,解決了使用率低或不必要的共享記憶體讀寫問題。
FlashAttention-2 調整了演算法以減少非 matmul 計算量,同時提高了注意力計算的並行性(即使是單個標頭也可以跨不同的執行緒塊以增加使用率),並且在每個執行緒塊中,warp 之間的工作分配都經過優化,以減少通過共享記憶體的通訊。
pytorch 2.2 將 FlashAttention 核心更新為 v2,但需要注意的是,之前的 Flash Attention 核心有 Windows 實現,Windows 使用者可以強制使用 SDP 核心,並且只啟用 Flash Attention 的上下文管理器。
而在 22、如果必須使用SDP核心上下文管理器,請使用記憶體效率或數學核心(在Windows上)。
在閃光燈的加持下-2,火炬nn.functional.Scaled Dot Product Attention 的速度提高了約 2 倍,達到 A100 GPU 理論峰值的 50%-73%。
Aotinductor 是 Torchinductor 的擴充套件,用於處理匯出的 PyTorch 模型、優化它們以及生成共享庫以及其他相關工件。
這些編譯的專案可以部署在非 Python 環境中,通常用於伺服器端推理。
以下示例演示如何呼叫 AOT Compile 將模型轉換為共享庫。
Aotinductor 支援與 Inductor 相同的後端,包括 CUDA、ROCM 和 CPU。
pytorch 2.2 提供了標準化的、可配置的日誌記錄機制,可用於分析各種子系統的狀態,例如編譯和分布式操作。
可以通過 torch logs 環境變數啟用日誌記錄。 例如,通過在命令列中修改環境變數:
將 torchdynamo 的日誌級別設定為日誌記錄錯誤,將 TorchInductor 的 log 級別設定為 loggingdebug。
當然,它也可以以 API 的形式使用 **:
pytorch 2.2 引入了一種新的抽象,用於表示分布式並行中涉及的程序組,稱為 torchdistributed.device_mesh。
為分布式訓練設定分布式通訊器 (NCCL) 是一件繁瑣的事情。 使用者需要編寫具有不同並行度的工作負載,並針對每個並行度手動設定和管理 NCCL 通訊器 (ProcessGroup)。
此過程可能很複雜且容易出錯。 DeviceMesh 可以簡化此過程並使其更易於管理。
DeviceMesh 是用於管理程序組的更高階別的抽象。 它允許使用者毫不費力地建立節點間和節點內程序組,而不必擔心如何正確設定不同子程序組的層次結構。
例如,陣列的乙個維度可以表示 FSDP 中的資料並行性,而另乙個維度可以表示 FSDP 中的張量並行性。
使用者還可以通過DeviceMesh輕鬆管理底層程序組,實現多維並行。
DeviceMesh 在處理多維並行性(如 3D 並行性)時非常有用。 如上圖所示,當您的並行解決方案需要在每個主機之間和每個主機內進行通訊時,您可以建立乙個 2D 網格,用於連線每個主機中的裝置,並在同構設定中將每個裝置連線到其他主機上的對應裝置。
在 Init Device Mesh() 的幫助下,我們只需兩行即可完成上述 2D 設定:
如果我們不使用 devicemesh,我們可能需要編寫以下一堆 **:
當然,如果需要,我們仍然可以訪問底層的 processgroup:if need
可能有以下幾種:
編譯優化器提高了所有基準測試的效能:HuggingFace +18%、Torchbench +19%、TIMM +8% E2E;用於多張量優化器編譯的電感器中缺少的主要功能是 foreach 運算元的高效編碼生成。編譯優化器增加了對 cudagraph 的支援;
對測試套件中的所有模型進行平均,每個測試套件的平均基準編譯時間增加了約 40 秒; 正在進行的優化可能會將其縮短到 30 秒以內。
在排程器中,將去中心化過程中註冊的緩衝區列表壓縮到 ForeachKernelSchedulerNodes(FusedSchedulerNode 的子類)中。
為了檢查融合是否合法,每個內部排程節點執行的寫入操作必須與使用排程節點位於同一列表索引的讀取操作匹配。
此外,正常的垂直收斂規則必須允許在消費者和生產者排程器節點列表的每個索引處進行收斂。
如果滿足這些條件,ForeachKernelSchedulerNode 將垂直融合到 ForeachKernelSchedulerNode 中,其中每個列表上的相應點操作將被融合。
通過實現這種融合,可以將一系列 foreach 操作融合到單個核心中,從而實現多張量優化器的完全融合。
TorchInductor 新增了許多效能優化,包括對 Torch 的支援Concat 的水平融合支援、改進的卷積布局優化以及改進的縮放點產品注意力模式匹配。
pytorch 2.2 還包括對 ARClCloud64 的許多效能增強,包括對 mkldnn 權重預打包的支援、改進的 iDeep 基元快取,以及通過對 Onednn 的固定格式核心改進來提高推理速度。
引用: