

训练加速篇(3)horovod之多机多卡
source link: https://xv44586.github.io/2022/07/06/horovod-multi-nodes/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

训练加速篇(3)horovod之多机多卡
horovod 多机多卡
上一篇 中介绍了如何在单机多卡下使用horovod 进行训练,本篇介绍如何在多机多卡下使用horovod 进行训练。
这篇中的测试GPU 为V100, 上篇A100 中遇到的环境问题在V100 中全都没有了,所以整个环境的搭建就异常简单了。
拉取最新的ngc 中的image,加载镜像并在container 中配置互相免密登陆,注意docker 启动时需要加入privileged
权限,以便docker能够访问RDMA网口
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
容器内互相免密
# 允许root 使用ssh
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# 修改容器内 ssh 默认端口为2222,防止与 host 所使用的22端口冲突
sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
# 重启ssh 服务
service ssh restart && netstat -tulpn
# 设置 root 密码
passwd root
# SSH Key
ssh-keygen
# 创建 ~/.ssh/config,并添加以下内容后,保存并退出,完成 host alias 配置。
# !注意:
# 如果是CVM机型,则ip是两台机器`ifconfig eth0`显示的ip
# 如果是黑石RDMA机型,则ip是两台机器`ifconfig bond0`显示的ip
Host gpu1
hostname 172.0.0.1
port 2222
Host gpu2
hostname 172.0.0.2
port 2222
上面提到了RDMA,这里简单介绍一下。
在数据中心领域,远程直接内存访问(英语:remote direct memory access,RDMA)是一种绕过远程主机操作系统内核访问其内存中数据的技术,由于不经过操作系统,不仅节省了大量CPU资源,同样也提高了系统吞吐量、降低了系统的网络通信延迟,尤其适合在大规模并行计算机集群中有广泛应用。
这段话引自wiki,通过使用RDMA技术,可以进一步提高分布式系统的整体性能。而我们使用的NCCL 进行通信,NCCL 是支持RDMA的。此外,我们使用的ngc 中是包含了RDMA 驱动的,如果image 内未安装,参考容器安装用户态 RDMA 驱动
启动训练时,需要根据节点信息和通信方案调整参数,如在支持RDMA 下的启动命令:
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 网络延迟能进一步降低,加速效果应该会更解决线性加速。
Recommend
-
45
-
56
Horovod 是一套面向 TensorFlow 的分布式训练框架,由 Uber 构建并开源,目前已经运行于 Uber 的 Michelangelo 机器学习即服务平台上。Horovod 能够简化并加速分布式深度学习项目的启动与运行。通过利用消息传递接口(简称 MPI)实现应用...
-
27
Why is your Horovod slower than the usual?
-
14
How to get started with distributed training of DNNs using Horovod.
-
12
Tensorflow的多卡训练:原理和实践当我们拥有大量的数据后,尤其是大规模文本、多模态、视频序列数据及其使用大型预训练模型等等情况下,训练好一个模型不得不借助分布式策略来提高计算资源的使用效率,进而缩短模型的训练时间。文本总结一下Tensorflo...
-
7
Tensor2Tensor T2T库利用TensorFlow工具来开发,定义了一个深度学习系统中需要的多个部分:数据集、模型架构、优化工具、学习速率衰减计划,以及超参数等等。 最重要的是,T2T在所有这些部分之间实现了标准接口,并配置了当前机器学习的最佳...
-
6
horovod 实现分析 发表于 2019-08-30...
-
12
训练加速篇(2)-horovodhorovodhorovod是Uber 团队开发的分布式训练框架,他可以满足让你尽量少的修改代码即可将在单卡训练的脚本横行扩展为多卡并行训练,...
-
7
V2EX › 问与答 jellyfin 转码,为什么多卡 3090 只有一张卡能被利用?
-
3
使用Pytorch进行多卡训练 2022-10-12 14:131820
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK