操作场景
本文介绍如何在腾讯云环境中配置 TCCL 加速通信库,实现您在腾讯云 RDMA 环境中多机多卡通信的性能提升。在大模型训练场景,对比开源的 NCCL 方案,TCCL 预计约可以提升 50% 带宽利用率。
操作步骤
准备环境
注意:
TCCL 运行软件环境要求 glibc 版本 2.17 以上,CUDA 版本 10.0 以上。
选择安装方式
TCCL目前支持使用三种方式安装,您可以根据需要选择适合业务场景的安装方式。
TCCL 通信库 + 编译安装 Pytorch
TCCL 通信库 + Pytorch 通信插件
NCCL 插件 + 排序的 IP 列表
说明:
由于当前大模型训练基本都基于 Pytorch 框架,所以主要以 Pytorch 为例进行说明,
TCCL的三种接入方案对比如下表:
安装方式 | 方法一:编译安装 Pytorch | 方法二:安装 Pytorch 通信插件 | (推荐)方法三:安装 NCCL 通信插件 |
使用步骤 | 安装 TCCL 重新编译安装 Pytorch | 安装 Pytorch 通信插件 修改分布式通信后端 | 安装 NCCL 插件 修改启动脚本 |
优点 | 对业务代码无入侵 | 安装方便 | 安装方便 |
缺点 | 需要重新编译安装 Pytorch 对软件环境有要求 | 需要修改业务代码 对软件环境有要求 | 集群节点扩充之后,需要更新排序列表 |
软件环境依赖 | 对应 NCCL 版本 2.12 要求 glibc 版本 2.17 以上 要求 CUDA 版本 10.0 以上 | 当前安装包仅支持 Pytorch 1.12 要求 glibc 版本 2.17 以上
要求 CUDA 版本 10.0 以上 | 安装 NCCL 即可 |
如果您的机器资源和模型训练场景相对比较固定,推荐使用方法三,兼容不同的 NCCL 版本和 CUDA 版本,安装使用方便,不需要修改业务代码或者重新编译 Pytorch。
如果您的资源需要提供给不同的业务团队,或者经常有扩容的需求,推荐使用前两种方法,不需要算法人员或者调度框架刻意去感知机器的网络拓扑信息。
如果您不希望对业务代码做适配,那么可以使用方法1,只需要重新编译 Pytorch 框架。
配置 TCCL 环境并验证
由于社区 Pytorch 默认采用静态方式连接 NCCL 通信库,所以无法通过替换共享库的方式使用 TCCL。
1、安装 TCCL
以 Ubuntu 20.04 为例,您可以使用以下命令安装,安装之后 TCCL 位于
/opt/tencent/tccl
目录。# 卸载已有tccl版本和nccl插件dpkg -r tccl && dpkg -r nccl-rdma-sharp-plugins# 下载安装tccl v1.5版本wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/tccl/TCCL_1.5-ubuntu.20.04.5_amd64.deb && dpkg -i TCCL_1.5-ubuntu.20.04.5_amd64.deb && rm -f TCCL_1.5-ubuntu.20.04.5_amd64.deb
如果您使用 CentOS 或 TencentOS,参考以下步骤安装:
# 卸载已有tccl版本和nccl插件rpm -e tccl && rpm -e nccl-rdma-sharp-plugins-1.0-1.x86_64# 下载tccl v1.5版本wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/tccl/tccl-1.5-1.tl2.x86_64.rpm && rpm -ivh --nodeps --force tccl-1.5-1.tl2.x86_64.rpm && rm -f tccl-1.5-1.tl2.x86_64.rpm
2、 重新编译安装 Pytorch
#!/bin/bash# 卸载当前版本pip uninstall -y torch# 下载pytorch源码git clone --recursive https://github.com/pytorch/pytorchcd pytorch# <!重要> 配置TCCL的安装路径export USE_SYSTEM_NCCL=1export NCCL_INCLUDE_DIR="/opt/tencent/tccl/include"export NCCL_LIB_DIR="/opt/tencent/tccl/lib"# 参考官网添加其他编译选项# 安装开发环境python setup.py develop
3、 配置 TCCL 环境变量
export NCCL_DEBUG=INFOexport NCCL_SOCKET_IFNAME=eth0export NCCL_IB_GID_INDEX=3export NCCL_IB_DISABLE=0export NCCL_IB_HCA=mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3,mlx5_bond_4,mlx5_bond_5,mlx5_bond_6,mlx5_bond_7export NCCL_NET_GDR_LEVEL=2export NCCL_IB_QPS_PER_CONNECTION=4export NCCL_IB_TC=160export NCCL_IB_TIMEOUT=22export NCCL_PXN_DISABLE=0export TCCL_TOPO_AFFINITY=4
注意:
需要通过
TCCL_TOPO_AFFINITY=4
开启网络拓扑感知特性。4、 验证 Pytorch
运行单机多卡或者多机多卡训练过程中打印出如下信息(
export NCCL_DEBUG=INFO
):

5、 验证 nccl-tests
运行 nccl-tests 之前需要 export 对应的 TCCL 路径:
export LD_LIBRARY_PATH=/opt/tencent/tccl/lib:$LD_LIBRARY_PATH
6、 软件版本支持
目前 TCCL 对应 NCCL 版本 2.12 ,要求 glibc 版本 2.17 以上,CUDA 版本 10.0 以上。其他 CUDA 版本支持请联系您的售前经理获取支持。
Pytorch支持通过插件的方式接入第三方通信后端,所以在不重新编译 Pytorch 的前提下,用户可以使用 TCCL 通信后端,API 与 NCCL 完全兼容。详情可参考 Pytorch 现有通信后端介绍。
1、 安装 Pytorch 通信插件
# 卸载现有的tccl和NCCL插件dpkg -r tccl && dpkg -r nccl-rdma-sharp-plugins# 卸载torch_tcclpip uninstall -y torch-tccl# 安装torch_tccl 0.0.2版本wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/tccl/torch_tccl-0.0.2_pt1.12-py3-none-any.whl && pip install torch_tccl-0.0.2_pt1.12-py3-none-any.whl && rm -f torch_tccl-0.0.2_pt1.12-py3-none-any.whl
2、 修改业务代码
import torch_tccl#args.dist_backend = "nccl"args.dist_backend = "tccl"torch.distributed.init_process_group(backend=args.dist_backend,init_method=args.dist_url,world_size=args.world_size, rank=args.rank)
3、 配置 TCCL 环境变量
export NCCL_DEBUG=INFOexport NCCL_SOCKET_IFNAME=eth0export NCCL_IB_GID_INDEX=3export NCCL_IB_DISABLE=0export NCCL_IB_HCA=mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3,mlx5_bond_4,mlx5_bond_5,mlx5_bond_6,mlx5_bond_7export NCCL_NET_GDR_LEVEL=2export NCCL_IB_QPS_PER_CONNECTION=4export NCCL_IB_TC=160export NCCL_IB_TIMEOUT=22export NCCL_PXN_DISABLE=0export TCCL_TOPO_AFFINITY=4
注意:
需要通过
TCCL_TOPO_AFFINITY=4
开启网络拓扑感知特性。4、 验证 Pytorch
您在执行分布式训练业务时,出现如下提示可确认通信后端被正确加载。


5、 软件版本限制
当前安装包仅支持 Pytorch 1.12,其他 Pytorch 和 CUDA 版本支持请联系您的售前经理获取支持。
说明:
如果运行 nccl-tests 或者其他需要动态链接通信库的场景,请使用方法一安装 TCCL。
如果您已经安装了 NCCL ,也可以使用 NCCL 插件的方式使用 TCCL 加速能力。
1、 安装 NCCL 插件
以 Ubuntu 20.04 为例,您可以使用以下命令安装插件。
# 卸载现有的tccl和nccl插件dpkg -r tccl && dpkg -r nccl-rdma-sharp-plugins# 下载安装nccl 1.2插件wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/nccl/nccl-rdma-sharp-plugins_1.2_amd64.deb && dpkg -i nccl-rdma-sharp-plugins_1.2_amd64.deb# 请确保集群内使用nccl插件版本一致,以下为nccl 1.0版本下载安装命令,推荐使用稳定性更优的nccl 1.2版本# wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/nccl/nccl-rdma-sharp-plugins_1.0_amd64.deb && dpkg -i nccl-rdma-sharp-plugins_1.0_amd64.deb && rm -f nccl-rdma-sharp-plugins_1.0_amd64.deb
如果您使用 CentOS 或 TencentOS,参考以下步骤安装:
# 卸载现有的nccl插件rpm -e nccl-rdma-sharp-plugins-1.0-1.x86_64# 下载安装nccl 1.2插件wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/nccl/nccl-rdma-sharp-plugins-1.2-1.x86_64.rpm && rpm -ivh --nodeps --force nccl-rdma-sharp-plugins-1.2-1.x86_64.rpm# 请确保集群内使用nccl插件版本一致,以下为nccl 1.0版本下载安装命令,推荐使用稳定性更优的nccl 1.2版本# wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/nccl/nccl-rdma-sharp-plugins-1.0-1.x86_64.rpm && rpm -ivh --nodeps --force nccl-rdma-sharp-plugins-1.0-1.x86_64.rpm && rm -f nccl-rdma-sharp-plugins-1.0-1.x86_64.rpm
2、 获取拓扑排序的 IP 列表
NCCL 插件不需要依赖文件可提供 bonding 口动态聚合和全局 hash 路由两种优化。如果需要支持网络拓扑的亲和性感知,用户可以通过排序的 IP 列表来实现。
IP 排序可以按照如下方式完成:
a. 准备 IP 列表文件
VPC IP 地址通过
ifconfig eth0
获取,每行1个节点 IP,格式如下:root@VM-125-10-tencentos:/workspace# cat ip_eth0.txt172.16.177.28172.16.176.11172.16.177.25172.16.177.12
b. 执行排序
wget https://taco-1251783334.cos.ap-shanghai.myqcloud.com/tccl/get_rdma_order_by_ip.sh && bash get_rdma_order_by_ip.sh ip_eth0.txt
注意:
所有节点都安装了 curl 工具(比如对于 Ubuntu,通过
apt install curl
安装)。执行脚本的节点可以 ssh 免密访问其他所有节点。
c. 查看排序后的 IP 列表文件
root@VM-125-10-tencentos:/workspace# cat hostfile.txt172.16.176.11172.16.177.12172.16.177.25172.16.177.28
3、 配置 TCCL 环境变量
export NCCL_DEBUG=INFOexport NCCL_SOCKET_IFNAME=eth0export NCCL_IB_GID_INDEX=3export NCCL_IB_DISABLE=0export NCCL_IB_HCA=mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3,mlx5_bond_4,mlx5_bond_5,mlx5_bond_6,mlx5_bond_7export NCCL_NET_GDR_LEVEL=2export NCCL_IB_QPS_PER_CONNECTION=4export NCCL_IB_TC=160export NCCL_IB_TIMEOUT=22export NCCL_PXN_DISABLE=0# 机器 IP 手动排序之后,就不需要添加如下变量了# export TCCL_TOPO_AFFINITY=4
4、修改启动脚本
您需要在启动分布式训练时修改启动脚本。例如,如果使用 deepspeed launcher 启动训练进程,拿到排序后的 IP 列表之后,将对应的 IP 列表写入 hostfile,再启动训练进程。
root@vm-3-17-centos:/workspace/ptm/gpt# cat hostfile172.16.176.11 slots=8172.16.177.12 slots=8172.16.177.25 slots=8172.16.177.28 slots=8deepspeed --hostfile ./hostfile --master_addr 172.16.176.11 train.py
如果使用 torchrun 启动训练进程,通过
--node_rank
指定对应的节点顺序,// on 172.16.176.11torchrun --nnodes=4 --nproc_per_node=8 --node_rank=0 --master_addr=172.16.176.11 train.py ...// on 172.16.176.12torchrun --nnodes=4 --nproc_per_node=8 --node_rank=1 --master_addr=172.16.176.11 train.py ...// on 172.16.176.25torchrun --nnodes=4 --nproc_per_node=8 --node_rank=2 --master_addr=172.16.176.11 train.py ...// on 172.16.176.28torchrun --nnodes=4 --nproc_per_node=8 --node_rank=3 --master_addr=172.16.176.11 train.py ...
如果使用 mpirun 启动训练进程,按照顺序排列 IP 即可。
mpirun \\-np 64 \\-H 172.16.176.11:8,172.16.177.12:8,172.16.177.25:8,172.16.177.28:8 \\--allow-run-as-root \\-bind-to none -map-by slot \\-x NCCL_DEBUG=INFO-x NCCL_IB_GID_INDEX=3 \\-x NCCL_IB_DISABLE=0 \\-x NCCL_SOCKET_IFNAME=eth0 \\-x NCCL_IB_HCA=mlx5_bond_0,mlx5_bond_1,mlx5_bond_2,mlx5_bond_3,mlx5_bond_4,mlx5_bond_5,mlx5_bond_6,mlx5_bond_7 \\-x NCCL_NET_GDR_LEVEL=2 \\-x NCCL_IB_QPS_PER_CONNECTION=4 \\-x NCCL_IB_TC=160 \\-x NCCL_IB_TIMEOUT=22 \\-x NCCL_PXN_DISABLE=0 \\-x LD_LIBRARY_PATH -x PATH \\-mca coll_hcoll_enable 0 \\-mca pml ob1 \\-mca btl_tcp_if_include eth0 \\-mca btl ^openib \\all_reduce_perf -b 1G -e 1G -n 1000 -g 1