GPU Ant8裸金属服务器NVIDIA515+CUDA11.7装机和NCCL验证

举报
modelarts-dev-server 发表于 2023/11/21 09:36:57 2023/11/21
【摘要】 本文旨在在此机器上做NCCL-test测试, 先装机,在测试。

0. 前置条件 

华为云Ant8裸金属服务器,使用IMS公共镜像Ubuntu 20.04 x86 64bit sdi3 for Ant8 BareMetal. 镜像中仅预置IB驱动; NVIDIA驱动均未安装。

本文旨在在此机器上做NCCL-test测试, 先装机,在测试。装机软件预览如下:

软件类型 版本详情
预置操作系统 Ubuntu 20.04 server 64bit
nvidia-driver 515.10.01
nvidia-cuda 11.7
nvidia-fabricmanager 515.10.01(必须和nvidia-driver版本保持一致)
mlnx-ofed-linux 5.8-2.0.3.0/5.4-3.6.8.1(可选)
nvidia-peer-memory-dkms 1.2-0
nccl libnccl2=2.14.3-1+cuda11.7 libnccl-dev=2.14.3-1+cuda11.7
nccl-test v.2.13.6

注意: 默认认为当前机器已经完成配置RoCE网络。若为配置可以提工单至ModelArts解决.

1. 替换apt源

sudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sudo apt update

2 安装NVIDIA驱动

wget https://us.download.nvidia.com/tesla/515.105.01/NVIDIA-Linux-x86_64-515.105.01.run
chmod +x NVIDIA-Linux-x86_64-515.105.01.run
./NVIDIA-Linux-x86_64-515.105.01.run

3 安装cuda

# run包安装
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
chmod +x cuda_11.7.0_515.43.04_linux.run
./cuda_11.7.0_515.43.04_linux.run --toolkit --samples --silent

4. 安装nccl

参考:https://docs.nvidia.com/deeplearning/nccl/install-guide/index.html

nccl和环境中cuda版本的配套的。配套关系和安装方法参考: https://developer.nvidia.com/nccl/nccl-legacy-downloads

本文使用cuda版本是11.7, 因此安装nccl的命令为

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt update
sudo apt install libnccl2=2.14.3-1+cuda11.7 libnccl-dev=2.14.3-1+cuda11.7

安装完成后可以查看:

nccl.png

5. 安装nvidia-fabricmanager

注意事项: 必须和nvidia driver版本保持一致

version=515.105.01
main_version=$(echo $version | awk -F '.' '{print $1}')
apt-get update
apt-get -y install nvidia-fabricmanager-${main_version}=${version}-*

验证驱动安装结果、启动fabricmanager服务并查看状态 是否RUNNING

nvidia-smi -pm 1
nvidia-smi
systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
systemctl status nvidia-fabricmanager

6. 安装nv-peer-memory

针对GPU A系列裸金属服务器,需要重新安装nv-peer-memory, 因为在步骤1中已经被卸载了。

git clone https://github.com/Mellanox/nv_peer_memory.git
cd ./nv_peer_memory
./build_module.sh
cd /tmp
tar xzf /tmp/nvidia-peer-memory_1.3.orig.tar.gz
cd nvidia-peer-memory-1.3
dpkg-buildpackage -us -uc
dpkg -i ../nvidia-peer-memory-dkms_1.2-0_all.deb

nv_peer_mem工作在linux内核态,安装完成后需要看是否加载到内核, 通过执行 lsmod | grep peer查看是否加载.

注意事项:

(1). 如果git clone拉不下来代码,可能需要先设置下git的配置:

git config --global core.compression -1
export GIT_SSL_NO_VERIFY=1
git config --global http.sslVerify false
git config --global http.postBuffer 10524288000
git config --global http.lowSpeedLimit 1000
git config --global http.lowSpeedTime 1800

(2). 如果安装完成后lsmod 看不到nv-peer-memory,可能是由于ib驱动版本过低导致,此时需要升级ib驱动,升级命令:

wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.6.8.1/MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64.tgz
tar -zxvf MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64
apt-get install -y python3 gcc quilt build-essential bzip2 dh-python pkg-config dh-autoreconf python3-distutils debhelper make
./mlnxofedinstall --add-kernel-support

如果想安装其它更高版本的ib驱动,请参考:

https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/

比如要安装MLNX_OFED-5.8-2.0.3.0 (当前最新版本)

wget https://content.mellanox.com/ofed/MLNX_OFED-5.8-2.0.3.0/MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64.tgz
tar -zxvf MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu20.04-x86_64
apt-get install -y python3 gcc quilt build-essential bzip2 dh-python pkg-config dh-autoreconf python3-distutils debhelper make
./mlnxofedinstall --add-kernel-support

(3). 安装完nv_peer_mem, 如果想查看其状态可以 

/etc/init.d/nv_peer_mem/ status

如果发现没有此文件,则可能安装的时候没有默认拷贝过来,需要拷贝即可:

cp /tmp/nvidia-peer-memory-1.3/nv_peer_mem.conf  /etc/infiniband/
cp /tmp/nvidia-peer-memory-1.3/debian/tmp/etc/init.d/nv_peer_mem   /etc/init.d/ 

7、设置环境变量

注意事项: MPI路径版本需要匹配, 可以通过 ls /usr/mpi/gcc/ 查看openmpi的具体版本.

# 加入到~/.bashrc
export LD_LIBRARY_PATH=/usr/local/cuda/lib:usr/local/cuda/lib64:/usr/include/nccl.h:/usr/mpi/gcc/openmpi-4.1.2a1/lib:$LD_LIBRARY_PATH
export PATH=$PATH:/usr/local/cuda/bin:/usr/mpi/gcc/openmpi-4.1.2a1/bin

8. nccl-test

先安装编译nccl-test

注意事项: MPI路径版本需要匹配, 可以通过 ls /usr/mpi/gcc/ 查看openmpi的具体版本.

cd /root
git clone https://github.com/NVIDIA/nccl-tests.git
cd ./nccl-tests
make  MPI=1 MPI_HOME=/usr/mpi/gcc/openmpi-4.1.2a1 -j 8

注意:编译时需要加上MPI=1的参数,否则无法进行多机之间的测试

9. 测试

(1) 单机测试:

/root/nccl-tests/build/all_reduce_perf -b 8 -e 1024M -f 2 -g 8

(2) 多机测试:

mpirun --allow-run-as-root --hostfile hostfile -mca btl_tcp_if_include eth0 -mca btl_openib_allow_ib true -x NCCL_DEBUG=INFO -x NCCL_IB_GID_INDEX=3 -x NCCL_IB_TC=128 -x NCCL_ALGO=RING -x NCCL_IB_HCA=^mlx5_bond_0 -x LD_LIBRARY_PATH -x NCCl_IB_QPS_PER_CONNECTION=4 /root/nccl-tests/build/all_reduce_perf -b 8 -e 11g -f 2 -g 8

hostfile格式:

#主机私有Ip  单节点进程数
192.168.20.1 slots=1
192.168.20.2 slots=1

注意事项:

1. 需要执行mpirun的节点到hostfile中的节点间有免密登录(SSH 三步解决免密登录_jeikerxiao的博客-CSDN博客)

2. btl_tcp_if_include  后面替换为主网卡名称

3. NCCL环境变量:

NCCL_IB_GID_INDEX=3   :数据包走交换机的队列4通道,这是RoCE协议标准。

NCCL_IB_TC=128  :使用RoCE v2协议,默认使用RoCE v1,但是v1在交换机上没有拥塞控制,可能丢包,而且后面的交换机不会支持v1,就跑不起来了。

NCCL_ALGO=RING  :

nccl_test的总线bandwidth 是在假定是Ring算法的情况下 计算出来的。

计算公式是有假设的: 总线带宽 = 算法带宽 * 2 ( N-1 ) / N  ,算法带宽 = 数据量 / 时间

但是这个计算公式的前提是用Ring算法,Tree算法的总线带宽不能这么算。

如果Tree算法算出来的总线带宽相当于是相对Ring算法的性能加速。

算法计算总耗时减少了,所以用公式算出来的总线带宽也增加了



理论上Tree算法是比Ring算法更优的,但是Tree算法对网络的要求比Ring高,计算可能不太稳定。 Tree算法可以用更少的数据通信量完成all reduce计算,但用来测试性能不太合适。

因此,会出现两节点实际带宽100,但测试出速度110,甚至130GB/s的情况。

加这个参数以后,2节点和2节点以上情况的速度才会稳定一些。


附图1: 关于mpirun命令解释的详图


屏幕截图 2023-07-19 115655.png

附图2: 笔者在自己两个节点的机器上nccl-test测试结果

屏幕截图 2023-07-19 120230-2.png



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。