| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 从tensorflow集群到horovod分布式计算框架 -> 正文阅读 |
|
[人工智能]从tensorflow集群到horovod分布式计算框架 |
本文参考:https://juejin.cn/post/6844903827787743239 一、分布式训练介绍当数据较多或者模型较大时,为提高机器学习模型训练效率,一般采用多GPU的分布式训练。 两种方式——模型并行和数据并行
注意,上述中的不用GPU可以是同一台机上的多个GPU,也可以是不用机上的GPU。 数据并行的优势因为模型并行各个部分存在一定的依赖,规模伸缩性差(意思是不能随意增加GPU的数量),在实际训练中用的不多。 数据并行,则各部分独立,规模伸缩性好,实际训练中更为常用,提速效果也更好。 模型参数更新方式——同步更新,异步更新数据并行会涉及到各个GPU之间同步模型参数,一般分为同步更新和异步更新。
同步更新有等待时长,异步更新基本没有等待,但异步更新涉及到梯度过时等更复杂问题。 在实际应用中,单机多卡的同步式数据并行是最常用的,在论文中最常见的训练方式是单机八卡。数据再多时,一般就需要多机多卡了。 数据并行流程「数据并行」方法在分布式训练上包含在多节点上并行分割数据和训练。在同步情况下,不同批次数据的梯度将在不同节点上分别进行计算,但在节点之间进行互相平均,以对每个节点中的模型副本应用一致化更新。 具体算法可以简化为下面几步:
无论是单机多卡,还是多机多卡,均是分布式训练,在horovod出现之前,使用tensorflow,一般只有官方推荐的集群训练方式。可是tensorflow的集群训练,用起来并不轻松。 二、tensorflow集群缺点0 tensorflow集群简介标准分布式 TensorFlow 包使用parameter server,ps参数服务器的方法来平均梯度。在这种方法之下,每个进程都有一到两个角色:
数据传导方式为: 1 概念多,学习曲线陡峭tensorflow的集群采用的是parameter server(ps)架构,因此引入了比较多复杂概念,罗列如下:
涉及到函数:
大致是,在client中创建server实例,session与server一一对应,server内含master service和worker service两个服务,
2 修改代码量大3 需要多台机子一起运转tensorflow集群是采用parameter server架构的,要想跑多机多卡的集群,每个机子都要启动一个client,即跑一个脚本,来启动训练,100个机子,人就要崩溃了。 4 ps和worker的比例不好选取tensorflow集群要将服务器分为ps和worker两种job类型,ps设置多少性能最近并没有确定的计算公式。 如果使用一个ps,它可能会成为网络或计算瓶颈。 如果使用多个ps,则通信模式变为“All-to-All”,这可能使网络互连饱和。 5 性能损失较大tensorflow的集群性能并不好,当超过一定规模时,性能甚至会掉到理想性能的一半以下。例如,在使用 128 个 GPU 进行训练时,我们因为低效率损失了一半的计算资源。 三、Horvod由于tensorflow集群太不友好,业内也一直在尝试新的集群方案。 2017年Facebook发布了《Accurate, large minibatch SGD: Training ImageNet in 1 hour 》验证了大数据并行的高效性,同年百度发表了《Bringing HPC techniques to deep learning 》,验证了全新的梯度同步和权值更新算法的可行性。受这两篇论文的启发,Uber开发了Horovod集群方案。 1 parameter server 架构约定如下: tensorflow的集群架构是parameter server架构,数据的传导模型如下图。 则可以计算出,parameter server架构的集群方案,总耗时: 可以看出T与总节点数n基本成线性关系,但不同的参数服务器和woker服务器分配方案,总性能也将不同。 假设,
ξ
\xi
ξ表示worker服务器占比,即
ξ
=
n
w
/
n
\xi=n_w/n
ξ=nw?/n,则可以计算出最优的e值为: 2 百度的ring-allreduce算法百度2017年发表的《Bringing HPC techniques to deep learning 》中,采用了全新的梯度同步和权值同步算法,叫做ring-allreduce。此种算法各个节点之间只与相邻的两个节点通信,并不需要参数服务器。因此,所有节点都参与计算也参与存储。
可以计算出ring-allreduce算法的总耗时为: 可以看出,总耗时基本与总节点数n成线性关系(n较大时,1/n基本为0) Horovod的梯度同步和权值同步就采用了ring-allreduce算法。 3 Horovodhorovod的数据传递是基于MPI,因此其涉及的概念也是MPI中的概念。以4个服务器,每个服务器4个GPU为例,
大概就这么多概念,简单清晰。 四、实践1 SageMaker pipe mode下使用 Horovod 实现多 GPU 分布式训练pipe mode 是在训练实例和S3存储桶之间直接创建一个输入管道,允许进程直接访问对象,消除了file mode:训练之前将S3的数据复制到训练实例的工作中。在pipe mode,训练数据将作为FIFO流的形式进行交付,TensorFlow扩展的dataset类极大降低了访问流数据集的难度。 要对给定Amazon S3 URI中的数据集以管道模式加以访问,请在创建Amazon SageMaker Estimator时将输入模式设置为 Pipe ,具体参见以下代码:
当您配合Horovod使用管道模式执行单机多卡或者多机多卡的分布式训练时,有一点需要特别注意。下图所示为这类场景的基本架构。
这种方式对于Horovod多卡训练就会出错。因为Horovod在多gpu中,每个GPU都有对应的进程,启动各个进程来争夺这个FIFO流,导致多个进程无法同时访问这些FIFO。而且由于同一时间内只有单一工作进程能够访问FIFO,且在完成训练作业之前不会释放句柄,就导致所有其他工作进程无法从该FIFO中读取数据,最终令训练作业陷入死锁式的无限循环。 因此,需要对数据进行先分片,分片数量和GPU的数量对应,如果您拥有4000个TensorFlow记录文件,且使用一台带有4 GPU的ml.p3.8xlarge实例进行模型训练,则可以为互不重复的1000个TensorFLow记录文件设定不同的前缀,如以下代码所示:
使用SharedByS3Key 作为Amazon S3数据类型分配方式进行的数据集分片方法,并不完全适用于Horovod。 这是因为在使用SharedByS3Key 时,分片只会以实例为单位、而非以工作进程为单位进行,且实例中的工作进程与GPU的数量保持一致。同样的,各个实例仍然只拥有一条输入通道。因此,大家需要将数据集的分片数量,设定为与Horovod集群内GPU数相同。 接下来,我们需要为Amazon SageMaker训练定义四条输入通道,具体参见以下代码:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 15:29:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |