GPU 分布式 AI 训练加速引擎 TACO-Training 容器方案首发!
冯克环,腾讯云异构计算研发工程师,专注于云上 AI 训练加速相关技术,对 GPU 虚拟化、GPU 训练加速有深厚的积累,目前负责腾讯云 AI 训练加速相关技术的研发以及性能优化工作。
张锐,腾讯云网络虚拟化研发工程师,在之前的工作中专注于 AI 训练网络优化方面的工作,在 RDMA、GPU 通信优化等方面有较多经验,目前专注于做云上AI训练通信优化方面的工作。
背景
随着 AI 模型规模的越来越大,训练数据的越来越多,用户对模型的迭代效率也要求越来越高,单个 GPU 的算力显然无法满足大部分业务场景,使用单机多卡或多机多卡训练成为趋势。单机多卡训练场景的参数同步借助目前NVIDIA NVLINK 技术已经得到了很好地解决,而多机多卡场景由于对网络通信的强依赖就没有那么简单。目前网卡厂商提供的高速互联技术 Infiniband 或者 RoCE,使得多机通信效率大幅提升,但是成本也大大增加,如何在 25G 或 50G VPC 网络环境下提升分布式训练系统的通信效率成为公有云厂商亟需解决的问题。
目前业内有很多分布式训练的加速技术,例如多级通信、多流通信、梯度融合、压缩通信等,TACO-Training 也引入了类似的加速技术,同时 TACO-Training 不同于业界其他方案的创新点在于自定义用户态协议栈 HARP,有效地解决了 VPC 环境下多机多卡训练中的网络通信问题。
介绍
TKE 云原生 AI
TACO-Training
TACO-Training 是腾讯云异构计算团队基于 IaaS 资源推出的 AI 训练加速引擎,为用户提供开箱即用的 AI 训练套件。TACO-Training 背靠云帆 Oteam,基于腾讯内部丰富的 AI 业务场景,提供自底向上的网络通信、分布式策略及训练框架等多层级的优化,是一套全生态的训练加速方案。为了更好的服务用户,腾讯云决定公开内部深度优化的 AI 训练加速方案,助力用户节约计算成本,提高 AI 产品研发效率。
TACO-Training 在分布式场景引入的主要加速技术包括:
基于 Horovod 深度定制优化的 LightCC 通信组件,在兼容原始 API 的基础上,提供了多级通信、TOPK 压缩通信、多策略梯度融合等优化技术
自研用户态网络协议栈 HARP
HARP
支持全链路内存零拷贝,HARP 协议栈提供特定的 buffer 给应用,使应用的数据经过 HARP 协议栈处理后由网卡直接进行收发,消除内核协议栈中耗时及占用 CPU 较高的多次内存拷贝操作。
支持协议栈多实例隔离,即应用可以在多个 CPU core 上创建特定协议栈实例处理网络报文,每个实例间相互隔离,保证性能线性增长。
数据平面无锁设计,HARP 协议栈内部保证网络 session 的数据仅在创建该 session 的 CPU core 上,使用特定的协议栈实例处理。减少了内核中同步锁的开销,也降低了 CPU 的 Cache Miss 率,大幅提升网络数据的处理性能。
性能数据
network | 参数量(millions) |
---|---|
inceptionv3 | 25 |
resnet101 | 44 |
vgg16 | 138 |
transformer-xl | 257 |
部署实践
环境准备
控制台[1]创建 TKE 集群,节点可以选择8卡 V100(GN10Xp.20XLARGE320 + 25G 网络)或者8卡 A100(GT4.41XLARGE948 + 50G 网络)实例。
Ubunut Server 18.04
CentOS 7.8
Tencent Linux 2.4
控制台[2]安装 Kubeflow 组件 mpi-operator。
所有的 worker 节点配置大页内存
// 登录worker节点的主机
sudo sed -i '/GRUB_CMDLINE_LINUX/ s/"$/ default_hugepagesz=1GB hugepagesz=1GB hugepages=50"/' /etc/default/grub
// 主机OS为Ubuntu
sudo update-grub2 && sudo reboot
或者
// 主机OS为CentOS或者TencentOS
sudo grub2-mkconfig -o /boot/grub2/grub.cfg && sudo reboot
绑定弹性网卡
生成 HARP 配置文件
// 登录worker节点的主机
sudo curl -s -L
http://mirrors.tencent.com/install/GPU/taco/harp_setup.sh | bash
创建 pod
apiVersion: kubeflow.org/v1
kind: MPIJob
metadata:
name: taco-bench
spec:
slotsPerWorker: 1
runPolicy:
cleanPodPolicy: Running
mpiReplicaSpecs:
Launcher:
replicas: 1
template:
spec:
containers:
- image: ccr.ccs.tencentyun.com/qcloud/taco-training:cu112-cudnn81-py3-0.3.2
name: mpi-launcher
command: ["/bin/sh", "-ec", "sleep infinity"]
resources:
limits:
cpu: 1
memory: 2Gi
Worker:
replicas: 4
template:
spec:
containers:
- image: ccr.ccs.tencentyun.com/qcloud/taco-training:cu112-cudnn81-py3-0.3.2
name: mpi-worker
securityContext:
privileged: true
volumeMounts:
- mountPath: /sys/
name: sys
- mountPath: /dev/hugepages
name: dev-hge
- mountPath: /usr/local/tfabric/tools
name: tfabric
resources:
limits:
hugepages-1Gi: "50Gi"
memory: "100Gi"
nvidia.com/gpu: 8 # requesting 1 GPU
volumes:
- name: sys
hostPath:
path: /sys/
- name: dev-hge
hostPath:
path: /dev/hugepages/
- name: tfabric
hostPath:
path: /usr/local/tfabric/tools/
主机侧一些设备节点和配置文件需要 bind mount 到 pod 中供 HARP 使用
pod 需要配置 privileged 权限,否则 HARP 无法读取配置文件
需要给 pod 配置大页内存:hugepages-1Gi。针对八卡机器可配置 hugepages=50,其他机型建议按照 hugepages=(卡数 × 5+10)进行配置
ccr.ccs.tencentyun.com/qcloud/taco-training:cu112-cudnn81-py3-0.3.2 是 taco-training 的官方镜像,基于Ubunut 18.04/python 3.6.9/CUDA 11.2.152/CUDNN 8.1.1/NCCL 2.8.4编译产生,如果有其他的版本需求,请联系腾讯云售后支持
kubectl create -f taco.yaml
创建成功后
开始测试
下载 benchmark 脚本并拷贝到 taco 的 container 当中,
wget
https://raw.githubusercontent.com/horovod/horovod/master/examples/tensorflow/tensorflow_synthetic_benchmark.py
for i in `kubectl get pods | grep worker | awk '{print $1}'`;
do kubectl cp tensorflow_synthetic_benchmark.py $i:/mnt/; done
为了测试不同的网络模型和节点数量下的性能,mpi launcher pod 并没有配置成直接启动训练脚本方式。
//登录launcher pod
kubectl exec -it taco-bench-launcher -- bash
// 执行训练benchmark
/usr/local/openmpi/bin/mpirun -np 32 -H taco-bench-worker-0:8,taco-bench-worker-1:8,taco-bench-worker-2:8,taco-bench-worker-3:8 --allow-run-as-root -bind-to none -map-by slot -x NCCL_ALGO=RING -x NCCL_DEBUG=INFO -x HOROVOD_MPI_THREADS_DISABLE=1 -x HOROVOD_FUSION_THRESHOLD=0 -x HOROVOD_CYCLE_TIME=0 -x LIGHT_2D_ALLREDUCE=1 -x LIGHT_TOPK_ALLREDUCE=1 -x LIGHT_TOPK_THRESHOLD=2097152 -x LIGHT_INTRA_SIZE=8 -x LD_LIBRARY_PATH -x PATH -mca btl_tcp_if_include eth0 python3 /mnt/tensorflow_synthetic_benchmark.py --model=VGG16 --batch-size=128
如果需要切换到 Horovod 做对比测试,执行如下命令删除 TACO 相关组件,安装开源 Horovod:
// 卸载HARP加速库
for i in `kubectl get pods | grep worker | awk '{print $1}'`; do kubectl exec $i -- bash -c 'mv /usr/lib/x86_64-linux-gnu/libnccl-net.so /mnt/'; done
// 卸载LightCC
for i in `kubectl get pods | grep worker | awk '{print $1}'`; do kubectl exec $i -- bash -c 'pip uninstall -y light-horovod;echo'; done
// 安装horovod(耗时8分钟左右)
for i in `kubectl get pods | grep worker | awk '{print $1}'`; do kubectl exec $i -- bash -c 'export PATH=/usr/local/openmpi/bin:$PATH;HOROVOD_WITH_MPI=1 HOROVOD_GPU_OPERATIONS=NCCL HOROVOD_WITH_TENSORFLOW=1 HOROVOD_NCCL_LINK=SHARED pip3 install --no-cache-dir horovod==0.21.3'; done
// 检查确认所有的worker都已经成功horovod
for i in `kubectl get pods | grep worker | awk '{print $1}'`; do kubectl exec $i -- bash -c 'pip show horovod;echo'; done
至此我们就可以复现出前面展示的性能数据了,
4机32卡 V100:
双机16卡 A100:
总结
在相同的 25G VPC 环境下,相比于业内开源方案 Horovod,TACO 可以提供20%- 200%左右的性能提升。原理上模型参数越多,性能提升越明显; 在 50G 的 VPC 环境下,TACO 可以提供类似 100G RDMA 的训练性能;
参考资料
控制台: 【https://console.cloud.tencent.com/tke2/cluster/create?rid=8】
[2]控制台: 【https://console.cloud.tencent.com/tke2/ai/create?rid=8】
[3]云服务器控制台: 【https://console.cloud.tencent.com/cvm/index】
重 磅 来 袭
参与答题 PK 领腾讯周边啦!
如何参与?
方式一:添加小助手(腾小云:TKEplatform),进入云原生交流群
方式二:【腾讯云原生】公众号后台回复“第一期问卷”
往期精选推荐