文章目录
背景
本文记录了如何在centos8上通过安装openmpi等工具,使用nccl_test仓库运行all_reduce的测试程序的例子,但是最终只解决了各种编译问题没有真正的跑起来,不过过程十分曲折,有些地方值得记录。
nccl-tests 是由 NVIDIA 开发的一个开源测试工具集,用于评估和验证 NCCL(NVIDIA Collective Communications Library)的功能和性能。NCCL 是一个高性能的通信库,专为多 GPU 和多节点环境中的并行计算优化,支持多种集体通信操作,如 All-Reduce、All-Gather、Broadcast、Reduce 等
nccl-tests 提供了多种测试工具,用于不同的集体通信操作,包括:
all_reduce_perf:测试 All-Reduce 操作的性能。
all_gather_perf:测试 All-Gather 操作的性能。
broadcast_perf:测试 Broadcast 操作的性能。
reduce_perf:测试 Reduce 操作的性能。
sendrecv_perf:测试点对点通信的性能。
细节
安装MPI(Message Passing Interface)来支持多进程通信
CentOS 8 上运行 NCCL 测试程序,即使没有 GPU,也可以通过模拟环境进行测试。
sudo yum install -y openmpi openmpi-devel
下载并编译 NCCL-tests
NCCL-tests 是用于测试 NCCL 性能的工具,支持在没有 GPU 的环境中运行
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests
make MPI=1 MPI_HOME=/usr/lib64/openmpi
# MPI=1 表示启用 MPI 支持。
# MPI_HOME 是 OpenMPI 的安装路径,可能因系统而异,可通过 find / -name mpiexec 查找
解决《nvcc没有》参考后文章节
解决《nccl.h没有》参考后文章节
解决《没有mpi.h》参考后文章节
完成全量编译效果:
测试
报错:unrecognized argument mca
查看:
可能原因是安装了openmpi和mpich多个mpi
再查看bashrc,注释掉mpich的,然后source ~/.bashrc
还是不行,可能环境变量多个,然后把openmpi的放到最前面,然后source ~/.bashrc
还是不对,路径没写对:
修改为:然后source ~/.bashrc
export PATH=/usr/lib64/openmpi/bin/:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/include/openmpi-x86_64/lib
export CPATH=$CPATH:/usr/include/openmpi-x86_64/include
确认使用了正确的mpirun
至少通过了,但是不建议root
可以跑起来了,但是共享库不对,需要修改下
解决libmpi.so不对
bashrc中指定位置不对:然后source ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/openmpi/lib/
成功运行:
路径不对,没在nccl test目录下,切换到/过,切换到nccl-test目录:/root/workspace/nccl-tests
切换后可以跑起来了:
编译问题处理
make[1]:/usr/local/cuda/bin/nvcc:命令未找到,没有nvcc如何解决?
nvcc是cuda的工具包里面的东西,需要先下载cuda toolkit的工具,然后运行
访问 NVIDIA 官方网站的 CUDA Toolkit 下载页面,选择适合 CentOS 8 的版本进行下载
wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda_11.4.0_470.42.01_linux.run
chmod a+x cuda_11.4.0_470.42.01_linux.run
sh cuda_11.4.0_470.42.01_linux.run --toolkit #然后在选择的时候
解决办法
安装的时候去掉驱动安装,只安装工具
查看nvcc有了,然后加入:
修改bashrc:
vim ~/.bashrc
# 添加:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
# 然后source:
source ~/.bashrc
# 校验
nvcc --version
报错:…/verifiable/verifiable.cu:4:10: 致命错误:nccl.h:没有那个文件或目录
安装nccl的库:
sudo dnf config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
sudo yum install libnccl libnccl-devel #安装 NCCL 库及其开发包,如果需要静态链接 NCCL,也可以安装 libnccl-static
## 验证
ls /usr/local/cuda/include/nccl.h
校验:成功安装
其他方式:
## 方法2:手动下载和安装
下载 NCCL
从 NVIDIA 官方网站下载 NCCL 的预编译包或源码包。例如:
wget https://developer.download.nvidia.com/nvidia-nccl/v2.8.4/nccl_2.8.4+cuda10.0_v2.8.4_linux_x86_64.txz
解压并安装
解压 NCCL 包并安装:
tar -xvf nccl_2.8.4+cuda10.0_v2.8.4_linux_x86_64.txz
cd nccl_2.8.4+cuda10.0_v2.8.4_linux_x86_64
sudo ./install.sh
配置环境变量
将 NCCL 的安装路径添加到环境变量中:
echo 'export NCCL_ROOT=/usr/local/nccl' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NCCL_ROOT/lib' >> ~/.bashrc
source ~/.bashrc
# 方法3:
从源码编译
克隆 NCCL 源码
git clone https://github.com/NVIDIA/nccl.git
cd nccl
编译并安装
编译 NCCL 并安装:
make -j4
sudo make install
解决没有mpi.h:报错 common.h:14:10: 致命错误:mpi.h:没有那个文件或目录
原因:系统中没有安装 MPI,解决办法:安装mpi库
sudo yum install mpich mpich-devel
确认安装:
还是不行,添加到环境变量中,可以看到安装了mpich和openmpi两种mpi,实际openmpi已经有了。应该是路径不对,修改bashrc的环境变量然后source生效
vim ~/.bashrc
export PATH=$PATH:/usr/include/openmpi-x86_64/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/include/openmpi-x86_64/lib
export CPATH=$CPATH:/usr/include/openmpi-x86_64/include
source ~/.bashrc
还是不行,尝试mpich的添加:
手动添加到CPATH的环境变量中
export CPATH=$CPATH:/usr/include/openmpi-x86_64
添加后可以正常编译: