精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

NVSHMEM 深度解析:初始化流程與核心機制

發布于 2025-7-11 07:30
瀏覽
0收藏

?一、背景

在此前的內容中,筆者曾介紹過 DeepSeek 的 DeepEP、字節跳動的 Flux 和 Tilelink 等系統,這些系統在底層通信實現中均依賴于 NVIDIA 的 NVSHMEM 庫。事實上,字節跳動后續的諸如 Comet、Triton-distributed,以及其他針對細粒度計算與通信重疊(Overlap)優化的工作,也都廣泛使用了 NVSHMEM。

本文將深入剖析 NVSHMEM 的初始化流程及其核心概念,以便從開發者視角理解其機制,為后續的定制化改造和工程實踐打下基礎。?

也可以參考 NVSHMEM 的官方文檔:NVIDIA OpenSHMEM Library (NVSHMEM) Documentation [1]

二、引言

2.1 DeepEP

DeepEP 是 DeepSeek 開源的專為 MoE 和專家并行(Expert Parallelism, EP)設計的通信庫。提供了一系列優化的通信 Kernel,實現了以下能力:

  • 高度優化的 All2All 通信。
  • 同時支持不同的通信類型:

節點內(intra-node):使用 NVLink + NVSwitch 通信。

節點間(inter-node):使用 RDMA 通信。

  • 針對不同場景的 Kernel:
  • 常規(高吞吐) Kernel(Normal Kernel):針對 Training 和 Inference Prefill。節點內 NVLink + 節點間 RDMA 通信。
  • 低時延 Kernel(Low-Latency Kernel):針對 Inference Decoding。使用純 RDMA 通信來最小化時延。
  • 原生支持 FP8,減少數據傳輸需求,相比 FP16 通信量減半。
  • 靈活的 GPU 資源(SM)控制,支持計算和通信的 Overlap。

代碼庫:DeepEP: an efficient expert-parallel communication library [2]

2.2 NVSHMEM 簡介

NVSHMEM 是 NVIDIA 開發的一種并行編程接口,基于 OpenSHMEM 標準,專為 GPU 集群提供高效且可擴展的通信。通過創建一個跨多個 GPU 內存的全局地址空間,實現細粒度的 GPU 發起的數據傳輸和同步操作,顯著減少了 CPU 的干預,從而降低同步開銷并提升性能。

NVSHMEM 通常被視為 MPI(Message-Passing Interface) 的替代方案,特別是在 GPU 集群通信中。與 MPI 不同,NVSHMEM 通過 GPU 發起操作減少了 CPU-GPU 同步開銷。雖然它可以與 MPI 結合使用(如在 Host 端通信中),但其核心優勢在于 GPU 間的直接通信。相比 NCCL,NVSHMEM 更專注于單邊通信,而 NCCL 則更適合集合通信,具體使用場景取決于應用程序的需求。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

安裝指南和源代碼可以參考:NVSHMEM Installation Guide [3]

2.3 IBRC & IBGDA

InfiniBand GPUDirect Async(IBGDA)是 NVSHMEM 中的一種新的通信方法,構建在 GPUDirect Async 技術之上。IBGDA 在 NVSHMEM 2.6.0 中引入,并在 NVSHMEM 2.7.0 和 2.8.0 中得到顯著改進。它可以使 GPU 繞過 CPU 進行節點間 NVSHMEM 通信,而無需對現有應用程序進行修改,進而使得 NVSHMEM 應用程序的吞吐和擴展得到顯著改進。

如下圖所示,在引入 IBGDA 之前,NVSHMEM InfiniBand Reliable Connection (IBRC) 傳輸使用 CPU 上的代理線程來管理通信(PS:也就是數據傳輸不同用過主機內存,但是很多控制鏈路還在 CPU 上)。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

與 IBRC 相比,IBGDA 利用 GPUDirect Async–Kernel-Initiated (GPUDirect Async–KI) ,使得 GPU SM 能夠直接與 NIC 交互。如下圖所示為其關鍵步驟,可以看出,IBGDA 將 CPU 上的通信控制鏈路移到 GPU 上,WQ 和 DBR 緩沖區也被移動到 GPU 內存。使用 IBGDA 時,GPU 和 NIC 直接交換通信所需信息,以提高 SM 訪問效率,同時通過 GPUDirect RDMA 保留 NIC 的訪問。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

因此,IBGDA 非常適合控制鏈路開銷比較大的小消息的傳輸。?

三、NVSHMEM 關鍵概念

3.1 Processing Element(PE)

NVSHMEM 程序由多個進程組成,每個進程映射到一個 GPU 上,稱為一個PE。所有 PE 運行相同的程序,在啟動時通過 nvshmem_init 或擴展接口 nvshmemx_init_attr 集體初始化環境。

初始化過程中,每個 PE 都會分配到唯一的 ID(可以使用 nvshmem_my_pe() 獲取本 PE 的 ID),并且同步總的 PE 數目(可以使用 nvshmem_n_pes() 獲取)。假設有 2 臺 8 卡 H100 的機器,則啟動后會有 16 個 PE,對應的 mype 為 [0, 1, 2, …, 15],對應的 npes 為 16。

PE 之間通過從 GPU 內存中的對稱堆(symmetric heap)分配的對稱內存進行通信和數據共享。此類內存需使用 CPU 端的 NVSHMEM 分配 API 進行分配。采用其他任何方法分配的內存均被視為分配 PE 的私有內存,其他 PE 無法訪問。NVSHMEM 使用 CUDA 的統一虛擬地址 (UVA) 和 CUDA IPC 機制映射這些對稱緩沖區,以實現 GPU 之間的高速訪問。在多 GPU 或分布式場景中,GPU 可直接發起通信請求,NVSHMEM 后端負責將這種 GPU 觸發的請求通過網絡傳輸到目標 PE。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

需要注意,從 2.4.1 版開始,NVSHMEM 支持一個 GPU 上運行多個 PE 的情形(通過 CUDA 多進程服務 MPS 或時間共享方式),但這會對同步和集合通信的使用有額外限制。

3.2 Team 管理

NVSHMEM 支持在全局 PE 集合之外定義邏輯 Team(nvshmem_team_t),以在一部分 PE 上執行集合通信操作。默認情況下,NVSHMEM_TEAM_WORLD 表示包含所有 PE 的“全局 Team”,PE 在該 Team 中的編號即為 nvshmem_my_pe() 返回的值。

用戶可以通過“split”現有 Team 來創建新 Team(如 nvshmem_team_split_strided() 等),也可以使用擴展接口 nvshmemx_team_get_uniqueid 和 nvshmemx_team_init 任意指定新 Team 成員。后者需要選定一個 Root PE 來生成 Team 的唯一 ID,并將此 ID 分發給 Team 內所有 PE。創建 Team 時,每個 PE 提供在新 Team 中的編號(pe_idx_in_team),新 Team 成員按照該編號 0 到 N–1 重新編號。

3.3 Transport 機制

NVSHMEM 支持多種傳輸通道來實現 GPU 間通信。

  • 對于節點內通信,NVSHMEM 主要利用 CUDA 級聯技術(比如 NVLink/PCIe 上的 P2P 訪問),使得一個節點上不同進程的 GPU 可以直接通過顯存共享或復制互相訪問。
  • 對于節點間通信,NVSHMEM 默認使用 IBRC,并可選用其他協議如 UCX 或 Libfabric。具體選擇由環境變量 NVSHMEM_REMOTE_TRANSPORT 控制,允許設置為 "ibrc"(默認)、"ucx"、"libfabric"、"ibdevx" 等。

NVSHMEM 對 GPU 內存的處理邏輯包括:如果目標 PE 在本節點,優先使用 CUDA IPC 或 P2P 拷貝;如果在遠端,則調用網絡傳輸接口,通過已經注冊的 GPU 映射區完成遠程寫入/讀取。所有 GPU 通信都在 NVSHMEM 的對稱地址空間模型下進行:當用戶調用 RMA 操作時,內部先將對稱地址轉換為物理地址,然后通過上述通道發起數據傳輸。

默認情況下,NVSHMEM 借助 CUDA 的 VMM 來映射 PE 間 GPU 對稱地址。用戶可通過 NVSHMEM_DISABLE_CUDA_VMM 禁用這一機制。對稱緩沖區會通過 CUDA IPC 注冊到各進程地址空間,從而在同一節點上實現 ZeroCopy。此外,NVSHMEM 通過 Mellanox OFED、nv_peer_mem 驅動和 GDRCopy 庫支持 GPU 直連 RDMA,將 GPU 顯存注冊到網卡,可直接發起 RDMA 操作。也可以使用環境變量  NVSHMEM_DISABLE_GDRCOPY 來禁止在 IBRC 下使用 GDRCopy。

對于 GPU 和 NIC 的綁定,NVSHMEM 提供自動映射和手動配置的方式。默認情況下,各 PE 會分配到“最近的” NIC,但可通過設置 NVSHMEM_ENABLE_NIC_PE_MAPPING=1 使系統按照輪詢或用戶指定的方式綁定。進一步可用 NVSHMEM_HCA_LIST 和 NVSHMEM_HCA_PE_MAPPING 明確指定使用哪些 HCA 設備 Port,以及每個 Port 分配給哪些 PE。所有這些機制確保 GPU 的對稱內存可以高效地通過 NIC 通信。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

3.4 集合通信

在 NVSHMEM 程序中,PE 通過兩種方式進行通信:

  • 一種是點對點通信,需明確指定目標 PE 的編號。
  • 另一種是集合通信,它們作用于一組 PE 之上。

基于 Team 的集合通信,通過 Team 句柄參數確定參與通信的 PE,并利用 Team 對象封裝的資源進行操作。

如果未指定 Team 參數,則默認作用于所有 PE。

3.5 Bootstrap

NVSHMEM 的 Bootstrap 模塊負責在多進程環境中引導通信和 PE 管理。支持多種啟動方式:默認通過進程管理器的 PMI 接口交互式啟動,也可以直接利用現有的 MPI 通信域、OpenSHMEM 環境或者 Plugin 模式。可以通過 NVSHMEM_BOOTSTRAP 環境變量來指定:

  • PMI:可以選擇不同的版本,比如 PMI-1、PMI-2 或 PMIx。
  • MPI:用戶可用 nvshmemx_init_attr 指定 NVSHMEMX_INIT_WITH_MPI_COMM 標志以傳入一個已有的 MPI_Comm 作為全局 Team。
  • OpenSHMEM:同樣可以用 NVSHMEMX_INIT_WITH_SHMEM 指示在 OpenSHMEM 程序內啟動。
  • UID:在沒有 MPI/SHMEM 的場景下,還可以采用網絡唯一 ID (UID) 方式,調用 nvshmemx_get_uniqueid 在一個 PE 上生成 UID,并通過用戶定義的機制(比如環境變量 NVSHMEM_BOOTSTRAP_UID_SESSION_ID)分發給各 PE,然后各 PE 在 nvshmemx_set_attr_uniqueid_args 中設置該 UID、自己的 PE 編號和總 PE 數,再集體調用 nvshmemx_init_attr。這種 UID 模式利用 TCP 套接字自動交換初始化信息,無需依賴 MPI。也可以像 NCCL 一樣配合 NVSHMEM_BOOTSTRAP_UID_SOCK_IFNAME 和 NVSHMEM_BOOTSTRAP_UID_SOCK_FAMILY 使用。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

四、DeepEP 初始化

4.1 概覽

如下圖所示,在 DeepEP 中會調用 NVSHMEM 的如下幾個接口完成初始化(后續會詳細解釋這些函數的作用):

  • nvshmemx_set_attr_uniqueid_args()。
  • nvshmemx_init_attr()。
  • nvshmem_team_split_strided()。
  • nvshmem_barrier_all()。
  • nvshmem_my_pe()。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

而 DeepEP 中在 Buffer 的 sync 中會調用該 init() 接口,并且調用之前會完成 rank 和 num_ranks 的計算。這里會針對上述的“高吞吐”和“低時延”模式進行不同的處理。假設 2 臺機器,各 8 個 GPU,則與 PyTorch 對應的 rank 為 [0, 15],num_ranks 為 16。

  • 高吞吐模式:將上述 rank 轉為 rdma_rank([0, 1]) 和 nvl_rank;num_ranks 轉為 num_rdma_ranks(為 2,其中 NUM_MAX_NVL_PEERS  為 8)。并且使用 rdma_rank 和 num_rdma_ranks 初始化。(PS:節點內使用 NVLink)
  • 低時延模式:直接使用 rank 和 num_ranks。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

PS:DeepEP 針對高吞吐模式的特殊邏輯導致其與 NVSHMEM 的拓撲映射方法 NVSHMEM_HCA_PE_MAPPING 不兼容,后續會具體介紹。

4.2 nvshmemx_set_attr_uniqueid_args

如下圖所示(nvshemem_src/src/host/init/init.cu),nvshmemx_set_attr_uniqueid_args 其實就是設置了 id、myrank 和 nranks:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

PS:如果是高吞吐模式,這里的 myrank 和 nranks 已經不再等價于 PyTorch 里的 rank 和 num_ranks。

4.3 nvshmemx_init_attr

如下圖所示(nvshemem_src/src/include/host/nvshmemx_api.h),nvshmemx_init_attr 實際是調用了 nvshmemi_init_thread:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

4.4 nvshmem_team_split_strided

如果是 low_latency_mode,并且 num_ranks > NUM_MAX_NVL_PEERS(8),也就是多機時才會執行 nvshmem_team_split_strided,將 NVSHMEM 的 team 劃分為多組 sub-RDMA team,這樣可以實現每組內部的高效通信,同時保證整體的可擴展性和性能。

4.5 nvshmem_barrier_all

如下圖所示(nvshmem_src/src/host/coll/barrier/barrier.cpp),使用 nvshmem_barrier_all 進行全局同步。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

4.6 nvshmem_my_pe

如下圖所示(nvshmem_src/src/host/init/query_host.cpp),用 nvshmem_my_pe 返回當前的 pe: 

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

五、nvshmemi_init_thread

5.1 概覽

nvshmemi_init_thread(位于 nvshmem_src\src\device\init\init_device.cu) 是 NVSHMEM 初始化流程中的關鍵函數,主要作用是初始化運行環境,確保后續在 GPU 上能夠安全、高效地進行 NVSHMEM 通信和同步操作。其主要功能和步驟如下:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

nvshmemid_hostlib_init_attr:負責完成 NVSHMEM Host 端初始化流程的主控函數。

nvshmemid_init_status:Host 端初始化狀態檢查,如果狀態大于 NVSHMEM_STATUS_IS_BOOTSTRAPPED,說明 Host 端初始化已完成,可以安全地初始化 Device 端狀態。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

_nvshmemi_init_device_only_state:進一步設置 Device 端的集合通信等內部狀態。主要是調用 nvshmemi_setup_collective_launch。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區


cudaGetDevice:調用 cudaGetDevice 獲取當前 GPU 的 device id,存入 

nvshmemi_device_only_state.cuda_device_id,便于后續 Device 端操作定位到正確的 GPU。

5.2 nvshmemid_hostlib_init_attr

包括版本兼容性檢查、bootstrap 啟動、全局和本地狀態初始化、設備狀態注冊、以及多種初始化的管理。包括以下幾個關鍵步驟。

5.2.1 IBGDA 狀態初始化

如果啟用 IBGDA,則提前設置一下狀態信息:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

如下圖所示(nvshmem_src/src/host/init/init.cu):

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

5.2.2 nvshmemi_options_init 環境變量初始化

如下圖所示:該函數的作用是批量初始化 NVSHMEM 的所有環境變量配置項,并將結果寫入 options 結構體。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

5.2.3 nvshmemi_bootstrap_preinit 預初始化

如下圖所示(位于 nvshmem_src/src/host/init/init.cu),實際調用 bootstrap_preinit:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

bootstrap_preinit 核心就是通過 dlopen 提前加載動態庫,當然,這里主要是 UID 模式的動態庫:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

5.2.4 nvshmemi_bootstrap 初始化

如下圖所示(位于 nvshmem_src/src/host/init/init.cu),nvshmemi_bootstrap 負責完成 NVSHMEM 啟動階段的“進程組通信環境”初始化。通過底層 bootstrap 機制(如 MPI、UID、SHMEM 等)建立全局進程組信息,確定每個 PE 的全局編號、節點內編號、節點內 PE 數量等,并進行一致性檢查,為后續通信和資源分配打下基礎。

  • bootstrap_set_bootattr:根據 flags 和 attr 構造 bootstrap 所需的屬性結構體,會針對 MPI、SHMEM、UID、PMI、PLUGIN 等不同 mode 對應處理。
  • bootstrap_init:傳入 flags、屬性和 nvshmemi_boot_handle,由底層 Plugin/機制完成通信環境初始化(根據 MPI、SHMEM、UID、PMI、PLUGIN 等不同 mode 調用不同的初始化 bootstrap_loader_init),填充 nvshmemi_boot_handle(包括 allgather、barrier、pg_rank、pg_size 等回調和參數)。
  • 計算全局和節點內編號:

通過 nvshmemi_boot_handle.pg_rank 和 pg_size 獲取本進程全局編號和總進程數。

通過 getHostHash 獲取本節點唯一標識(host hash)。

使用 allgather 收集所有進程的 host hash,統計每個節點上的 PE 數量(npes_node)和本 PE 在節點內的編號(mype_node)。

將 mype_node 和 npes_node 寫入 nvshmemi_boot_handle。

  • 檢查所有節點 PE 數一致性:遍歷所有 host hash,確保每個節點上的 PE 數量一致,否則報錯退出。
  • 設置 PE 分布類型:檢查 PE 分布是否為 block 或 round robin,設置 nvshmemi_pe_dist,用于后續通信優化。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

5.2.5 nvshmemi_try_common_init 初始化

實際上是調用 nvshmemi_common_init,這是最核心的初始化操作,后面會詳細介紹:

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

5.3 nvshmemi_setup_collective_launch

nvshmemi_setup_collective_launch 是 NVSHMEM  Device 端集合通信相關的初始化函數。它的主要作用是為后續在 GPU 上安全、高效地發起通信 kernel 啟動做準備,確保相關 CUDA 資源和屬性已正確配置。主要包括以下幾個部分:

  • 檢查當前 GPU 的 SM 數量。
  • 檢查當前 GPU 是否支持 Cooperative Launch。
  • 檢查 CUDA Stream 優先級范圍。
  • 創建一個最高優先級的非阻塞 CUDA Stream。
  • 創建兩個 CUDA Event,用于同步 Collective  Launch 的起止。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

六、nvshmemi_common_init

6.1 概覽

nvshmemi_common_init 的主要作用是完成 NVSHMEM 運行時的核心初始化工作。負責初始化和配置 NVSHMEM 的所有關鍵組件,使得后續的通信和內存管理功能可以正常工作。其主要任務包括:

  • CUDA 相關初始化:加載 CUDA 符號表、初始化 CUDA 庫、查詢 CUDA 驅動版本,決定對稱堆類型(如 SYSMEM/VIDMEM),并獲取 CUDA 上下文和流優先級等。
  • Rail 優化設置:如果啟動軌道優化,則檢查是否滿足軌道優化的支持,并完成相關設置。
  • 對稱堆初始化:根據配置和硬件能力,初始化對稱堆,為后續的通信和內存操作分配統一的內存空間。
  • 設備狀態注冊與更新:注冊和更新設備狀態指針,確保主機和設備之間的狀態同步。
  • 通信與拓撲初始化:初始化 transport,構建 transport 映射表,建立與其他 PE 的連接。
  • CUDA 句柄和 Event 初始化:為每個 peer 分配 CUDA stream 和 event,設置相關句柄。
  • 集合通信和 Team 初始化:初始化 CPU 端的集合通信,設置 NVSHMEM 的 Team 結構,支持多種 Team 劃分和同步。
  • 每個 GPU 的多 PE(MPG)支持:檢測和配置多 PE 共享同一 GPU 的場景,包括 MPS 相關的共享內存和事件管理。
  • 性能與兼容性檢查:檢測如 NVLS、64-bit stream memops 等高級特性支持,并給出性能建議或警告。
  • 全局同步:在關鍵階段通過 barrier 保證所有 PE 的同步,確保初始化過程一致。
  • 最終狀態標記:標記設備狀態為已初始化,確保后續 API 調用安全。

6.2 nvshmemi_coll_common_cpu_init

初始化 NVSHMEM Host 端的集合通信相關環境參數,并根據環境和配置決定是否啟用 NCCL 作為底層通信庫,如下圖所示(位于 nvshmem_src\src\host\coll\cpu_coll.cpp)。

  • nvshmemi_coll_common_cpu_read_env:將環境變量和配置項寫入全局結構體(如 barrier、reduce、broadcast 等算法和閾值參數)。
  • NCCL 相關支持邏輯(編譯時需要加上 NVSHMEM_USE_NCCL)

默認嘗試啟用 NCCL,如果設置了 DISABLE_NCCL 選項,則禁用 NCCL,直接返回。

NCCL 不支持 MPG,如果設置 MPG 要禁用 NCCL。

加載 NCCL 動態庫(“libnccl.so.2”)。

檢查 NCCL 版本和兼容性。

通過 dlsym 加載 NCCL 所需的符號,并填充到 nccl_ftable。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

6.3 nvshmemi_transport_init

初始化 NVSHMEM 支持的所有 Host 端 Transport 模塊,包括 P2P、本地和遠程網絡通信插件(如 IBRC、UCX、Libfabric、IBDEVX、IBGDA 等),為后續 PE 間數據傳輸和同步提供底層支撐(位于 nvshmem_src\src\host\transport\transport.cpp)。包括如下關鍵步驟:

  • 分配 transport 結構體數組:

若 state->transports 為空,則分配一個大小為 NVSHMEM_TRANSPORT_COUNT(6) 的數組,每個元素對應一種 Transport。

  • 初始化 P2P 通信(僅用于同一節點不同 GPU):
  • 如果沒有禁用 P2P,則初始化本地內存緩存,并調用 nvshmemt_p2p_init 初始化 P2P 通信。
  • 初始化成功則填充相關字段(如 boot_handle、heap_base、cap、index、granularity 等),并將其加入 transports 列表。
  • 初始化遠程通信插件(用于不同節點):
  • 支持多種插件(IBRC、UCX、IBDEVX、Libfabric),通過宏控制編譯。
  • 判斷環境變量 REMOTE_TRANSPORT,決定是否跳過某個插件。
  • 若選擇某插件,拼接動態庫(如 nvshmem_transport_ucx.so.1),然后進行相應初始化。
  • 動態加載并初始化遠程通信插件:
  • 使用 dlopen 加載對應的動態庫,并使用 dlsym 獲取初始化函數指針(nvshmemt_init)。
  • 初始化本地緩存,調用插件的初始化函數,填充 transport 結構體相關字段(heap_base、cap、index、my_pe、n_pes、cache_handle 等)。
  • IBGDA 特殊支持(需要打開編譯選項 NVSHMEM_IBRC_SUPPORT):
  • 如果環境變量啟用 IBGDA,則單獨加載并初始化 IBGDA 插件,流程與上面類似。
  • 初始化成功后,調用 nvshmemi_ibgda_get_device_state 獲取設備狀態,并設置全局標志。
  • 檢查至少有一個 transport 初始化成功。
  • 記錄已初始化的 transport 數量:
  • 將成功初始化的 transport 數量寫入 state->num_initialized_transports。

PS:IBRC、UCX、IBDEVX、Libfabric 只會選擇其中的一個,主要是因為順序檢查:代碼會按照 IBRC -> UCX -> IBDEVX -> LIBFABRIC 的順序,逐一檢查環境變量,只要檢查到一個就會跳轉到 transport_init,從而跳過后續的幾個。

6.4 nvshmemi_build_transport_map

為每個 PE 建立一張“可達性”與“可用 Transport”的映射表。檢測本地 PE 與所有其他 PE 之間,哪些 Transport 能夠訪問對方,并將結果記錄下來,最終形成全局的 Transport 映射表(state->transport_map),為后續高效通信做準備(位于 nvshmem_src/nvshmem/src/host/topo/topo.cpp)。主要流程包括:

分配映射表內存:

  • state->transport_map:大小為 npes × npes,存儲所有 PE 間的 Transport 可達性信息。
  • local_map:大小為 npes,存儲本地 PE 到所有其他 PE 的可達性信息。
  • state->transport_bitmap:用來記錄本 PE 能用到的所有 Transport 類型(每一位代表一種 Transport)。

檢查每個 PE 的可達性:

  • 外層循環遍歷所有 PE(i),即本地 PE 需要與哪些遠端 PE 通信。
  • 內層循環遍歷所有已初始化的 transport(j),判斷本地通過 transport j 能否訪問到 PE i。如果能訪問,則在 local_map[i] 的相應 bit 位置標記,并更新 state->transport_bitmap。同時記錄每個 transport 對每個 PE 的能力(state->transports[j]->cap[i])。

NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

匯總所有 PE 的可達性信息:通過 allgather,將每個 PE 的 local_map 匯總到全局的 state->transport_map,這樣每個進程都能知道所有 PE 之間的可達性和可用 transport。

6.5 nvshmemi_setup_connections

6.5.1 概覽

為每個可用的 transport 在本 PE 上選擇合適的底層設備(如 NIC 等),并建立與其他 PE 的通信端點(endpoint)連接。這是 NVSHMEM 初始化流程中,真正“連通”各個進程間網絡通信的關鍵步驟(位于 nvshmem_src/src/host/transport/transport.cpp)。關鍵步驟如下圖所示:

遍歷所有已初始化的 Transport:

  • 只處理 state->transport_bitmap 標記為可用的 Transport。

計算每個 PE 可用的設備數:

  • tcurr->n_devices 是當前 Host 上的 NIC 數,state->npes_node 是當前 Host 上的 PE 數。
  • 平均分配,并且保證每個 PE 至少有 1 個 NIC。假設 8 個 GPU,2 個 NIC,則會有 4 個 GPU 共享 1 個 NIC。

選擇本 PE 要使用的 NIC:

  • 如果 Transport 只有一個 NIC,則直接使用。
  • 如果用戶打開了 ENABLE_NIC_PE_MAPPING 環境變量,則使用輪詢分配方式。
  • 否則,調用 nvshmemi_get_devices_by_distance,根據 PCIe 拓撲距離等信息,智能選擇最優的設備分配給本 PE。

檢查設備分配有效性:

  • 如果 transport 有設備但沒選到任何設備,報錯退出。
  • 建立 Endpoint 連接:

    調用 transport 的 connect_endpoints 回調,傳入選中的設備列表,建立與其他 PE 的通信端點。

    之后進行 barrier,同步所有進程,確保連接建立一致。

    更新設備狀態。

    NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

    6.5.2 拓撲映射

    當用戶想要通過 ENABLE_NIC_PE_MAPPING 進行 PE(實際也就是 GPU)與 NIC 的映射時,可以通過以下兩個環境變量實現:

    NVSHMEM_HCA_LIST:直接提供 NIC name 和 port 索引的列表(PS:內部會進行排序)。

    • “^mlx5_0”:排除 mlx5_0 NIC。
    • “mlx5_1:1,mlx5_2:2”:如果有 8 個 GPU,則 4 個 GPU 對應 mlx5_1 的 Port 1,4 個 GPU 對應 mlx5_2 的 Port 2。

    NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

    NVSHMEM_HCA_PE_MAPPING:和上述的 NVSHMEM_HCA_LIST 類似,只不過可以進一步設置 PE 的數量(PS:內部也會進行排序)。

    • “mlx5_0:1:3,mlx5_0:2:5”:還是 8 個 GPU,則 3 個 GPU 對應 mlx5_1 的 Port 1,5 個 GPU 對應 mlx5_0 的 Port 2。

    NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

    我們前面提到,DeepEP 的高吞吐模式與 ENABLE_NIC_PE_MAPPING 不兼容也正是這里的問題。

    假設還是 8 個 GPU,設置 NVSHMEM_HCA_PE_MAPPING 為 “mlx5_0:1:2,mlx5_0:2:2,mlx5_1:1:2,mlx5_1:2:2”,預期是 PE0 和 PE1 使用 mlx5_0 的 Port 1, PE6 和 PE7 使用 mlx5_1 的 Port 2。

    由于高吞吐模式時這里的 mype_node 實際為 rdma_rank,一個節點上所有 PE 的 mype_node 相同,實際都是 0,導致這里實際上這里所有 PE 選擇了相同的 NIC,沒有達到 Mapping 的目的,反而導致了 NIC 熱點。

    NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

    6.5.3 智能拓撲感知

    主要是調用 nvshmemi_get_devices_by_distance 為本節點上的每個 PE 分配最優的 NIC,以實現高效的 GPU-NIC 通信。分配策略基于 PCIe 拓撲距離,優先選擇距離 GPU 最近的 NIC,并在多 GPU/多 NIC 情況下盡量負載均衡(位于 nvshmem_src/nvshmem/src/host/topo/topo.cpp)。整體思路與 NCCL 中類似,這里主要包括幾個步驟:

    收集 GPU 和 NIC 路徑:

    • 獲取本 PE 的 GPU PCIe Bus ID。
    • 通過 allgather 收集所有 PE 的 GPU Bus ID。
    • 遍歷所有 PE,篩選出本節點的 PE(hostHash 相同),并獲取其 GPU 的 PCIe 路徑,填入 cuda_device_paths。
    • 填充所有 NIC 的 PCIe 路徑。

    計算所有 GPU-NIC 距離:

    • 針對每個 PE 的 GPU,都會通過 get_pci_distance 計算每個 NIC 與 GPU 的距離,并構造一個三元組 {pe_id, dev_id, distance},插入 pe_dev_pairs,按距離升序排列(距離越小越優)。
    • PCIe 距離的優先級為 PIX > PXB > PHB > NODE > SYS,和 NCCL 一樣。

    NVSHMEM 深度解析:初始化流程與核心機制-AI.x社區

    第一輪分配(優先分配最近的 NIC):

    • 遍歷 pe_dev_pairs(距離優先),為每個本地 PE 依次分配最優的 NIC。
    • 如果當前距離比已分配的更優,則分配該 NIC,并記錄距離和使用計數。
    • 如果遇到更差的距離,后續的 NIC 都不再考慮,標記為無更優分配(-2)。
    • 直到所有本地 PE 的分配完成。

    第二輪分配(負載均衡):

    • 檢查是否有 NIC 被多個 PE 分配(nic_density >= 2)。
    • 嘗試為這些 PE 找到同等距離但負載更低的 NIC,減少單個 NIC 的壓力。
    • 只在不會降低距離優先級的前提下進行重新分配。

    輸出本 PE 的分配結果:

    • 將本 PE 分配到的 NIC 索引寫入 device_arr。
    • 統計本 PE 實際分配到的 NIC 數量。

    七、參考鏈接

    1. ??https://docs.nvidia.com/nvshmem/api/index.html??
    2. ??https://github.com/deepseek-ai/DeepEP??
    3. ??https://docs.nvidia.com/nvshmem/release-notes-install-guide/install-guide/abstract.html??

    本文轉載自???AI閑談?????,作者:AI閑談


    收藏
    回復
    舉報
    回復
    相關推薦
    久久久久久久久久久免费| 狠狠久久亚洲欧美专区| 亚洲综合自拍一区| 伊人国产在线观看| 亚洲欧洲色图| 5858s免费视频成人| 日韩不卡视频一区二区| 亚州av在线播放| 精品一区二区日韩| 97视频在线观看亚洲| 日本综合在线观看| 都市激情亚洲欧美| 欧美日韩精品一区二区天天拍小说| 欧美一二三不卡| 黄网在线观看| 懂色av一区二区三区免费看| 日韩女优在线播放| 美女视频黄免费| 欧美一级本道电影免费专区| 精品国产区一区| 自拍偷拍 国产| 91九色国产在线播放| 国产精品福利影院| 清纯唯美一区二区三区| 国产成人手机在线| 狠狠久久亚洲欧美| 国产精品av在线| 日本熟女一区二区| 中文字幕一区二区三三| 国产亚洲精品久久久| www国产视频| 欧美专区一区| 在线不卡一区二区| 日日躁夜夜躁aaaabbbb| 亚洲精品88| 亚洲va韩国va欧美va| 欧美日韩一级在线| 97超碰人人在线| 久久久精品综合| 老牛影视免费一区二区| 好男人www在线视频| 极品少妇xxxx精品少妇| 国产精品久久久久免费a∨| 久久夜色精品亚洲| 亚洲精品女人| 国内免费久久久久久久久久久| 国产真实乱在线更新| 欧美日韩激情| 国产性色av一区二区| 国产呦小j女精品视频| 日韩精品丝袜美腿| 亚洲精品福利资源站| wwwww在线观看| 日韩免费一级| 日韩亚洲欧美在线| 女人扒开双腿让男人捅| 欧美午夜网站| 日韩丝袜美女视频| 国产精品果冻传媒| 国产精品视频一区二区三区综合 | 高清av一区二区| 亚洲综合成人婷婷小说| 在线视频精品一| 肉色超薄丝袜脚交| 国产精品免费精品自在线观看| 欧美美女视频在线观看| 午夜视频在线网站| 综合久久av| 日韩亚洲欧美成人一区| 91香蕉视频在线观看视频| 免费观看亚洲视频大全| 欧美刺激脚交jootjob| 精品伦一区二区三区| 麻豆一区一区三区四区| 亚洲欧美日韩网| 69精品无码成人久久久久久| 色综合久久网| 欧美理论电影在线观看| 日本一二三区不卡| 久久一区二区三区四区五区 | 亚洲欧洲国产精品| 亚洲欧美日韩第一页| 亚洲字幕久久| 91成人精品网站| 中文字幕 国产| 国产精品一区二区久久不卡| 国模一区二区三区私拍视频| 国产精品无码2021在线观看| 亚洲日韩欧美一区二区在线| 国产精品久久久久久久乖乖| 精品3atv在线视频| 91精品国产综合久久香蕉的特点| 国产免费无码一区二区| 精品在线手机视频| 久久人人爽亚洲精品天堂| 久久久国产精华液| 久久久噜噜噜| 91久久爱成人| 国内av一区二区三区| 亚洲欧美日韩中文字幕一区二区三区| 国产aaa免费视频| 日本免费久久| 日韩三级高清在线| 国产美女永久免费无遮挡| 91精品国产乱码久久久久久| 欧美亚洲激情视频| 夜夜躁狠狠躁日日躁av| aaa欧美色吧激情视频| 亚洲天堂电影网| 国产美女高潮在线观看| 欧美电影一区二区| 中文字幕一区二区三区人妻电影| 亚洲成人最新网站| 国产成人高清激情视频在线观看 | 日韩电影中文字幕av| 欧美成人短视频| 国产亚洲毛片在线| 91视频-88av| 国产免费a∨片在线观看不卡| 夜夜精品视频一区二区| 亚州精品一二三区| 久久夜色精品国产噜噜av小说| 久久九九热免费视频| 国产女主播喷水视频在线观看 | 国产传媒一区二区| 哥也色在线视频| 欧美性极品少妇| 无码人妻精品一区二区三应用大全| 国内精品福利| 91在线观看免费高清| 色综合久久影院| 91国偷自产一区二区三区观看 | 国产一区二区女内射| 久久伊人蜜桃av一区二区| 777av视频| 日本熟妇毛耸耸xxxxxx| 99亚洲乱人伦aⅴ精品| 自拍偷拍亚洲区| 亚洲精品毛片一区二区三区| aaa亚洲精品一二三区| 三级在线免费观看| 精品国产亚洲一区二区三区| 日韩在线中文字| 日韩三级一区二区| 久久综合色之久久综合| 国产淫片免费看| 精品国产午夜肉伦伦影院| 欧美成人精品xxx| 国产精品毛片一区二区在线看舒淇| 国产色产综合产在线视频| 国产在线青青草| 精品一区毛片| 国产www精品| 国产一区二区三区福利| 色综合天天性综合| www.黄色在线| 美女在线一区二区| 亚洲一区在线直播| 九九久久国产| 久久伊人免费视频| 精品国产无码AV| 一区二区国产视频| 亚洲v在线观看| 国产精品老牛| 日韩一区二区三区高清| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 9lporm自拍视频区在线| 亚洲国产小视频在线观看| 圆产精品久久久久久久久久久| 91亚洲永久精品| 午夜免费一区二区| 亚洲精品一区二区在线看| 97av影视网在线观看| 国产三级电影在线播放| 亚洲图片在区色| 97精品人妻一区二区三区在线| 亚洲精品久久久蜜桃| 人妻体内射精一区二区三区| 美女被久久久| 亚洲第一页在线视频| 91大神精品| 日本精品视频在线播放| 日韩在线观看www| 欧美精品一区二区高清在线观看| 久久久免费高清视频| 亚洲国产成人午夜在线一区| 精品人妻一区二区三区免费| 亚洲精品精选| 一区二区在线观看网站| 成人动态视频| 国产精品午夜视频| 国产在线xxx| 最近中文字幕mv在线一区二区三区四区| 精品国产黄色片| 欧美性xxxxxxx| 老女人性淫交视频| 久久精子c满五个校花| 亚洲图片 自拍偷拍| 久久精品官网| 国产激情片在线观看| 国产欧美日韩免费观看| 99re视频在线观看| 成人不卡视频| 欧美夜福利tv在线| 色婷婷视频在线观看| 亚洲区免费影片| 亚洲国产av一区二区| 欧美色精品在线视频| 久久久香蕉视频| 国产精品三级av| 精品无码在线视频| 国产91精品露脸国语对白| 亚洲一区二区蜜桃| 国产欧美亚洲一区| www.激情网| 97国产精品| 日韩av电影在线观看| 老牛影视av一区二区在线观看| 国产免费成人av| 欧美一级大片| 5566日本婷婷色中文字幕97| 色呦呦视频在线观看| 日韩视频免费观看| 成人亚洲综合天堂| 日韩精品极品在线观看播放免费视频 | av黄在线观看| 久久精品国产一区二区三区| wwwww在线观看免费视频| 日韩毛片中文字幕| 日韩一级中文字幕| 精品国内片67194| 99热这里只有精品3| 欧美日韩黄色一区二区| 波多野结衣在线观看视频| 欧美日韩国产精品专区| 日本午夜小视频| 亚洲成人一二三| 国产亚洲精品av| 亚洲专区一二三| 妺妺窝人体色www聚色窝仙踪| 亚洲女同一区二区| 男女性高潮免费网站| 亚洲免费视频中文字幕| 国产黄色的视频| 亚洲欧美偷拍卡通变态| 欧美一级片在线视频| 亚洲欧洲成人自拍| 夫妻性生活毛片| 亚洲视频中文字幕| 私库av在线播放| 亚洲一区日韩精品中文字幕| 玖玖爱免费视频| 一个色妞综合视频在线观看| 国产第一页在线播放| 亚洲国产成人91porn| 国产无套在线观看| 欧美性20hd另类| 中文字幕免费视频观看| 精品1区2区3区| 国产又粗又猛又黄| 欧美一级欧美三级在线观看 | 国产剧情在线观看一区二区| 老女人性生活视频| 懂色av一区二区三区免费观看| 人妻av一区二区| 久久久99久久| 亚洲 欧美 变态 另类 综合| 一区二区欧美精品| av中文在线播放| 欧美三级在线视频| 99er热精品视频| 日韩精品极品在线观看| 成人高清免费在线播放| 色婷婷综合成人av| 福利在线导航136| 欧美又大粗又爽又黄大片视频| 户外露出一区二区三区| 91精品国产综合久久久久久久久 | 久久久久久国产精品mv| 国内精品伊人久久久| 天天成人综合网| 日韩一级在线| 三上悠亚av一区二区三区| 国产黄色成人av| 美女爆乳18禁www久久久久久 | 91亚洲精华国产精华精华液| 国产视频三区四区| 一区二区三区不卡在线观看 | 女女同性女同一区二区三区91| 日韩在线观看| 久操网在线观看| 免费成人性网站| 美女伦理水蜜桃4| 中文字幕成人网| 国产精品变态另类虐交| 精品视频在线视频| 天堂中文在线资源| 久久精品国产91精品亚洲 | 欧美性xxxx在线播放| 国产精品无码天天爽视频| 亚洲黄色www| 成人毛片av在线| 国产精品aaa| 免费福利视频一区| 国产一区一区三区| 久久国产精品久久久久久电车| 北条麻妃亚洲一区| 国产欧美久久久精品影院| 国产午夜精品无码| 欧美男女性生活在线直播观看| 日色在线视频| 欧美激情二区三区| 热久久久久久| 日韩欧美三级一区二区| 99国产精品99久久久久久粉嫩| 天天影视色综合| 中文字幕欧美三区| 少妇高潮av久久久久久| 亚洲国产精品悠悠久久琪琪| 超鹏97在线| 国产欧美精品一区二区三区介绍| 亚洲人和日本人hd| 男人添女荫道口图片| 国产主播一区二区| 手机免费观看av| 在线免费av一区| 日本一区二区三区在线观看视频| 久久久久久综合网天天| 日本一区影院| 黑人巨大国产9丨视频| 美女爽到高潮91| 手机看片福利视频| 91国偷自产一区二区开放时间 | 欧美一区视频在线| 亚洲三区欧美一区国产二区| 亚洲 欧洲 日韩| 麻豆国产精品视频| 林心如三级全黄裸体| 欧美私人免费视频| 阿v免费在线观看| 国产精品第一区| 国产成人精品免费视| 97视频在线免费播放| 久久综合九色欧美综合狠狠| 精品欧美一区二区三区免费观看| 亚洲精品91美女久久久久久久| 国内老司机av在线| 精品视频免费观看| 午夜亚洲视频| 国产jjizz一区二区三区视频| 91国产免费观看| 99视频在线观看地址| 国产主播在线一区| 中文字幕免费一区二区三区| 北条麻妃亚洲一区| 亚洲图片自拍偷拍| 日韩a在线观看| 国产精品久久av| 五月精品视频| 又色又爽又黄18网站| 午夜精品久久久久久久蜜桃app| 欧美一区二区三区成人片在线| 欧美亚洲另类视频| 欧洲视频一区| 佐山爱在线视频| 亚洲3atv精品一区二区三区| 偷拍自拍在线视频| 国产精品青草久久久久福利99| 99国产**精品****| 麻豆tv在线观看| 色综合亚洲欧洲| 成人午夜在线影视| 九九九九精品九九九九| 日本va欧美va欧美va精品| 97在线观看视频免费| 精品国产一区久久| 欧美1级2级| 韩国黄色一级大片| 成人av网站大全| 亚洲精品一区二三区| 久久影院资源网| 亚洲ab电影| 国产无遮挡猛进猛出免费软件| 亚洲综合色网站| 久香视频在线观看| 99久久久精品免费观看国产| 亚洲综合不卡| av成人免费网站| 亚洲成人xxx| 四虎国产精品免费久久| 色综合久久久久无码专区| 国产精品久久午夜夜伦鲁鲁| 色香蕉在线视频| 成人高h视频在线| 国产精品日本| 欧美高清视频一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 玖玖玖电影综合影院| 韩国一区二区av| 亚洲电影一区二区三区|