tensorflow linux多卡训练_Horovod 弹性训练

Horovod 是一个为 TensorFlow、Keras、PyTorch 和 Apache MXNet 提供分布式训练的框架。其分布式训练是基于 AllReduce 机制来实现的,后端可以使用 MPI、NCCL 或者 Gloo 来实现 AllReduce。Horovod 在即将发布的 0.20.0 版本中增加了弹性训练功能,可以在训练过程中增加或者减少协作进程数。而且在进程数量变化时,不会中断训练任务。在分布式集群上使用弹性训练有诸多好处:

1. 可容错。当任务中的某些节点失败时,任务可继续执行,提高训练任务成功率。

2. 可扩容。当资源紧张时使用少量进程开始任务,从而快速开始模型迭代;资源充裕时,可自动扩充进程来加速训练。

3. 提高集群利用率。利用优先级调度,可以充分利用共享集群资源空闲的资源。

本文介绍 Horovod 弹性训练的原理。

Horovod 弹性训练机制

Horovod 的弹性训练包含两个角色,driver 进程和 worker 进程。driver 进程运行在 CPU 节点上,worker 进程可运行在 CPU 或者 GPU 节点上。Horovod 在单机的多个 GPU 上采用 NCCL 来通信,在多机之间通过 ring-based AllReduce 算法进行通信。Horovod 的弹性训练是指多机的弹性训练。在多机的 ring-based 通信中的每个 worker 节点有一个左邻和一个右邻,每个 worker 只会向它的右邻居发送数据,并从左邻居接受数据,如下图所示:

12cca9a6f860cc9616e5a56aaf183a5e.png
环形通信拓扑

我们将这个逻辑通信环称为一个通信域。driver 进程并不参与模型迭代和 AllReduce 的通信域。driver 进程负责在 worker 节点上启动 worker 进程,监控 worker 进程状态,并在集群中发现可用的 worker 节点,从而扩充进程数量。由于 Horovod 和分布式集群并不相关,所以在使用 Horovod 弹性训练时,需要用户指定一个 bash 脚本 discovery_host 来发现可用的 worker 节点。driver 进行会调用这个 bash 脚本来监控 worker 节点是否可用。

9bfe6a33c199bc2ffb8849f701eb3d23.png
Horovod 容错并发现新节点

当有 worker 失败或者新的 worker 加入训练时,每个 worker 会停止当前的训练,记录当前模型迭代的步数,并尝试重新初始化 AllReduce 的通信域。同时 driver 会根据当前正在运行的节点重新执行一个 rendezvous,这个 rendezvous 会存储每个 worker 的地址和给其在逻辑通信环分配的序号 rank。worker 进程可以通过这个 rendezvous 来构造新的通信域。当新的通信域构造成功后,rank=0 的 worker 会将自身的模型广播给其他 worker,然后接着上次停止的迭代步数开始训练。

369b6b89ca23e4df7590774f33bf17c2.png
Horovod 重新组网

Horovod 基于 Gloo 实现弹性训练

Horovod 的弹性训练是基于 Gloo 来实现的。当 Horovod 在调用 Gloo 来构造通信域时,Horovod 需要给 Gloo 创建一个带有 KVStore 的 RendezvousServer,其中 KVStore 用于存储通信域内每个节点的 host 和 rank 等信息。这个 RendezvousServer 运行在 Horovod 的 driver 进程里。driver 进程拿到所有 worker 进程节点的 IP 地址和 GPU 卡数信息后,会将其写入RendezvousServer 的 KVStore 中。

from 

每个 worker 节点会通过请求 RendezvousServer 获取自己的邻居节点信息,从而构造通信域。

b5d0b9af85ff43a3d1b07e9bba0abc5d.png
Worker 组网机制

Horovod 要实现弹性训练,首先需要具有容错能力。比如某些 worker 失败了,Horovod 能放弃失败的 worker,缩减 worker 数量继续训练。但是 Gloo 本身是不支持容错的。当我们构造 Gloo 的通信域后,如果某些 worker 出错了,其他的 worker 进程也会报异常退出。但是 worker 通过 Horovod 来调用 Gloo 进行梯度合并时,worker 进程可以捕获 Gloo 扔出的异常,从而通过判断异常类型决定是否继续训练。如果异常信息中包含 “HorovodAllreduce”、“HorovodAllgather” 或者 “HorovodBroadcast” 等关键字,说明通信失败了,这个通信失败可能是由于某个 worker 挂了导致的,所以其他存活的 worker 认为该异常可恢复,从而停止当前的通信域,并尝试初始化新的通信域。因为 driver 进程一直在监控 worker 的状态,当有 worker 失败时,driver 会重新获取存活的 worker 的host,重新配置 RendezvousServer,从而让 worker 节点能重新构造通信域。所以 Horovod 是可容错的。

如果 driver 发现有新的 worker 节点加入任务,driver 也会重新配置 RendezvousServer KVStore 中的节点信息,并通知正在训练的 worker 需要重新构造通信域。worker 节点收到通知后,会暂停当前训练,调用 Horovod 的 `shutdown` 和 `init` 来重新构造通信域,从而开始新的训练。

总结

Horovod 基于 Gloo 实现了多机训练的容错和弹性,可以提供作业的稳定性和资源配置的灵活性。但是想要使用 Horovod 的弹性训练,用户还需要熟悉分布式集群来开发 discovery_host 脚本来发现可用的节点,这个对数据科学家和深度学习算法研究员来说可能比较困难。如果想提高 Horovod 的弹性训练的易用性,还需要和分布式集群调度系统相结合,让用户无需关注分布式集群就能使用弹性训练。比如 ElasticDL 基于 Horovod 实现了在 Kubernetes 集群的弹性 AllReduce 训练,用户只需定义 Keras 模型即可。

扫码添加“SQLFlow君”,备注“进群”,与更多开发者提前交流互动,并获取更多开源资讯。

https://u.wechat.com/MJu9UPQdkh2yr1pvcYIgF0A (二维码自动识别)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值