Task07:分布式训练

7.1为什么分布式训练越来越流⾏

1.模型规模的扩⼤,对硬件(算⼒、内存)的发展提出要求。然⽽,因为内存墙的存
在,单⼀设备的算⼒及容量,受限于物理定律,持续提⾼芯⽚的集成越来越困难,难以
跟上模型扩⼤的需求。
2.为了解决算⼒增速不⾜的问题,⼈们考虑⽤多节点集群进⾏分布式训练,以提升算
⼒,分布式训练势在必⾏。

7.2常⻅的并⾏策略

1.简单的机器堆叠并不⼀定会带来算⼒的增⻓。因为神经⽹络的训练并不是单纯的“把
原来⼀个设备做的事情,现在分给多个设备各⾃做”,它不仅需要多个设备进⾏计算,
还涉及到设备之间的数据传输,只有协调好集群中的计算与通信,才能做⾼效的分布式
训练。
2.分布式训练中,分为“数据并⾏”和“模型并⾏”策略。

7.2.1数据并⾏

1.数据并⾏策略下,在反向传播过程中,需要对各个设备上的梯度进⾏AllReduce,以
确保各个设备上的模型始终保持⼀致。当数据集较⼤,模型较⼩时,由于反向过程中为
同步梯度产⽣的通信代价较⼩,此时选择数据并⾏⼀般⽐较有优势,常⻅的视觉分类模
型,如 ResNet50,⽐较适合采⽤数据并⾏。

7.2.2模型并⾏

1.当神经⽹络⾮常巨⼤,数据并⾏同步梯度的代价就会很⼤,甚⾄⽹络可能巨⼤到⽆法
存放到单⼀计算设备中,这时候,可以采⽤模型并⾏策略解决问题。
2.模型并⾏的好处是,省去了多个设备之间的梯度 AllReduce;但是,由于每个设备
都需要完整的数据输⼊,因此,数据会在多个设备之间进⾏⼴播,产⽣通信代价。语⾔
模型,如 BERT,常采⽤模型并⾏。

7.2.3流⽔并⾏

1.当神经⽹络过于巨⼤,⽆法在⼀个设备上存放时,除了上述的模型并⾏的策略外,还
可以选择流⽔并⾏。
2.流⽔并⾏指将⽹络切为多个阶段,并分发到不同的计算设备上,各个计算设备之间以
“接⼒”的⽅式完成训练。

7.2.4混合并⾏

1.⽹络的训练中,也可以将多种并⾏策略混⽤,以 GPT-3 为例,以下是它训练时的设
备并⾏⽅案:
	1.它⾸先被分为 64 个阶段,进⾏流⽔并⾏。每个阶段都运⾏在 6 台DGX-A100 
	主机上。在6台主机之间,进⾏的是数据并⾏训练;每台主机有 8 张 GPU 显卡,
	同⼀台机器上的8张 GPU 显卡之间是进⾏模型并⾏训练。
2.并⾏策略的选择影响着训练效率,框架对并⾏训练的接⼝⽀持程度,决定了算法⼯程
师的开发效率。OneFlow 针对分布式训练所做的系统级设计和创新,为用户轻松上手分
布式训练做足了铺垫。

7.3OneFlow 分布式训练

7.3.1OneFlow 提出了 全局视角(Global View) 的概念,用于简化分布式训练。简单而言,在 OneFlow 的全局视角下,集群被抽象为一台“超级计算设备”。

1.用户不用关心集群中计算、通信的细节,只需关心逻辑上的数据与计算,依然像单机
单卡那样思考、编程,就能进行分布式训练。
2.OneFlow 的全局视角,依赖几个重要概念:Placement、SBP 与 SBP Signature。
3.OneFlow 全局视角下的 Tensor 有 `placement` 属性,通过 `placement` 属性
可以指定该 Tensor 存放在哪个物理设备上。
4.SBP 是 OneFlow 发明的概念,描述了“超级计算设备”全局视角下的数据与集群中真
实的物理设备上的数据的映射关系,它由 `split`, `broadcast`, `partial` 的首
字母组合而成。
5.SBP 描述了全局视角下的数据与物理设备上的数据的映射关系,当进行分布式训练
时,OneFlow 根据数据的 SBP 属性,将数据分发到各个物理设备,进行计算,并输出
结果。
6.对于一个孤立的 Tensor,我们可以随意设置它的 SBP 属性。 但是,对于一个有输
入、输出数据的算子,我们却不可以随意设置它的输入、输出的 SBP 属性。这是因为
随意设置一个算子输入输出的 SBP 属性,可能不符合全局视角下算子的运算法则。
7.对于某个算子,其输入输出的一个 **特定的、合法的 SBP 组合**,称为这个算子
的一个 **SBP Signature**。
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是TensorFlow容器化分布式训练的示例代码: 首先,我们需要编写一个Dockerfile,以创建我们的容器: ``` FROM tensorflow/tensorflow:latest-gpu WORKDIR /app COPY . /app RUN pip install -r requirements.txt CMD ["python", "train.py"] ``` 接下来,我们需要编写一个启动TensorFlow分布式训练的脚本: ``` import tensorflow as tf # 设置环境变量 tf_config = { "cluster": { "worker": ["worker1:2222", "worker2:2222", "worker3:2222"] }, "task": {"type": "worker", "index": 0} } os.environ["TF_CONFIG"] = json.dumps(tf_config) # 创建分布式训练的会话 strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy() with strategy.scope(): model = create_model() model.compile(optimizer="adam", loss="mse", metrics=["mae"]) # 开始训练 model.fit(train_dataset, epochs=10, steps_per_epoch=100) ``` 在以上代码中,我们首先设置了TF_CONFIG环境变量,以指定我们的分布式集群中的工作节点。接下来,我们使用tf.distribute.experimental.MultiWorkerMirroredStrategy()创建一个分布式训练的会话。在这个会话中,我们使用create_model()函数创建我们的模型,并使用model.compile()编译它。最后,我们使用model.fit()开始训练我们的模型。 最后,我们可以使用以下命令来启动我们的容器,以进行分布式训练: ``` docker run --rm -e TF_CONFIG='{"cluster": {"worker": ["worker1:2222", "worker2:2222", "worker3:2222"]}, "task": {"type": "worker", "index": 0}}' my-tf-container ``` 在以上命令中,我们设置了TF_CONFIG环境变量,以指定我们的分布式集群中的工作节点。我们还使用--rm参数,以在容器停止时自动删除容器。最后,我们指定了我们的容器的名称(在这个例子中,我们使用my-tf-container)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值