按理这一期该录个实操视频的,可惜缺卡,哈哈哈,等赚钱了买卡补录。
NCCL源码解读的视频可以看这:
NCCL集合通信源码解读、案例、任务调度、拓扑_哔哩哔哩_bilibili
一、NCCL源码下载
以下两种方式,选一种即可
1.1 github下载压缩包并解压
1.1.1 登录如下网址,完成ZIP压缩包下载
https://github.com/NVIDIA/nccl
GitHub - NVIDIA/nccl: Optimized primitives for collective multi-GPU communication
1.1.2 安装包解压缩
unzip nccl.zip
得到如下图的文件夹
1.2 git克隆代码
git clone https://github.com/NVIDIA/nccl.git
二、编译源码
进入nccl源码目录,编译源码
$ cd nccl
$ make -j src.build
得到如下结果,说明编译成果啦!
注:编译源码错误解决
编译的时候遇到如下错误
Compiling build/obj/device/gensrc/reduce_sumpostdiv_i8.cu
Compiling build/obj/device/gensrc/reduce_sumpostdiv_u32.cu
Compiling build/obj/device/gensrc/reduce_sum_u8.cu
Compiling build/obj/device/gensrc/reduce_sumpostdiv_u8.cu
Compiling build/obj/device/gensrc/reduce_sumpostdiv_i32.cu
Killed
Killed
Killed
Killed
Killed
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:10: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/all_reduce_minmax_f16.cu.o] Error 137
make[2]: *** Waiting for unfinished jobs....
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:49: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/all_reduce_premulsum_u64.cu.o] Error 137
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:133: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/reduce_minmax_u64.cu.o] Error 137
Killed
Killed
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:136: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/reduce_minmax_u8.cu.o] Error 137
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:175: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/reduce_prod_u64.cu.o] Error 137
Killed
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:82: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/all_reduce_sum_f32.cu.o] Error 137
make[2]: *** [/data/NCCL_my/nccl-2.19/build/obj/device/gensrc/rules.mk:16: /data/NCCL_my/nccl-2.19/build/obj/device/genobj/all_reduce_minmax_f64.cu.o] Error 137
将编译命令改成如下命令,成果啦!(据说是并行编译,资源不足导致的,-j我只尝试加个4,成功了,我就没管了,说不定8也可以而且更快,大家自己试试。)
make -j 4 src.build
三、NCCL包构建
安装NCCL运行如下命令
$ # Install tools to create debian packages
$ sudo apt install build-essential devscripts debhelper fakeroot
$ # Build NCCL deb package
$ make pkg.debian.build
$ ls build/pkg/deb/
出现如下提示,恭喜恭喜!
四、NCCL安装
sudo dpkg -i build/pkg/deb/libnccl2_2.19.3-1+cuda12.4_amd64.deb
sudo dpkg -i build/pkg/deb/libnccl-dev_2.19.3-1+cuda12.4_amd64.deb
五、NCCL-tests安装
5.1 下载NCCL-tests
GitHub - NVIDIA/nccl-tests: NCCL Tests
到Github上下载zip包并解压缩,或者
git clone https://github.com/NVIDIA/nccl-tests.git
5.2 安装NCCL-tests
进入NCCL目录,并make
cd nccl-tests-master
make
哈哈哈,NCCL-tests安装成功啦。
注:
如果 CUDA 未安装在 /usr/local/cuda 中,您可以指定 CUDA_HOME。同样,如果 NCCL 未安装在 /usr 中,则可以指定 NCCL_HOME。
make CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl
NCCL 测试依赖于 MPI 在多个进程上工作,因此需要多个节点。如果要使用 MPI 支持编译测试,则需要设置 MPI=1 并将 MPI_HOME 设置为 MPI 的安装路径。
make MPI=1 MPI_HOME=/path/to/mpi CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl
六、NCCL测试
输入如下命令测试NCCL和NCCL-test有没有安装好。
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1
参数说明
-b 集合通信起始(最小)数据量大小
-e 集合通信结束(最大)数据量大小
-f 乘法因子(数据量按几倍增加)
-g 参与通信的GPU数量
哈哈哈,能跑,安装成功啦。可以使用NCCL和进行NCCL性能测试啦。
其它安装需求
七、将NCCL安装到指定目录
第四章的安装命令,更换为如下,指定安装目录
sudo make install PREFIX=/home/acmdxmj/NCCL_coding/debIntall
第五章5.2, NCCL-tests指定目录
make NCCL_HOME=/home/acmdxmj/NCCL_coding/debIntall
并且增加环境变量
export LD_LIBRARY_PATH=/home/acmdxmj/NCCL_coding/debIntall/lib:$LD_LIBRARY_PATH
之后再运行NCCL-test
八、单机多进程NCCL通信
8.1 MPI安装
sudo apt-get update
sudo apt install openmpi-bin openmpi-doc libopenmpi-dev
mpirun --version
MPI的安装位置查询
dpkg -L libopenmpi-dev | grep '\.so$'
MPI的安装路径为
/usr/lib/x86_64-linux-gnu/openmpi
8.2 NCCL-test 重新编译
# 多机编译
make CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl MPI_HOME=/path/to/mpi MPI=1
8.3 运行NCCL-test
mpirun -np 2 ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1
九、多机多进程NCCL通信
多台机器都完成上面的安装流程,并能执行8.3节的命令。
9.1 SSH免密配置
看这部分内容之前,请先看这个文档
git,ssh免密公钥配置,gitee为例,GitHub,gitlab同理_git,ssh免密公钥配置,gitee为例,github,gitlab同理git-CSDN博客
看看如何生成 id_rsa.pub
cd ~/.ssh
cp id_rsa.pub authorized_keys
scp authorized_keys acmdxmj@166.333.24.83:~/.ssh/
目前只有一台免密另一台,现在两台服务器互相免密。
进入另一台服务器
ssh 远端IP地址
SSH免密授权
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp authorized_keys acmdxmj@166.333.24.83:~/.ssh/
切回本端服务器
ssh 本端IP地址
9.2 构建hostfile
假设你有三台机器参与测试,它们的IP地址分别是192.168.1.1
、192.168.1.2
和192.168.1.3
。那么hostfile
的内容应该如下所示:
192.168.1.1 slots=1
192.168.1.2 slots=1
192.168.1.3 slots=1
9.3 多机运行NCCL
mpirun -np 8 -hostfile hostfile --allow-run-as-root ./build/all_reduce_perf -b 8 -e 1G -f 2 -g 4
-np 8
:总进程数(如2节点×4GPU)。-g 4
:每节点使用的GPU数。-b 8 -e 1G
:测试数据范围(8B到1GB)。
9.4 多机NCCL不在默认安装目录
需设置系统环境变量
sudo vim /etc/environment
LD_LIBRARY_PATH=/home/acmdxmj/NCCL_coding/debIntall/lib:$LD_LIBRARY_PATH