OneFlow 并行特色
OneFlow 并行特色
在 Consistent 与 Mirrored 视角中,已经知道 OneFlow 提供了 mirrored 与 consistent 两种看待分布式系统的视角,并且提前知道了 OneFlow 的 consistent 视角颇具特色。
因为在 consistent_view 下,OneFlow 提供了逻辑上统一的视角,分布式训练时,用户可以自由选择数据并行、模型并行还是是混合并行。
本文继续深入介绍 OneFlow 独具特色的 consistent 视角,包括:
- OneFlow 在 consistent_view 下纯数据并行流程示意
- OneFlow 在 consistent_view 下混合并行流程示意
- 混合并行的优势及适用场景
- OneFlow 混合并行实例
网络模型训练的逻辑图
先设定一个简单的多层网络,作为讨论并行方式的载体,其结构如下图所示:
各层中,有 样本 (灰色矩形)、 模型 (蓝色矩形),以及作用在两者之上的 op (圆形),为了简化讨论,也可将样本与模型限定为 矩阵 ,作用在它们之上的op为 矩阵乘法 。
对照上图,很容易梳理出该网络模型的逻辑:
- 第0层的输入为 Data 0 矩阵与 Model 0 矩阵,它们进行 op (矩阵乘法)运算后,输出 Data 1
- 第1层的输入为 Data 1 矩阵与 Model 1 矩阵,它们进行 op 运算后,输出 output
- 第2层为 output 层,Data 2 作为整个网络的输出;当然,在更深的网络中,它也可以作为下一层的输入继续参与训练
consistent 视角下支持数据并行、模型并行与混合并行,将依次进行介绍,其中混合并行是重点。
Consistent 视角下的并行特色
纯数据并行
已经知道,consistent 视角下,默认的并行方式是数据并行;而如果选择 mirrored 视角,则只能采用数据并行;若在调用作业函数时直接传递 numpy 数据(而不是使用 OneFlow 的 DataLoader 及相关算子),两者的区别在于:
- mirrored 视角下,采用纯数据并行,需要自己根据参与训练的卡数对数据进行切分、重组,使用 list 传递和接收数据;
- 而 consistent 视角下提供了逻辑上的统一看待,数据的切分和重组交给了 OneFlow 框架完成。
下图是 consistent 视角下,采用纯数据并行的方式,实现原逻辑网络模型的流程示意图:
在纯数据并行中,采用了2张显卡进行并行训练,因为采用了 纯数据并行 ,可以看到,对于原逻辑模型中的每一层,样本数据都被平均分配到了各个卡上,每张卡上都拥有 完整的模型,与切分的数据进行 op 运算,最后组合各个卡上的样本,得到完整的输出。
纯模型并行
在 consistent 视角下,也可以通过选择纯模型并行(设置方式在下文实例中会介绍),其流程示意图为:
在纯模型并行中,同样是2张显卡进行并行训练,原逻辑模型中的每一层中,都是 部分模型 与 完整的数据 进行 op 运算,最后组合得到完整的输出。
值得一提的是,从上图可以看出,各个卡上第0层的输出,并 不能 直接作为第1层的输入:因为模型并行中,为完成 op 操作,需要部分的模型与 完整的 数据;为了解决这个问题,OneFlow 中使用了 boxing 机制。
boxing 机制会统筹分布式训练中各个节点的数据,并合理切分、合并到对应的卡上,除了模型并行过程中的数据重组问题外,数据并行中的反向梯度同步,也使用 boxing 机制解决。
boxing 的内部机制虽然复杂,但是对于用户而言是透明的,仅仅是防止读者产生迷惑才加入了 boxing 的图示,对于本文而言,只需要了解:OneFlow 会自动协调好分布式中数据的同步问题。
选择最优的并行方式
数据并行与模型并行的优劣并不是一成不变的,样本规模、模型规模及模型结构决定了分布式训练中的综合表现,需要具体情况具体分析。
概括而言:
- 数据并行情况下,需要同步的信息是反向传播过程的 梯度,因此应该确保各个训练节点之间的信息同步速度要比节点内部的计算速度快,比如说 卷积层 的参数较少,但是计算量大,就比较适合使用数据并行;
- 模型并行情况下,因为可以将逻辑上作为整体的模型 切分到各个物理卡 上,能够解决“模型太大,一张卡装不下”的问题,因此,对于参数量大的神经网络层(如最后的全连接层),可以考虑使用模型并行。
实际上,也可以使用 混合并行,在同一个分布式训练的不同部分,组合使用数据并行、模型并行。比如,对于神经网络中靠前的参数较少、计算量大的层,采用数据并行;在最终的参数众多的全连接层,则采用模型并行,以下是针对本文最开始的网络模型逻辑图的 混合并行 实现方案的示意图:
目前,其它的主流框架对于混合并行或者不支持,或者需要深度定制,而 OneFlow 中可以通过简单的设置,配置混合并行的分布式训练,还可以用自由度超高的流水并行,深度优化分布式系统。
混合并行实例
代码
以下脚本,在 consistent 视角下,对 MLP 模型采用了混合并行方案:输入层与隐藏层采用(默认的)数据并行;输出层采用模型并行并进行列切分。
更具体的解析在后文“代码解读”可见。
代码解读
以上脚本修改自3分钟快速上手中的示例代码,比较两份代码,也可以体会到在 OneFlow 的 consistent_view 下进行各种并行方案的配置是多么的简单,只需要在单机的程序上稍加修改即可。
以上程序的关键部分有:
- 通过 oneflow.config.gpu_device_num 接口设置参与训练的GPU数目:
- flow.config.gpu_device_num(2)
- reshape 及 hidden 采用默认的数据并行,不需要修改;输出层通过设置 model_distribute 为 flow.distribute.split(axis=0) 变为模型并行:
- def mlp(data):
- initializer = flow.truncated_normal(0.1)
- reshape = flow.reshape(data, [data.shape[0], -1])
- hidden = flow.layers.dense(
- reshape,
- 512,
- activation=flow.nn.relu,
- kernel_initializer=initializer,
- name="dense1",
- )
- return flow.layers.dense(
- hidden,
- 10,
- kernel_initializer=initializer,
- # dense为列存储,进行split(0)切分
- model_distribute=flow.distribute.split(axis=0),
- name="dense2",
- )
有读者可能好奇为什么split(axis=0)是列切分?需要说明的是,OneFlow 中的 dense 内部采用列存储,因此以上代码的flow.distribute.split(axis=0)确实是在做列切分。
此外,flow.layers.dense 使用 model_distribute 形参设置并行方式,其内部调用了底层更通用的 get_variable 接口创建 blob, get_variable 接口设置并行方式的形参名为 distribute。
可以看到,通过极少量的修改,就能将单机训练程序改为分布式、混合并行的程序,这是 OneFlow 区别于其它框架的一大特色。
流水并行实例
在模型并行之外,OneFlow 还提供了一种灵活度更高的“流水并行”的并行方式,可以让用户使用 scope.placement 接口显式指定用来运行逻辑 op的 物理硬件。
在流水并行中,整个神经网络有的层次在一组物理设备上,另外一些层次在另外一组物理设备上,接力协同工作,分多个阶段,在设备之间流水执行。
在以下示例中,对 Consistent 与 Mirrored 视角中的“在 OneFlow 中使用 consistent 视角”代码进行简单修改,展示了流水并行模式。
代码
完整代码:hybrid_parallelism_lenet.py
更详细的讨论可见后文的“代码解读”。
代码解读
以上关键的代码只有2行,且他们的本质作用是类似的:
- 通过 oneflow.scope.placement ,指定 hidden 层的 op 计算运行在0号 GPU 上
- with flow.scope.placement("gpu", "0:0"):
- hidden = flow.layers.dense(
- reshape,
- 512,
- activation=flow.nn.relu,
- kernel_initializer=initializer,
- name="hidden",
- )
- 通过 oneflow.scope.placement ,指定 output 层的op计算运行在第0号主机的1号 GPU 上
- with flow.scope.placement("gpu", "0:1"):
- output = flow.layers.dense(
- hidden, 10, kernel_initializer=initializer, name="outlayer"
- )
scope.placement 的具体使用,可参阅 API 文档。
流水并行,使得用户可以为每个 op 指定物理设备,非常适合对网络模型及分布式情况都很熟悉的用户进行 深度优化 。
此外,OneFlow 提供的 API oneflow.unpack、oneflow.pack 等,结合了 OneFlow 自身任务调度的特点,使得流水并行更易用、高效,将在另外的文章中专门介绍。
OneFlow 并行特色的更多相关文章
- OneFlow系统设计
OneFlow系统设计 本文的主要内容如下: OneFlow 的设计目标 OneFlow 的特色一:Actor 机制 OneFlow 的特色二:SBP 机制 总结 一.OneFlow 的设计目标 On ...
- AI推理与Compiler
AI推理与Compiler AI芯片编译器能加深对AI的理解, AI芯片编译器不光涉及编译器知识,还涉及AI芯片架构和并行计算如OpenCL/Cuda等.如果从深度学习平台获得IR输入,还需要了解深度 ...
- Consistent 与 Mirrored 视角
Consistent 与 Mirrored 视角 在进行分布式训练时,OneFlow 框架提供了两种角度看待数据与模型的关系,被称作 consistent 视角与 mirrored 视角. 本文将介绍 ...
- 严谨与特色并行——WSDM 2015大会见闻记
2015大会见闻记" title="严谨与特色并行--WSDM 2015大会见闻记"> 第8届ACM网络搜索与数据挖掘会议(ACM International Co ...
- 让AI简单且强大:深度学习引擎OneFlow技术实践
本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...
- 项目版本与分支管理之阿里AoneFlow模式分析
前言 在我前期的项目管理的经验中,一个项目需要维护多个产品及多个版本,这给版本与分支的管理增加了难度.前期没有重视,使得分支太多太乱,版本也没记录好,引发了很多的问题.在多种分支与版本的管理模式下,最 ...
- 企业代码版本管理之争:TrunkBased vs GitFlow vs AoneFlow vs OneFlow vs ExeFlow
目录 引言 TrunkBased GitFlow AoneFlow OneFlow ExeFlow 综述 引言 网络上版本管理系统之争持久而喧嚣,依照声量来讲目前应该是Git占了较大的优势.不过我们本 ...
- Wide & Deep的OneFlow网络训练
Wide & Deep的OneFlow网络训练 HugeCTR是英伟达提供的一种高效的GPU框架,专为点击率(CTR)估计训练而设计. OneFlow对标HugeCTR搭建了Wide & ...
- OneFlow 概念清单
OneFlow 概念清单 本文将对 OneFlow 中涉及到的,常用的一些概念/名词做一个概括性的解释.主要内容针对算法工程师和框架开发者分为以下两部分: 算法开发 框架开发 在算法开发部分,将解释深 ...
随机推荐
- 5-tcp套接字服务端编程
import socket 1.创建套接字 sockfd= socket.socket(socket_family = AF_INIT,socket_type=SOCK_STREAM,proto) 功 ...
- system分区解锁
前言 获取root权限,解锁system 步骤 手机设置 设置--更多设置--开发者选项--USB调试给打开 电脑操作 打开cmd adb devices 执行命令 adb root &&am ...
- 一种Maven项目启动时不编译java文件的解决方案
问题 前提介绍 : 环境版本 : JDK -version : 1.8.0-251 Tomcat -version : 8.5.5 Maven -version : 3.6.3 项目情况描述 使用ID ...
- layui中的视频上传(PHP )
1.html中: <div class="layui-form-item"> <label class="layui-form-label"& ...
- vmware vpshere 安装完的必备工作
1:例如:vCenter计算机地址为:192.168.0.200, 访问地址:https://192.168.0.200,安装证书: 参考教程:https://blog.csdn.net/cooljs ...
- 通过Python将监控数据由influxdb写入到MySQL
一.项目背景 我们知道InfluxDB是最受欢迎的时序数据库(TSDB).InfluxDB具有 持续高并发写入.无更新:数据压缩存储:低查询延时 的特点.从下面这个权威的统计图中,就可以看出Influ ...
- [软件开发的目录规范、区分py文件的两种用途]
[软件开发的目录规范] 软件开发的目录规范 bin: 执行文件 conf: 存放配置文件相关代码 core: 存放源文件,业务逻辑相关代码 db: 存放数据库文件,主要用于与数据库交互 lib: 存放 ...
- 服务器开发基础-Tcp/Ip网络模型—完成端口(Completion Port)模型
本文对于初学网络编程的极为友好,文中所有代码全部基于C语言实现,文中见解仅限于作者对于完成端口的初步认识,由于作者才疏学浅,出现的错误和纰漏,麻烦您一定要指出来,咱们共同进步.谢谢!!! 完成端口(c ...
- 『政善治』Postman工具 — 13、Postman接口测试综合练习
目录 (一)项目接口文档 1.鉴权接口 2.注册接口 3.登录接口 4.用户信息接口 5.注销接口 (二)网站上手动验证 (三)Postman测试实现 1.准备工作 (1)创建一个Collection ...
- 透过“锁”事看InnoDB对并发的处理?
一. 并发场景下的问题 相对于串行处理方式,并发的事务处理可显著提升数据库的事务吞吐量.提高资源利用率.在MySQL实际应用中,根据场景的不同,可以分为以下几类: 读读并发 读写并发 写写并发 在这些 ...