corr2018|horovod:fastandeasydistributeddeeplearningintensorflow(代码片段)

littleorange littleorange     2023-04-08     461

关键词:

将深度学习模型的训练从单GPU扩展到多GPU主要面临以下问题:(1)训练框架必须支持GPU间的通信,(2)用户必须更改大量代码以使用多GPU进行训练。为了克服这些问题,本文提出了Horovod,它通过Ring Allreduce实现高效的GPU间通信,而且仅仅更改少量代码就可以实现多GPU训练。

TensorFlow中提供了一些分布式训练的API,这些API适用于不同的环境。这就导致用户往往不知道如何更改代码以进行分布式训练,而且debug也很困难。再者,TensorFlow的分布式训练性能与理想的性能相差甚远,尤其是在大规模GPU环境下。如图1所示,随着GPU数量的增加,分布式TensorFlow的吞吐量与理想的吞吐量的差距逐渐增加,加速比逐渐降低。

技术图片

因为目前单GPU可以容纳大部分深度学习模型,所以本文主要针对数据并行进行优化。首先来看一下数据并行的训练过程:

  1. 运行多个模型副本
    (a) 读取一部分数据
    (b) 把数据喂给模型,进行前向传播
    (c) 反向传播,计算梯度
  2. 将多个模型的梯度进行平均
  3. 更新模型
  4. 重复上述步骤直到模型收敛

技术图片

在标准的TensorFlow中,分布式训练使用参数服务器架构,如图3所示。在参数服务器架构中,主要有worker和server两种角色。worker负责处理数据,计算梯度然后把梯度传给server;server负责聚合梯度,更新模型,然后把模型传回worker。

技术图片

在这上述两种模式下,主要有以下两个挑战:

  1. 如何确定worker和server的数量。如果只使用1台server,那么这台server可能成为计算和网络瓶颈;如果使用多台server,那么通信模式就类似于all-to-all,这样就不能完整利用网络带宽。
  2. 处理愈加复杂的TensorFlow程序。在TensorFlow中,必须显式地启动worker和server,传递一堆参数然后更新代码,这就使得分布式训练变得非常繁琐复杂。

所幸的是,2017年百度提出了一种名为Ring Allreduce的算法。在该算法中,所有worker组成一个环,每台worker只和相邻的两台worker通信,如图4所示。

技术图片

在Ring Allreduce中,如果有(N)个节点,那么每个节点会通信(2 imes (N -1))次:前(N-1)次接收值并把它加到对应的buffer中,后(N-1)次接收并替换对应buffer中的值。Ring Allreduce算法是带宽最优的,也就是说,当buffer足够大时,它会最大限度地利用网络带宽。

综上所述,本文取长补短,使用Ring Allreduce算法优化TensorFlow的分布式训练过程。本文的实现流程如下:

  1. 将代码转换成独立的Python包,名为Horovod
  2. 将百度的Ring Allreduce实现替换为NCCL
  3. 增加了对单机多GPU训练的支持
  4. 根据反馈更新了部分API,还实现了一个广播操作,以在所有worker上进行强制一致性初始化
import tensorflow as tf
import horovod.tensorflow as hvd

# Initialize Horovod
hvd.init()

# Pin GPU to be used to process local rank (one GPU per process)
config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

# Build model...
loss = ...
opt = tf.train.AdagradOptimizer(0.01)

# Add Horovod Distributed Optimizer
opt = hvd.DistributedOptimizer(opt)

# Add hook to broadcast variables from rank 0 to all other process
# during initialization.
hooks = [hvd.BroadcastGlobalVariablesHook(0)]
train_op = opt.minimize(loss)

# The MonitoredTrainingSession takes care of session initialization,
# restoring from a checkpoint, saving to a checkpoint, and closing
# when done or an error occurs.
with tf.train.MonitoredTrainingSession(checkpoint="/tmp/train_logs", 
                                       config=config, hooks=hooks) as mon_sess:
    while not mon_sess.should_stop():
    # Perform synchronous training
    mon_sess.run(trian_op)

此外,Horovod还提供了一个名为Timeline的分析工具,它可以让用户每个节点在每次迭代时做了什么,效果如图5所示。

技术图片

使用Timeline对一些模型进行分析后,发现当张量较小时,Ring Allreduce的效率并不高。因此,本文提出一种名为张量融合的技术来解决上述问题。

  1. 检测哪些张量将会被规约,选择适合缓冲区并具有相同数据类型的前几个张量
  2. 申请张量融合所需的缓冲区(如果之前没有申请的话),默认大小为64M
  3. 将选择的张量拷贝到融合缓冲区
  4. 在融合缓冲区执行allreduce操作
  5. 将数据从融合缓冲区拷贝到输出张量
  6. 重复上述步骤直到环中没有要被规约的向量

使用Horovod之后,Inception V3和ResNet-101模型的性能提升了约88%,如图6所示。

技术图片

如图7,RDMA网络并没有比传统的TCP提升多少性能,只提升了约4%。

技术图片

未来的工作主要包括:

  1. 让MPI的安装变得更容易
  2. 分布式深度学习模型调参经验的收集与分享
  3. 增加大型模型的示例

pandas .corr() 方法的进度条

】pandas.corr()方法的进度条【英文标题】:Progressbarforpandas.corr()method【发布时间】:2020-08-2612:48:43【问题描述】:我正在尝试使用tqdm或其他库在以下代码行中显示进度条:corrmatrix=adjClose.corr(\'spearman\')其中adjClose是一个dataframe,它... 查看详情

Pandas .corr() 返回“__”

】Pandas.corr()返回“__”【英文标题】:Pandas.corr()returning"__"【发布时间】:2019-08-1013:55:54【问题描述】:它工作得很好,直到它没有,并且不知道我做错了什么。我已将其简化为一个非常简单的数据集t:12345678031632172321316... 查看详情

python中corr函数错误

参考技术Apython中corr函数错误原因,在Python中,所有代码都是通过正确的空格排列的。所以,无论是多出来空格,还是缺少空格,整个代码都不会运行,并且仅返回一个错误函数。 查看详情

python机器学习:corr()分析变量之间的相关关系(代码片段)

...共线性的情况下会影响模型的精度,这里用相关矩阵corr()和热力图heatmap()可以直观地观察变量之间的相关关系,进而判断是否要对自变量进行删除,或者降维的操作。首先用corr()构造相关矩阵研究变量之间的相关关系... 查看详情

python - 无法使 corr 工作

】python-无法使corr工作【英文标题】:python-cannotmakecorrwork【发布时间】:2017-03-2002:20:27【问题描述】:我正在努力完成一个简单的关联。我已经尝试了类似问题下的所有建议。以下是代码的相关部分、我所做的各种尝试及其结果... 查看详情

对sklearn束对象虹膜使用corr()方法

】对sklearn束对象虹膜使用corr()方法【英文标题】:Usingcorr()methodforsklearnbunchobjectiris【发布时间】:2019-03-1815:48:04【问题描述】:我假设在下面的代码中,iris是专门为sklearn/datasets制作的一堆对象。#importload_irisfunctionfromdatasetsmodule... 查看详情

python计算相关性(代码片段)

...61;data.drop(['experiment'],axis=1)#计算不同的相关系数corr=df.corr(method='pearson')print(corr)print('\\n-----------------------------------------------------------------------------------------------\\n')corr=df.corr(method='spearman')pri... 查看详情

python计算相关性(代码片段)

...61;data.drop(['experiment'],axis=1)#计算不同的相关系数corr=df.corr(method='pearson')print(corr)print('\\n-----------------------------------------------------------------------------------------------\\n')corr=df.corr(method='spearman')pri... 查看详情

函数 corr(双精度, 双精度) 不存在 -- PostgreSQL

】函数corr(双精度,双精度)不存在--PostgreSQL【英文标题】:functioncorr(doubleprecision,doubleprecision)doesnotexist--PostgreSQL【发布时间】:2016-08-1723:02:17【问题描述】:您好,当我在PostgreSQL中运行简单的关联查询时selectcorr(m07_selling_price_total... 查看详情

r中的熔解相关矩阵(代码片段)

我用R创建了一个相关矩阵:cor(df,use="p")->df_corr然后我使用以下方法熔化矩阵:melt(df_corr)->df_corr_melted要得到:Var1Var2valueAB.1AC.2AA1BA.1BC.4BB1CA.2CB.4CC1我想删除还原剂对。例如,我只需要corr(A,C)而不是corr(C,A)。我通读了dp... 查看详情

cosi-corr操作详细步骤

实验数据:http://pan.baidu.com/s/1i3xIsXf(spotdata)两幅图像包围整个地震事件,在相关之前,必须清除图像中的几何伪影(如地形),并精确地配准。  1. 定义两幅图像的Ancillarydata(satellite) 此功能(“SatelliteImagery&rar... 查看详情

seaborn 热图显示轴标签,但当 df.corr 为 NaN 时没有值

】seaborn热图显示轴标签,但当df.corr为NaN时没有值【英文标题】:seabornheatmapdisplaysaxislabels,butnovalueswhendf.corrisNaN【发布时间】:2021-12-2006:27:41【问题描述】:我正在尝试为相关性提供热图,但我意识到有些是错误的。下面是我的... 查看详情

r语言为啥corr.test计算出来的p值全是1

R语言使用corr.test计算相关性矩阵,结果里有一个P值矩阵,但是为什么矩阵的上三角P值全是1而下三角是正常的呢corr.test默认进行holm法对P值进行校正,上三角是校正后的结果,下三角是原始P值,出现这种情况说明你的显著性校... 查看详情

我需要使用 python 在具有 144 列的数据集上创建 corr 矩阵

】我需要使用python在具有144列的数据集上创建corr矩阵【英文标题】:Ineedtocreatecorrmatrixondatasetwith144columnsbyusingpython【发布时间】:2020-09-2621:18:31【问题描述】:。但是当我尝试这样做时,我得到了一个糟糕的结果(你可以在图片... 查看详情

求相关系数矩阵(代码片段)

...City-2014‘)#读取数据,指定“城市”列为索引列xishu=data.corr()print(data.corr())#相关系数矩阵,即给出了任意两款菜式之间的相关系数print("显示“城市火灾”与其他的相关系数:")print(data.corr()[u‘森林火灾‘])#只显示“森林火灾”与... 查看详情

Spark 中非常大的 RDD[Vector] 的 Statistics.corr 导致达到生成的代码限制:如何修复?

】Spark中非常大的RDD[Vector]的Statistics.corr导致达到生成的代码限制:如何修复?【英文标题】:Statistics.corrofverylargeRDD[Vector]inSparkCausesGeneratedCodeLimitstoBeReached:HowtoFix?【发布时间】:2016-02-0317:20:15【问题描述】:我有一个包含任意... 查看详情

使用spark下的corr计算皮尔森相似度pearson时,报错canonlyziprddswithsamenumberofelementsineachpartition....

packagecom.huawei.bigdata.spark.examplesimportorg.apache.spark.mllib.stat.Statisticsimportorg.apache.spark.sql.types.DoubleTypeimportorg.apache.spark.{SparkConf,SparkContext}/***Createdbywuleion2017/8 查看详情

zuoye(代码片段)

...v\'data=pd.read_csv(shuju)print(data)print(data.describe())#相关性分析corr=data.corr(method=\'pearson\')print(\'相关系数矩阵为:\\n\',np.round(corr,2))plt.subplots(figsize=(10,10))sns.heatmap(corr,annot=True,vmax=1,square=True,cmap="Blues")plt.title("相关性热力图")plt.show()plt.cl... 查看详情