[源码解析] 深度学习分布式训练框架 horovod (12) — 弹性训练总体架构

0x00 摘要

Horovod 是Uber于2017年发布的一个易于运用的高性能的分布式练习结构,在业界得到了广泛应用。

本系列将经过源码剖析来带领咱们了解 Horovod。本文是监控眼系列第十二篇,看看horovod 怎样施行弹性练习。

弹性练习使得Horovod具python爬虫有作业时worker数量动态弹性,而不需求重启 或许 只是从存储中的checkpoint康复练习。

本系列其他文章链接如下:

[源码解析] 深度学习分布式练习结构 Horovod (优先级英语1) — 根底常识

[源码解析] 深度学习分布式练习python123结构 horovod (2) — 从运用者角度Python切入

[源码解析] 深度学习分布式练习结构 h优先级最高的运算符orovod (3) — Horovodrun背后做了什么

[源码解析] 深度学习分布式练习结构 horovod (4) — 网络根底优先级行列 & Driver

[源码解析] 深度学习分布式练习结构 ho优先级是什么意思rovod (5) — 交融结构

[源码解析] 深度学习分布式操监控体系练结构 horovod (6) — 后台架构

[源码解析] 深度学习分布式练习结构 ho优先级英语rovod (6) — 线程完毕

[源码解析] 深度学习分布式练习结构 horovod (优先级调度7) — Distr优先级c言语ibutedOptimizer

[源码解析] 深度学习分布式练习结构 horovod (8) — on spark

[源码解优先级排序析] 深度学习分布式练习结构 horovod (9) — 建议 on spark

[源码解析] 深度学习分布式监控器什么牌子最好清晰度高练习结构 horovod (10) — run on spark

[源码解析] 深度学习分布式练习结构 horovod (11) — on spark — GLOO 计划

0x01 总述

1.梯度自愿1 问题点

咱们考虑下,Horovod 现在遇到了什么问题?

  • 无法主动调度容量(Auto Scale)

    • 由于核算资源或许会有弹性调度,所以应该考虑到假定集群缩容了怎样办?假定扩容了怎样?志向状况应该是:在练习过程中能够python怎样读主动添加或许削减wor梯度自愿是什么意思ker数量。并且在worker数量变化时,不会中止练习使命,做到滑润优先级最高的运算符过渡。
    • 现在Horovod无法在资源有限的状况下实施。假定一共需求100个GPU,暂时只要40个GPU到位,在这种状况下,H监控怎样检查回放orovod就只能等候,不能用现优先级有的40个GPUpython123渠道登录先在少量进程上开始练习,然后无法快速开始模型迭代。
    • 资源充裕时,Horovod 无法主动添加进程加优先级速练习。就上例而言,在志向状况下,Horovoi监控d应该先用这40个优先级行列GPU构建一个环来建议练习,假定发现60个新GPU到位了就主动动态扩容,然后鄙人一个 epoch 开始就用100个GPU构建新的环开始练习;
  • 没有容错机制(Fault Tolerance)。现在假定某一个节点失利,整个练习会失利,用户只能从监控家用长途手机头开始练习。假定能够支撑 auto scale,加上一些之前陆续保存的 checkpoint,则Ho优先级调度算法rovod能够从头选取一个好节点建议这个worker,或许用剩余的节点构监控装置流程建一个环持续练习。
  • 调度机制不灵敏

    • 机器学习练习使命一般时间较长,占用算力大,而Horovod使命短少python123渠道登录弹性才干,不支撑动态装备梯度grad公式 worker,不支撑高优先级排序优先级抢占实例。因而当资源不足时,无法按需为其他高优先级事务腾出资源,只能等候使命自己主动连续或许犯错连续。

为了处理以上几个问题,咱们会考虑许多的其他详细技术问题和细节,让咱们先罗列出来:

  • 何时构建 checkpoint?哪一个阶段是适宜的?每一个 epoch 之后主动保存Python?仍是由用户自行操控(这样能够做到更好的)?
  • 怎样从 checkpoint康复?
  • chec优先级排序kpoint需求存储哪些东西,即,关于horovod来说,哪些状况是有必要的?
  • 怎样监听 worker 的监控怎样衔接手机作业状况?怎样判别机器出了问题?假定只是网络阻塞偶然导致的怎样办?
  • 需求构建一个奉告机制;
  • 怎样知道集群的充裕资源?怎样发现可用节点?
  • 怎样构建新的通讯环 ring?
  • 假定构建新rin梯度grad计算公式g,是由一个 maste优先级最高的运算符r 完毕?仍是运用相似 gossip 这样的协议?
  • 是否有优先级调度,这样能够充分运用共享集群资源空闲的资源。
  • 新 worker 怎样被 sync?
  • 原有的active worker 节点怎样处理?
  • 出问题的 worker 节点怎样处理?
  • rank 0 怎样播送?

咱们在本文以及后续各篇的剖析中试着解答这些问题。

注:Horovod现在的调度机制仍然不灵敏,不支撑抢占。

1.1 人物

Horovod 在单机的多个 GPU 之上选用 NCCL 来通讯,在多机(CPU或许GPU)之间经过 Ring AllR梯度是什么意思educe 算法进行通讯。Horovod 的弹性练习是指多机的弹性练习。

Horovod 弹性练习有两个人物:driver和 worker。dri优先级调度算法ver 进程作业在 CPU 节点上,wPythonorker 进程能够作业在 CPU 节点或许 GPU 节点之上。

Drivepython怎样读r 进程的作用是:

  • 调用 Gloo 协助 workers 结构一个 AllReduce 通讯环,或许说是通讯域。Driver 不参与详细构建通讯环,而是供给辅佐信息,然后worker能够建立环python是什么意思
    • Driver 进程需求给 Gloo 创立一个带有梯度自愿 KVStore 的 RendezvousServer,其间 KVStore 用于存储通讯域内每个节点的 host 和 其在逻辑通讯环分配的序号 rank 等信息。
    • 这个 R优先级行列ende梯度自愿和平行自愿的区别zvousServer 作业在 Horovod 的 driver 进程里。driver 进程拿到全部 worker 进程节点的地址和 GPU 卡数信息后,会将其写入RendezvousServer 的 KVStore 中,然后 worker 就能够监控摄像头软件app下载调用 gloo 来访问 Rendezvous梯度自愿是什么意思Server 结构通讯环。
  • Driverpython编程 会在 worker 节点上建议/重启 worker 进程。
  • Driver 会监控体系全体状况。

worker 负责练习和模型迭代。

  • 每个 worker优先级是什么意思 节点会向 Rendezvous梯度怎样求Server 主张恳求来得到自己的街坊节点信息,然后结构通讯环。
  • 在这个通讯环之优先级排序中,每个 worker 节点有一个左街坊和一个右街坊,在通讯过程中,每个 worker 只会向它的右街坊发送数据,只会从左街坊接受数据。

详细组网机制如下:

                         +-----梯度自愿和平行自愿的区别--------python培训班膏火一般多少------------------+
| Driver                        |
|                               |
|   +------------------------+  |
|   | RendezvousServer       |  |
|   |                        |  |
|   |                        |  |
|优先级英语   |   host1,python能够做什么作业 host2python怎样读, host3  |  |
|   +------------------------+  |
+-----优先级表--------------------------+
^       ^监控家用长途手机        ^
|       |        |
|       |        |
+------------优先级-+       |        +--------------+
|                     |                       |
|                     |                       |
|                     |                       |
v                     v                       v
+--------+----+        +-------+------+           +----+------梯度洗脱--+
|  Worker     |        |  Worker      |           |  Worker优先级是什么意思     |
+------> |             +------> |              +---------> |             | +------+
|        |      host优先级表1  |        |      host2   |           |     host3   |        |
|        +-------------+        +--------------+           +-------------+        |
|                                                                                 |
|                                                                                 |
|                                                                                 v
<--------python根底教程------------------------------------------------------------------------+

咱们下面详细分优先级排序析下各监控家用长途手机个部分。

1.2 容错机制

Horovod 的容错机制是依据 gloo 来完毕的,关于过失来说,这能够被认为是一个被逼操作。

Gloo 自身是不支撑容错的。当许多worker之间对张量进行聚合操作时分,假定某一个worker失利,则gloo不会处理异常,而是抛出异常并且退出,这样全部worker都会报异常退出。

为了不让某一个 worker 的失利导致全体练习退出,Hor优先级调度算法ovod 需监控怎样检查回放求做两方面作业:

  • 不让异常影响现python爬虫有作业优先级。Horpython培训班膏火一般多少ovod 有必要捕获 gloo 抛出的异常,所以就构建了梯度是什么意思一个python处理异常机制。
    • Worker 在捕获异常之后会将异常传递给对应的 Python API 处理,API优先级c言语 经过判别异常类型选择是否持续练习。
    • 假定异常信息中包括 “H优先级orovodAllreduce”、“HorovodAllgather” 或许 “HorovodBroadcast” 等要梯度下降法害字,阐明这或许是某个worker死掉导致的通讯监控摄像头失利,这种异常被Horovod认为是能够康复的。
  • 放弃失利的worker,运用剩余可用worker持续练习。
    • 其他存活的 worker 连续其时的练习,记载python123其时优先级c言语模型迭代的步数。
    • 此刻gloo的runtime现已出现问题,通讯环现已割裂,无法在剩余的 worker 之间持续进行 AllReduce 操作。
    • 为了能够持续练习,Horovod Driver 会从头初始化 gloo,建议一个新的 rendez监控vo优先级调度us server,然后获取存梯度是什么意思活的 worker监控装置流程 的信息,运用这监控器什么牌子最好清晰度高些worker组成新的通讯环。
    • 当新的通讯环结构成功后,rank 0 work优先级排序er 会把自己的模型播送发给其他全部worker,这样咱们就能够在一个根底上,接着前次连续的迭代开始练习python能够做什么作业

1.4 监控机制

容错机制是被逼操作,监控机制便是主动操作。

弹性就意味着分布式集群的状况会随时产生变化优先级越小越优先吗,而 Horovod 自身和分布式集群并没有监控家用长途手机相关,所以需求有一个外部途径来让 Horovod 随梯度grad计算公式时把握集群状况。

这个外部途径便是用户需求在 Horovod 建议指令中供给一个发现脚本 discovery_host。discovery_host 由用户编写,负责发现可用的 worker 节点拓扑信息。

Driver在作业之后会守时调用这个 bash 脚本来对集群监控,当worker产生变化时,discover_host 脚本会回来最新的worker状况,Driver 依据 discove监控怎样检查回放r_host 的回来值得到 worker梯度自愿 节点信息:

  • 假定Driver发现有worker失利,就捕获异常,依据优先级存活的worker信息来更新 RendezvousServer KVStore 的节点信息,呼喊咱们从头建立通讯环进行练习。
  • 假定Driver发现有新worker节点参与集群,依据现在全部worker信息来更新 RendezvousSe监控他人微信聊天记录rver KVStore 的节点信息,呼喊咱们从头建立通讯环进行练习。现有worker 节点收到奉告后,会暂停其时练习,记载现在迭代步数,调用 shutdowninit 从头结构通讯环。Dri监控眼ver也会在新节点上建议worker,扩大进程数监控器什么牌子最好清晰度高目。
  • 当新的通讯环结构成功之后,rank 0 work监控怎样衔接手机er 会把自己的模型播送发给其他全部worker,这样咱们就能够在一个根底上,接着前次连续的迭代开始练习。

这样在练习过程中,当 worker 数量有变优先级表化时,练习依梯度自愿然持续进行。

1.5 官监控眼方架构图

python是什么意思方的一优先级最高的运算符个架构监控摄像头软件app下载图如下,咱们会在后续文章中逐渐阐明图中部分:

[源码解析] 深度学习分布式练习结构 horovod (12) --- 弹性练习总体架构

0x02 示例代码

2.1 python代码

咱们从官方文档中找出 TF v2 的示例代码看看,其要害之处是运用 @hvd.elastic.run 对 train 做了一个封装,并且传入了一个 Tens优先级排序orFl优先级owKerasState。

import tensorflow as tf
import horovod.tensorflow as hvd
hvd.init(优先级表)
gpus = tf.config.experimental.list_physical_d优先级排序evices('GPU')
for gpu in gpus:
tf.config.experimental.set_mem梯度grad公式ory_growth优先级排序(gpu, True)
if gpus:
tf.config.experimental.set_visible_devices(gpus[hvd.local_rank()], 'GPU')
dataset = ...
model = ...
optimizer = tf.optimizers.Adam(lr * hvd.size())
@tf.function
def train_one_batch(data, target, allreduce=True):
with tf.GradientTape() as tape:
probs = model(data, training=True)
loss = tf.losses.categorical_crossentropy(targe梯度grad计算公式t, probs)
if allr监控摄像头软件app下载educe:
tape = hvd.DistributedGradientTape(tape)
gradients = tape.gradient(loss, model.tr监控摄像头软件app下载ainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
# Initialize model and optimizer stapython123te so we can syn优先级排序chron优先级排序ize across workers
data, target = get_randoPythonm_batch()
tra梯度自愿in_one_batch(data, target, allreduce=Fapython培训班膏火一般多少lse)
# 运用 @hvd.elastic.run 对 train 做了一个封装
@hvd.elastic.run
def train(state):
for state.epoch in rang监控眼e(state.epoch, epochs):
for state.bat监控眼ch in range(state.batch, batches_per_epoch):
data, target = get_random_batch(监控摄像头)
train_on监控摄像头e_batch(data, target)
if state.b优先级是什么意思atch % batches_per_commit == 0:
state.commit()
state.batch = 0
def优先级越小越优先吗 on_state_reset梯度洗脱():
optimizer.lr.assign(lr * hvd.size())
# 这里是新修改处,传入了一个 TensorFlowKerasState   
state = hv梯度grad计算公式d.elastic.TensorFlowK监控器什么牌子最好清晰度高erasStat监控装置流程e(model, optimizer, batch=0, epoch=0)
state.register_reset_callbacks([监控怎样衔接手机on_s监控装置流程tate_reset])
train(s监控体系ta梯度公式te)

2.2 脚本实施

弹性练习仍然运用 horovodrun 这个指令行工具跑,和普通分布python根底教程式练习不同的是,弹性练习不会在建议指令中清楚指定节点列表,而是是监控家用长途手机运用一个 发现机制 来在作业时发现节梯度下降法点。通用的python123做法是在建议 Job 时分供给一个发现梯度脚本:

horovodrun -np 18 --host-discovery-scripPythont discover_hosts.sh python train.py

此脚本用以实时反响其时可用的 hosts 以及每个 hosts 上的 slots(下文运用 discover_hosts.sh 指代该脚本,但其无需命名为 discover_hosts.sh)。

d优先级表iscover监控器什么牌子最好清晰度高_hosts.sh 脚本有必要有可实施权限,在被实施时回来可用节点列表,一行一优先级越小越优先吗监控家用长途手机节点信息,结构为: ,例如:

$ sh ./discover_hosts梯度grad公式.sh    # 作业脚本,输出节点信息
host-1:4
host-2:4
host-3:4

假定这个发现脚本作业失利(没有可实施权限)或许作业时回来非0过失码,则练习进程会立刻失利,否则会一向重试直到超时(回来的slot列表不满足最小可作业数)。

弹性练习会一向等到所需最小slots数(-np)预备监控器什么牌子最好清晰度高好之监控器什么牌子最好清晰度高后,才会开始作业练习进程,优先级c言语用户可python123渠道登录以经过 –min-np–max-np 指定最小和最大的slots数,如:

horovodrun -np 8 --min-np 4 --优先级调度算法max-np 12 --ho优先级c言语st-dis监控体系covery-script discover_ho梯度sts.sh python train.py

假定可用slots数小梯度自愿和平行自愿的区别–min-np 指定的数量时(比方某些节点毛病,使命被抢占等),使命会被暂停等候,直到更多的节点python爬虫变为生动,或python培训班膏火一般多少许超时时间 HOROVOD_ELASTIC_TIMEOUT(默许设置为600秒)到达。其他,假定不指定 –min-np ,则最小slots数会被默认为 -np 所装备的数目。

需求 –max-np 的原因是为了束缚进程数目(防止过度运用可用资源),其他在学习率和数据分区方面也能够作为参亮点(在这些状况下需求有一个固定的参看装备)。相同,假定不指定此参数,也会默认为 –np

0x03 逻辑流程

3.1 逻辑流程

咱们先解析下弹性练习的逻辑流程(为了完毕弹性练习的才干,Horovod Elastic 对 Horovod 的架构和完毕进行了必定的修改)监控他人微信聊天记录,最大的差别便是:弹性python怎样读练习需求在增删worker时分能够跟踪和同步worker的状况,详细修改如下。

  1. 聚合操作需求被定义在 hvd.el优先级最高的运算符astic.run 函数之下

    1. 将你的主练习进程代码(初始化之后的全部代码)用一个函数梯度(咱们暂时命名为 train_func)封装起来,然后运用装饰器 hvd.elastic.run 装饰这个函数。
    2. 关于这个装饰器润饰的 train_func梯度自愿和平行自愿的区别 函数,它第一个参数,有必要是 hvd.elastic.State 的实例。由于某些新参与的worker或许会处于某些不确定的状况之中,所以在作业这个被装饰函数 trai监控怎样衔接手机n_func 之前,这个状况方针需求在全部worker中进行同步,以此保证全部的worker都到达共同状况。
    3. 由于同步函数会用到集结通讯操作,并且添加worker后,生动wo监控怎样检查回放rker不会在此函数之前重置,所以不要在同步函数之前运用Horovod的集结操作(比方broadcast, allreduce, allgather)。
  2. 每个 worker 都有自己的状况(state)

    1. 把全部需求在workers之间同步的变量优先级行列都放进 hvd.elastic.State (比方model parameters,optimi优先级排序zer state,其时epoch和batch发展等等)方针之中。
    2. 关于TensorFlow,Keras和PyTorch,现已供给默许的标准状况完毕。但是,假定用户需求在某些场景播送特殊类型,能够重载定制 hvd.elas监控器什么牌子最好清晰度高tic.State 这个方针。
    3. 在作业hvd.elastic.run 函数前,此状况方优先级表针将在全部workers中同步一次,用于坚持共同性。
  3. 周期性调用 state梯度洗脱.commit() 来把状况(st优先级行列ate)备份到内存

    1. 守时备份十分有用。在某些worker产生意外过失时,守时备份能够防止由于状况被损坏而在从头练习时分无法康复现场。比方,假定一个worker刚好在更新参数过程中忽然犯错,此刻部分梯度更新完毕,部分梯度或许只更新到一半,这个状况是不可逆转而又无法持续。因而,当此状况产生时,会抛出一个 HorovodInternalError 异常,当 hvd.elastic.run 捕获到这个异常后,会运用最新一次commi优先级t中康复全部状况。
    2. 由于commit状况代价昂扬(比方如参数量太大会导致耗时过长),所以需求在”每个batch的处理时间”python爬虫与”假定犯错,练习优先级调度算法需求从多久前的状况康复”之间选取一个平衡点。比方监控装置流程,假定你每练习10个batches就commit一次,你就把拷贝时间降低了10倍。但是当产生过失时,你需求回滚到10个batches前的状况。
    3. Elastic Horowod能够经过实施咱们称之为“高雅地移除worker”操作来防止这些回滚。假定driver进程发现主机已可用或标记为删去,它将向全部workers推送一个奉告。所以鄙人次调用sta优先级表te.commit()或更轻量级的state.check_host_uppython根底教程dates()梯度grad公式,一个HostsUpdatedInterrupt异常将被抛出。此异常的处理方式与“HorovodInternalError”相似,只是参数状况不会康复到前梯度自愿次commit,而是从其时实时参数中康复。
    4. 一般来说,假定你的硬件设备是牢靠与安稳监控的,并且你的编排体系会在使命节点移除梯度洗脱时供给满足的告警,你就可python是什么意思低频次调用 state.commit() 函数,一同只在每个batch完毕时调用相对不耗时的 state.check_hpython根底教程ost_updates() 来检查节点改动状况。
  4. 在 hvd.elasticpython是什么意思.State 方针中注册一些回调函数,以便当worker成员产生变化时给予照应

    1. 比方回调监控函数能够处理如下状况:
      1. 当worker数量产生python编程改动时,学习率需求依据新的world size进行相应改动。
      2. 对数据集进行从头分区。
    2. 这些回调函数会在”Horovod被重启之后”和”状况在节点间同步之前”这两个阶段中梯度自愿是什么意思心被调用。
  5. worker 的增减会触发其他 worker 上的重置(re监控器什么牌子最好清晰度高set)作业,重置作业会激活以下几个操作(详细实施依据状况选择,不必定全部实施):

    1. 判别该 worker 是否能够持续作业。
    2. 将失效的 worker host 参与到黑名单,下一次组网不会运用blacklist中的host。
    3. 在新的 hosts 上建议 worker 进程梯度grad公式
    4. 更新每个 worker 的 rank 信息。
  6. 在重置之后,每个 work优先级越小越优先吗er 的状况会被同步

3.2 入口点

从如下代梯度grad公式码可知 hvd.elastic.run 便是 horovod/tensorflow/elastic.py 之中的 run 函数。

import horovod.tensorflow as hvd
@梯度下降法hvd.elas梯度下降法tic.ru监控怎样衔接手机n

所以咱们监控眼去这个文件中探寻。

def梯度洗脱 run(func):
from tensorflow.pypython怎样读thon.framework.errors_impl import UnknownError
def wrapper(state, *args, **kwargs):
try:
return func(state, *arpython是什么意思gs, **kwargs)
except UnknownError as e:
if 'HorovodAllreduce' in e优先级最高的运算符.message or 
'HorovodAllgather' in e.message or 
'HorovodBroad监控摄像头cast' i监控摄像头n e.message:
raise HorovodInternalError(e)
return run_fn(wrapper, _reset)

3.3 主逻监控装置流程

run_fn 函数python怎样读是关于用户代码的首要逻辑所在,位于 horovod/common/elastic.py。

其首要逻辑是:

  • 初始化 notification_manager;
  • 在 notification_manager监控摄像头 注册 state;
  • 作业 func 函数,便是用户的练习代码 train;
  • 在worker进监控家用长途手机程出现监控 Hopython123rvodInternalError 过失或许 H优先级最高的运算符ostsUpdateInterrupt 节点优先级排序增删时,会捕获这两个过失,调用 reset 来进行容错处理;
def run_fn(func, reset):
    @functools.wraps(func)
def wrapper(state, *args, **kwargs):
notification_manag梯度是什么意思er.init()
noPythontification_manager.register_listener(state)
skip_sync = F梯度是什么意思alse
try:
while True:
if not skip优先级排序_sync:
sta梯度自愿是什么意思te.s优先级表ync()
try:
return func(state, *args, **kwargs)
except Horov深度学习odInternalE监控摄像头rror:
state.梯度自愿是什么意思restore()
skip_sync = False
except HostsUpdatedInterrupt as e:
skip_sync = e.skip_sync
reset()
state.on_reset()
finally:
notification_manager.remo梯度grad公式ve_listener(state)
return wrapper

3.4 犯错处理

在犯错状况下,当worker进程出现 HorvodInternalError (代表出现过失)或许 HostsUpdateInterrupt (代表有节梯度点增删)时,Horovod 会实施如下流程:

  1. hv优先级行列d.elastic.ru梯度n 装饰器中捕获上述两个过失;
  2. 假定抛出的是 HorvodInternalError 过失,则会从最终的一次 co监控摄像头软件app下载mmit 状况中康复;
  3. 从头初始化 Horovod context,然后建议新的一轮的rendezvous,在rendezvous过程中,旧的worker会被优先被选举为新的rank-0,由于旧的worker具有前次练习中的最近状况;
  4. 新的 rank-0 worker 会把状况同步到其它workers;
  5. 持续练习;

至此,咱们现已剖析了horovod 弹性练习根本架构,下一篇咱们剖析最首要的部件:python能够自学吗Driver。

0xEE 个人信息监控他人微信聊天记录

★★★★★★关于日子和技术的考虑★★★★★★

微信大众账号:罗西的考虑

假定您想及时得到个人编撰文章的消息推送,或许想看看个人引荐的技术材料,敬请注重。梯度公式

0xFF 参看

ElasticDL调用 Horovod 在Kuber监控摄像头软件app下载netes上完毕弹性 AllReduce(一)

kubernetes 练习_在Kubernetes上运用horovod进行分布式深度学习练习

在 Kubernetespython根底教程 上弹性深度学梯度洗脱梯度grad计算公式练习利器 — Elastic Training Operat梯度自愿是什么意思or

ElasticHorovod – 弹性、容错的分布式练习 (尝鲜版)

Horo梯度自愿是什么意思vod 弹性练习

大规模机器学习结构的四重地步

发表评论

提供最优质的资源集合

立即查看 了解详情