训练加速篇(3)horovod之多机多卡
horovod 多机多卡
上一篇 中介绍了如何在单机多卡下使用horovod 进行训练,本篇介绍如何在多机多卡下使用horovod 进行训练。
这篇中的测试GPU 为V100, 上篇A100 中遇到的环境问题在V100 中全都没有了,所以整个环境的搭建就异常简单了。
环境搭建
拉取最新的ngc 中的image,加载镜像并在container 中配置互相免密登陆,注意docker 启动时需要加入privileged
权限,以便docker能够访问RDMA网口
1 | docker run -itd --rm --gpus all --shm-size=32g --ulimit memlock=-1 --ulimit stack=67108864 --net=host --privileged -v /data:/data --name horovod tensorflow:22.06-tf1-py3 |
容器内互相免密
1 | # 允许root 使用ssh |
RDMA
上面提到了RDMA,这里简单介绍一下。
1 | 在数据中心领域,远程直接内存访问(英语:remote direct memory access,RDMA)是一种绕过远程主机操作系统内核访问其内存中数据的技术,由于不经过操作系统,不仅节省了大量CPU资源,同样也提高了系统吞吐量、降低了系统的网络通信延迟,尤其适合在大规模并行计算机集群中有广泛应用。 |
这段话引自wiki,通过使用RDMA技术,可以进一步提高分布式系统的整体性能。而我们使用的NCCL 进行通信,NCCL 是支持RDMA的。此外,我们使用的ngc 中是包含了RDMA 驱动的,如果image 内未安装,参考容器安装用户态 RDMA 驱动
启动训练
启动训练时,需要根据节点信息和通信方案调整参数,如在支持RDMA 下的启动命令:
1 | mpirun -np 16 -H gpu1:8,gpu2:8 --allow-run-as-root -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x NCCL_IB_DISABLE=0 -x NCCL_SOCKET_IFNAME=bond0 -x NCCL_IB_GID_INDEX=3 -x NCCL_NET_GDR_LEVEL=0 -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl_tcp_if_include bond0 -mca btl ^openib python3 train.py |
其中 :-H
后面指定节点及显卡数;-np
需要根据 -H
调整为其总计worker 数量;btl_tcp_if_include
RDMA 下为bond0,普通网络则为eth0;NCCL_SOCKET_IFNAME
为网络接口,RDMA 下为bond0,普通网络则需切换为 eth0NCCL_NET_GDR_LEVEL
为GDR 相关,GDR的概念是运行GPU 与RDMA 直接通信,开启后进一步降低通信延迟。不过GDR需要配合RDMA 一起使用;
NCCL 相关变量含义可以参考Environment Variables
性能对比
在bert-base 规模的模型上进行测试,其结果如下:
GPU | batch size per GPU | net | node | speed |
---|---|---|---|---|
A100-40g | 16 | vpc | single | 430 me/step |
V100 | 8 | vpc | single | 485 ms/step |
V100 | 8 | vpc | multi | 617 ms/step |
V100 | 8 | rdma | single | 485 ms/step |
V100 | 8 | rdma | multi | 510 ms/step |
可以看到,通过RDMA 进一步降低网络延迟后,多机多卡的加速效果接近线性加速了。如果开启GDR 网络延迟能进一步降低,加速效果应该会更解决线性加速。
ref
关于头图
可爱小猫