NCCL使用/調(diào)用步驟源碼解讀(單設(shè)備單進(jìn)程為例):
視頻教程
1.1 NCCL官網(wǎng)案例源碼詳解One Device per Process or Thread_嗶哩嗶哩_bilibili
步驟總結(jié):
通過MPI獲取本機(jī)rank(可理解為進(jìn)程)數(shù)量localrank,用于rank綁定GPU;
rank0獲取NCCL通信組ID,并通過MPI_Bcast廣播給其它rank;
借助MPI獲取的這些信息NCCL完成初始化,并進(jìn)行集合通信。
核心步驟:
1、初試化和啟動MPI通信。
2、計算主機(jī)名的哈希值,并MPI_allgather通信使得每個rank(進(jìn)程)都獲取其它rank的哈希值。
3、根據(jù)獲取的哈希值,比較得到該rank所在的主機(jī)參與通信的rank總數(shù)localrank(哈希值相同的rank在同一主機(jī)上)。(哈希值就是主機(jī)名,其實可以用主機(jī)名來獲取主機(jī)上參與通信的總rank數(shù),只是主機(jī)命名五花八門,哈希值更容易比較)
4、rank0上獲取NCCL的唯一ID,并MPI_Bcast廣播給其它rank。(這個唯一的ID是用來標(biāo)識通信組,因此所有通信組中的rank有相同的ID)
5、基于localrank綁定GPU,并分配發(fā)送接收緩沖區(qū),創(chuàng)建CUDA流。
6、初始化NCCL通信器。
7、nccl allreduce通信。同步CUDA流,確保通信完成。
8、釋放緩沖區(qū)。
9、銷毀通信器。
10、終止MPI環(huán)境
對應(yīng)源碼
源碼來源NCCL官方文檔 Example 2: One Device per Process or Thread:Examples — NCCL 2.21.5 documentation (nvidia.com)