Tensorflow分布式训练

   该篇博客主要写tensorflow2的分布式训练方法。
   tf.distribute.Strategy是一种可以GPU,TPU或者机器(电脑)并行运算的分布式训练方法。使用这个API只需少量代码就可以使用分布式训练。你也可以利用keras API使用tf.distribute.Strategy。

# Import TensorFlow
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf

  tf.distribute.Strategy包括了多了不同的形式Strategy,它们可以按以下形式区分:
1.同步和不同步 2.多个,单个或0个GPU在同一个机器或者不同机器,甚至在TPU云上
  一共有以下Strategy:
1.MirroredStrategy 2.TPUStrategy 3.MultiWorkerMirroredStrategy 4.CentralStorageStrategy 5.ParameterServerStrategy 6.OneDeviceStrategy

MirroredStrategy

tf.distribute.MirroredStrategy支持一台机器上多个GPU同步分布式训练,每个GPU设备创建一个复制。模型中的变量在每个GPU上都有复制。这些变量叫做镜像变量。这些变量通过更新,保持一致。
你可以使用以下代码创建,一个GPU:

mirrored_strategy = tf.distribute.MirroredStrategy()

或者多个GPU

mirrored_strategy = tf.distribute.MirroredStrategy(devices=["/gpu:0", "/gpu:1"])

PS:设备之间有多种reduce更新方式,可供选择:
HierarchicalCopyAllReduce
ReductionToOneDevice
NcclAllReduce(默认)
使用如下:

mirrored_strategy = tf.distribute.MirroredStrategy(
    cross_device_ops=tf.distribute.HierarchicalCopyAllReduce())

接下来看如何具体的使用它:

strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
  model = tf.keras.Sequential()
  model.add(layers.Dense(16, activation='relu', input_shape=(10,)))
  model.add(layers.Dense(1))

  optimizer = tf.keras.optimizers.SGD(0.2)

  model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                optimizer=optimizer)

model.summary()

之后的策略相似。

CentralStorageStrategy

tf.distribute.experimental.CentralStorageStrategy也使用同步方式,变量不用复制,它们全放在CPU上,操作全部在GPU副本上,如果只有一个GPU,变量和运算全在GPU上

central_storage_strategy = tf.distribute.experimental.CentralStorageStrategy()

MultiWorkerMirroredStrategy

MultiWorkerMirroredStrategy与MultiWorkerMirroredStrategy相似,区别在于它在多台机器上的多个GPU上使用。
通信层之间聚类通信的方式:
CollectiveCommunication.RING
CollectiveCommunication.NCCL
CollectiveCommunication.AUTO
使用如下:

multiworker_strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy(
    tf.distribute.experimental.CollectiveCommunication.NCCL)

TPUStrategy

这个策略允许在TPU上进行训练,除了运行的设备不同,其它方式跟MirroredStrategy一样。
代码需在Colab使用,如下

cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver(
    tpu=tpu_address)
tf.config.experimental_connect_to_cluster(cluster_resolver)
tf.tpu.experimental.initialize_tpu_system(cluster_resolver)
tpu_strategy = tf.distribute.experimental.TPUStrategy(cluster_resolver)

ParameterServerStrategy

一些机器当做工作机,一些当做参数服务器。

ps_strategy = tf.distribute.experimental.ParameterServerStrategy()

它需要一些参数配置:

os.environ["TF_CONFIG"] = json.dumps({
    "cluster": {
        "worker": ["host1:port", "host2:port", "host3:port"],
        "ps": ["host4:port", "host5:port"]
    },
   "task": {"type": "worker", "index": 1}
})

好像官方不是很推荐这种方法。

OneDeviceStrategy

该策略使用一台机器,变量放置在指定设备上,在使用其它设备时,该策略常被用来测试。
使用如下:

strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")

参考文献:
https://tensorflow.google.cn/guide/distributed_training

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值