当前位置:网站首页>Tensorflow——demo
Tensorflow——demo
2022-07-31 05:16:00 【Young_win】
分布式训练
总的来说,分布式训练分为这几类:
按照并行方式来分:模型并行 v.s. 数据并行
按照更新方式来分:同步更新 v.s. 异步更新
按照算法来分:Parameter Server算法 v.s. AllReduce算法
(1)如果有n张GPU,当模型非常大,一张GPU存不下时,使用模型并行——把模型的不同部分交给不同的机器负责,但是这样会带来很大的通信开销,而且模型并行各个部分存在一定的依赖,规模伸缩性差。因此,通常一张GPU可以放下一个模型的时,会采用数据并行的方式,各部分独立,伸缩性好。
模型并行:不同的GPU-输入相同的数据,运行 模型的不同部分,比如多层网络的不同层;
数据并行:不同的GPU-输入不同的数据,运行 相同的完整的模型。
(2)数据并行时,每个GPU负责一部分数据,更新参数分为同步更新和异步更新两种方式。
同步更新:每个batch 所有GPU计算完成后,统一计算新权值,所有GPU同步新值后,再进行下一轮计算。
异步更新:每个GPU计算完梯度后,无需等待其他更新,立即更新整体权值并同步。
(3)参数同步的算法:PS 和 Ring AllReduce。
如果有5张GPU卡:
Parameter Server:GPU 0将数据分成五份分到各个卡上,每张卡负责自己的那一份mini-batch的训练,得到grad后,返回给GPU 0上做累积,得到更新的权重参数后,再分发给各个卡。
Ring AllReduce:5张以环形相连,每张卡都有左手卡和右手卡,一个负责接收,一个负责发送,循环4次完成梯度累积,再循环4次做参数同步。分为Scatter Reduce和All Gather两个环节。
PS每一轮的训练迭代都需要 所有卡都将数据同步完 做一次Reduce才算结束,并行的卡很多的时候,木桶效应就会很严重,计算效率低。
tensorflow单机多卡训练
TensorFlow在1.13版本里发布的tf.distribute API 支持单机多卡分布式训练。
该API支持各种分布式Strategy切换:
MirroredStrategy
用于单机多卡 数据并行 同步更新的情况,在每个GPU上保存一份模型副本,模型中的每个变量都镜像在所有副本中。这些变量一起形成一个名为MirroredVariable的概念变量。通过apply相同的更新,这些变量保持彼此同步。镜像策略用了高效的All-reduce算法来实现设备之间变量的传递更新。默认情况下,它使用NVIDIA NCCL作为all-reduce实现。用户还可以在官方提供的其他几个选项之间进行选择。CentralStorageStrategy
中央存储策略,参数被统一存在CPU里,然后复制到所有GPU上,优点是GPU负载均衡了,但是一般情况下CPU和GPU通信代价大,不建议使用。MultiWorkerMirroredStrategy
这个API和MirroredStrategy很类似,是其多机多卡分布式的版本。ParameterServerStrategy
这个API呢,就是被大家普遍嫌弃即将淘汰的PS策略,慢+负载不均衡。(和all-reduce的区别)
#Estimator
mirrored_strategy = tf.distribute.MirroredStrategy()
# 在config中加入镜像策略
config = tf.estimator.RunConfig(train_distribute=mirrored_strategy, eval_distribute=mirrored_strategy)
# 把config加到模型里
regressor = tf.estimator.LinearRegressor(
feature_columns=[tf.feature_column.numeric_column('feats')],
optimizer='SGD',
config=config)
def input_fn():
dataset = tf.data.Dataset.from_tensors(({
"feats":[1.]}, [1.]))
return dataset.repeat(1000).batch(10)
# 正常训练,正常评估
regressor.train(input_fn=input_fn, steps=10)
regressor.evaluate(input_fn=input_fn, steps=10)
分布式环境下的异步训练
worker本身做梯度计算
parameter server 进行参数的更新和参数的存储
不同worker之间参数更新不等待————异步更新:
1.梯度补偿:对一阶梯度函数泰勒展开
2.有限度的异步[QueueRunner]
参考:
https://fyubang.com/2019/07/08/distributed-training/
边栏推荐
猜你喜欢
随机推荐
The browser looks for events bound or listened to by js
一个简单的bash转powershell案例
Pytorch实现ResNet
pytorch学习笔记10——卷积神经网络详解及mnist数据集多分类任务应用
powershell statistics folder size
MYSQL transaction and lock problem handling
js中的函数
qt:cannot open C:\Users\XX\AppData\Local\Temp\main.obj.15576.16.jom for write
cocos2d-x-3.2创建项目方法
腾讯云轻量服务器删除所有防火墙规则
2022年SQL大厂高频实战面试题(详细解析)
WeChat applet source code acquisition and decompilation method
VS通过ODBC连接MYSQL(一)
break and continue exit in js
Why does read in bash need to cooperate with while to read the contents of /dev/stdin
Nmap的下载与安装
Filter out egrep itself when using ps | egrep
Attention based ASR(LAS)
Hyper-V新建虚拟机注意事项
活体检测CDCN学习笔记









