当前位置:网站首页>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/
边栏推荐
猜你喜欢

DC-CDN学习笔记

Principle analysis of famous website msdn.itellyou.cn

2022年SQL大厂高频实战面试题(详细解析)

unicloud cloud development record

PyTorch学习笔记08——加载数据集

jenkins +miniprogram-ci upload WeChat applet with one click

为什么bash中的read要配合while才能读取/dev/stdin的内容

Sqlite A列数据复制到B列

通信原理——纠错编码 | 汉明码(海明码)手算详解

JS写一段代码,判断一个字符串中出现次数最多的字符串,并统计出现的次数JS
随机推荐
Sqlite A列数据复制到B列
Navicat从本地文件中导入sql文件
After unicloud is released, the applet prompts that the connection to the local debugging service failed. Please check whether the client and the host are under the same local area network.
qt:cannot open C:\Users\某某某\AppData\Local\Temp\main.obj.15576.16.jom for write
Pytorch学习笔记7——处理多维特征的输入
禅道安装及使用教程
纯shell实现文本替换
SSH自动重连脚本
Attention based ASR(LAS)
我的训练函数模板(动态修改学习率、参数初始化、优化器选择)
Jupyter内核正忙、内核挂掉
quick-3.5 无法正常显示有混合纹理的csb文件
Notes on creating a new virtual machine in Hyper-V
sql 外键约束【表关系绑定】
sql add default constraint
pytorch模型微调finetuning训练image_dog(kaggle)
Gradle sync failed: Uninitialized object exists on backward branch 142
podspec 校验依赖出错问题 pod lib lint ,需要指定源
VS connects to MYSQL through ODBC (1)
活体检测FaceBagNet阅读笔记