• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 數據中心/云端

    NVIDIA 集合通信庫 2.23 促使新的縮放算法和初始化方法的誕生

    NVIDIA 集合通信庫 (NCCL) 可實現針對 NVIDIA GPU 和網絡進行優化的多 GPU 和多節點通信基元。NCCL 是多 GPU 深度學習訓練軟件的核心部分。它可以處理任何類型的 GPU 間通信,無論是通過 PCI、NVLink 還是網絡進行通信。它采用先進的拓撲檢測、優化的通信圖形和調整模型,可在 NVIDIA GPU 平臺上直接獲得開箱即用的最佳性能。

    在本文中,我們將討論 NCCL 2.23 中發布的新功能和修復程序。查看 NVIDIA/nccl Github 存儲庫。

    版本亮點和功能

    NVIDIA Magnum IO NCCL 是一個旨在優化 GPU 間和多節點通信的庫,對于 AI 和高性能計算 (HPC) 應用中的高效并行計算至關重要。此版本的價值在于其新功能:

    • 適用于 ReduceScatter 和 AllGather 的新 PAT 算法 :我們為 AllGather 和 ReduceScatter 引入了基于 Brucks 的 Parallel Aggregated Trees (PAT) 算法,實現了對數縮放。
    • 加速初始化: 改進了初始化性能,包括使用帶內網絡進行引導通信的能力。
    • ncclCommInitRankScalable:一種新的初始化 API,用于使用多個 ncclUniqueId 來加速大規模初始化。
    • 節點內用戶緩沖區注冊 :利用已注冊的用戶緩沖區進行節點內操作。
    • 新的分析器插件 API :用于測量細粒度 NCCL 性能的 API hook。

    以下各節將深入探討新功能的詳細信息:

    • PAT 對數縮放 for ReduceScatter 和 AllGather
    • 新的 ncclCommInitRankScalable API
    • 加速引導操作
    • 節點內用戶緩沖區注冊
    • 新的分析器插件 API
    • 問題修復和次要功能

    PAT 對數縮放 for ReduceScatter 和 AllGather

    PAT 算法是 Bruck 算法的變體,該算法具有對數數量的網絡步長,適用于大規模的小型網絡,隨著規模的增加,網絡傳輸的數量會逐漸增加,從而盡可能減少緩沖需求。它同時適用于 AllGather 和 ReduceScatter。在使用 PAT 時,小到中型的消息大小預計會表現得更好,隨著工作負載的擴展,這種改進也會增加。

    此算法會針對每個秩執行已偏移的二項樹。與遞歸翻倍等類似算法相比,它的優勢在于可在任意數量的秩上運行,且不需要 2 的冪。

    最初,PAT 僅支持每個節點一個 GPU。在每節點一個 GPU 的情況下,ReduceScatter 和 AllGather 對于 大語言模型 (LLM) 訓練非常重要,在這種訓練中,工作流并行性和張量并行性的維度與數據并行性垂直。張量并行維度通常與節點內 NVLink 連接對齊,這意味著其他維度的每個節點僅有一個 GPU。

    請查看我們即將發表的介紹算法細節的論文。

    新的 ncclCommInitRankScalable API?

    此功能添加了新的初始化函數 ncclCommInitRankScalable,以便在通信器創建期間利用多個唯一 ID。這一新增功能避免了初始化期間的多對一通信模式,并提供了更可擴展的初始化性能。

    在創建通信器時,NCCL 需要獲取所有通信器 rank 的地址 (bootstrap step)。為此,NCCL 依賴于所有等級已知的唯一 ID。在 communicator 初始化的 bootstrap 步驟中,每個秩都會將其地址與已知的唯一 ID 進行交換,從而創建一對一通信模式,并在規模上造成重大瓶頸。

    借助 ncclCommInitRankScalable,用戶現在可以自由提供多個唯一 ID,以便在啟動過程中使用。為實現最高增益,NCCL 會將負載分散到多個唯一 ID,從而在所提供的唯一 ID 數量隨通信器大小而擴展時,實現大規模的恒定引導時間。

    這種新 API 需要多個 rank 才能創建唯一 ID。為獲得最佳性能,我們建議在 rank 中盡可能均勻地分配唯一 ID。

    加速引導操作

    在 2.23 版本中,我們改進了初始化代碼的整體性能。我們消除了所需的部分引導群集,并在引導步驟中進行了性能調整。

    現在,您可以使用快速網絡 (IB/RoCE/…) 進行帶外通信,以加速初始化的兩個線性步驟:bootstrap 和 allgather。默認禁用該功能,以避免使用錯誤配置的設備 (在拓撲檢測之前使用 ncclNet 設備)。您可以使用 NCCL_OOB_NET_ENABLE=1 啟用它。

    此外,您可以指定應與 NCCL_OOB_NET_IFNAME 一起使用的接口。默認情況下,NCCL 將使用該網絡上找到的第一個 ncclNet 設備。

    節點內用戶緩沖區注冊(Intranode user buffer registration)

    NCCL 從不要求您作為用戶來注冊和維護任何持久性緩沖區,以便正常運行。這是一項出色的功能,易于使用,但也需要進行性能權衡。如果沒有直接訪問,NCCL 傳輸數據時必須出現更多的控制流和緩沖。與顯式注冊和映射緩沖區相比,這會消耗更多的 GPU 資源,并導致在移動同等數據量時產生更高的開銷。

    建議 NCCL 開發者盡可能使用 ncclCommRegister 注冊緩沖區,以允許 NCCL 使用所有可用的優化。NCCL 團隊一直致力于為已注冊的用戶緩沖區添加更多用例。2.23 版本為 NvLink 和 PCIe P2P 傳輸實現了節點內用戶緩沖區(UB)注冊支持。

    注冊 Intranode UB 的主要好處是避免在對等節點之間產生額外副本。這可減輕內存子系統的壓力,提高 NCCL 通信性能,并改善計算和通信重疊。除 ncclReducencclReduceScatter (將無法受益) 外,支持所有 NCCL 集合和基于 sendrecv 的操作。

    啟用節點內 UB 注冊的方法有兩種。第一種是通過 ncclCommRegister 顯式注冊緩沖區,僅在調用相應的 NCCL 群集時注冊緩沖區。第二種方法是通過 CUDA Graphs 捕獲 NCCL 運算,并在圖形捕獲期間自動注冊所有用戶緩沖區。如需了解更多指南和要求,請參閱 NCCL 文檔

    除了通過 NVLink 和 PCIe 進行節點內通信外,該功能還適用于每個 NVLink 域內的多節點 NVLink(MNNVL)系統。

    新的分析器插件 API?

    隨著 GPU 集群規模的增加,性能異常變得越來越難以檢測和找出根本原因。需要特定于域的監控和診斷工具來收集和分析遙測數據,同時盡可能減少運行作業的用度。NCCL 分析器插件接口旨在解決這些問題。該界面設計還可讓 DL 框架分析器如 PyTorch Kineto 等輕松采用。

    新的 NCCL_PROFILER_PLUGIN 環境變量控制 profiler 插件的加載和初始化,與加載和初始化其他 NCCL 插件的方式相同。加載后,profiler 插件可以通過設置 NCCL 在初始化期間向 profiler 公開的事件激活掩碼來啟用 NCCL 事件分析。事件激活掩碼是一個 32 位整數,其中每個位都表示 NCCL profiler 事件。目前,NCCL 支持以下事件:

    • ncclProfileGroup (bit-0):群組事件
    • ncclProfileColl (bit-1):集合事件
    • ncclProfileP2p (bit-2):點對點事件
    • ncclProfileProxyOp (bit-3):代理進度通道事件
    • ncclProfileProxyStep (bit-4):代理進度步驟事件
    • ncclProfileProxyCtrl (bit-5):代理進度內部狀態事件

    NCCL 以分層形式表示事件。例如,collectives 可以分組在一起,而 proxy 操作可協助 GPU 跨可用網絡通信通道進行單個數據塊的點對點傳輸。因此,NCCL 會將相應的事件呈現給 profiler,并保留此關系。NCCL 事件層次結構的示意圖如下所示:

    ncclProfileGroup
    |
    +- ncclProfileColl
    |  |
    |  +- ncclProfileProxyOp
    |   |
    |   +- ncclProfileProxyStep
    |
    +- ncclProfileP2p
       |
       +- ncclProfileProxyOp
        |
        +- ncclProfileProxyStep
      
    ncclProfileProxyCtrl

    這種分層表示使 profiler plugins 能夠以更有意義和更易于理解的形式向用戶呈現 events。

    NCCL 還在 ext-profiler/example 目錄中提供了分析器插件示例,可用作開發第三方分析器插件的模板。

    分析器插件接口總共定義了以下五個函數回調:

    ncclResult_t (*init)(
      void** context,
      int* eActivationMask);
      
    ncclResult_t (*startEvent)(
      void* context,
      void** eHandle,
      ncclProfilerEventDescr_t* eDescr);
      
    ncclResult_t (*stopEvent)(
      void* eHandle);
      
    ncclResult_t (*recordEventState)(
      void* eHandle,
      ncclProfilerEventState_t eState,
      NcclProfilerEventStateArgs_t* eStateArgs);
      
    ncclResult_t (*finalize)(void* context);

    分析器 init 函數接收事件激活掩碼指針,并將不透明上下文對象返回至 NCCL。上下文在分析器實例之間提供隔離,而分析器則使用事件激活掩碼來通知 NCCL 應分析哪些事件;例如,設置 *eActivationMask = ncclProfileColl | ncclProfileProxyOp。

    分析器 startEvent 函數采用分析器上下文和事件描述符。分析器使用描述符信息來分配新的事件對象并對其進行初始化。之后,分析器會返回一個不透明的句柄,NCCL 可使用該句柄對事件執行進一步運算,例如,記錄狀態更新。

    分析器 stopEvent 函數獲取事件句柄并將事件標記為已完成。之后,事件句柄將無法再使用 (分析器可能會在內部回收相應的對象以用于未來的事件)。

    分析器 recordEventState 函數接收事件句柄、事件狀態和 (可選) 事件狀態參數對象。借助此函數,分析器可以更新可以通過 NCCL 中不同狀態過渡的事件。其中一個示例是代理事件,在傳輸數據時,代理需要與 GPU 和網絡進行協調,并在此過程中從一種狀態移動到另一種狀態。

    分析器 finalize 函數獲取分析器上下文,并釋放與之關聯的所有資源。

    問題修復和次要功能?

    NCCL 2.23 提供以下額外更新:

    • 異步圖分配會在圖分配期間異步調用 cudaMalloccudaMemcpy,顯著加快圖形捕獲速度。
    • 使用致命的 IB 異步事件來停止網絡操作有助于捕獲 NCCL 中的鏈路錯誤和其他致命的異步事件。
    • 當每個節點使用兩個以上的 GPU 時,在 AMD CPU 上將 P2P 級別設置為 PXB。
    • 改進 init 日志以報告實際的 NCCL 功能:通知用戶 NCCL 是否執行 ncclCommInitRankncclCommSplit
    • 添加 NCCL_CONF_FILE 變量
    • 將默認 IB 超時時間從 18 增加到 20
    • 為 NVIDIA peermem 添加新的檢查項。適用于最近的 Linux 內核。
    • 修復舊的性能回歸。當混合大小操作時。
    • 修復了 NUMA ID 等于 -1 時崩潰的問題。
    • 修復 NCCL_CROSS_NIC 設置為 1 時的樹形圖搜索問題。

    總結?

    NVIDIA NCCL 2.23 為優化對 AI 和 HPC 應用至關重要的 GPU 間和多節點通信引入了新功能和改進。主要增強功能包括新的 PAT 算法、大規模加速初始化、節點內用戶緩沖區注冊以及新的 profiler 插件 API。

    如需了解有關先前版本的更多信息,請參閱使用 NVIDIA Collective Communications Library 2.22 的內存效率、更快的初始化和成本估算。

    詳細了解 Magnum IO NCCL

    ?

    +1

    標簽

    人人超碰97caoporen国产