加速运算

CPU、GPU、TPU
TensorFlow 支持的设备包括CPU(一般是 x86 或 x64架构的 CPU ,也可以是手机端 ARM 架构的 CPU ,不过由于 ARM的CPU性能不是十分出众,所以一般不会在训练的过程中被采用)、GPU和TPU(Tensor Processing Unit,这是Google专门为大规模的深度学习计算而研发的特殊设备,目前没有公开发布)。
在配置好GPU支持的TensorFlow中,大量运算被自动优先放置在GPU上。当一台机器上含有多个GPU时,在默认情况下, TensorFlow只会将运算优先放到/gpu:0设备上。如果需要将某些运算放到不同的 GPU 上或者选择使用CPU运行,可以通过device()函数来手工指定 。

import tensorflow as tf

#通过device()函数将运算指定到CPU设备上。
with tf.device("/cpu:0"):
    a = tf.Variable(tf.constant([1.0, 2.0], shape=[2]), name="a")
    b = tf.Variable(tf.constant([3.0, 4.0], shape=[2]), name="b")

#通过device()函数将运算指定到第一个GPU设备上。
with tf.device("/gpu:0"):
    result = a + b

#log_device_placement参数可以用来记录运行每一个运算的设备。
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
    tf.initialize_all_variables().run()
    print(sess.run(result))
    #输出Tensor("add:0", shape=(2,), dtype=float32)
'''
指定运算设备后的log输出:
Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0,name: GeForce GTX 850M, pci bus id: 000:01:00.0
/job:localhost/replica:0/task:0/device:XLA_GPU:0 device:XLA_GPU device
/job:localhost/replica:0/task:0/device:XLA_CPU:0 device:XLA_CPU device
b: (VariableV2): /job:localhost/replica:0/task:0/cpu:0
b/read: (Identity): /job:localhost/replica:0/task:0/cpu:0
b/Assign: (Assign): /job:localhost/replica:0/task:0/cpu:0
a: (VariableV2): /job:localhost/replica:0/task:0/cpu:0
a/read: (Identity): /job:localhost/replica:0/task:0/cpu:0
add: (Add): /job:localhost/replica:0/task:0/gpu:0
a/Assign: (Assign): /job:localhost/replica:0/task :0/cpu:0
init: (No0p): /job:localhost/replica:0/task:0/cpu:0
Const_1: (Const): /job:localhost/replica:0/task:0/cpu:0
Const: (Const): /job:localhost/replica:0/task:0/cpu:0
'''

并行训练的原理
Tensor Flow支持使用多个GPU或者机器实现深度学习模型的并行训练,实现深度学习模型的并行化训 练、可以分为两种不同的方式,数据并行的方式和模型并行的方式。
1.数据并行
数据并行的目的是实现梯度计算的并行化,具体是指将一个完整的batch拆分成多个mini-batch数据并放在不同设备上执行训练的过程。这样的操作会产生许多完全一样的子图的副本。
在这里插入图片描述同步模式下的数据并行,因为训练数据不同,因此即便所有设备使用的参数是一致的,最终得到的参数的梯度也有可能不一样。当所有设备完成反向传播的计算之后,共享的参数服务器需要计算出不同设备上参数梯度的平均值,最后再根据平均值对参数进行更新,更新后的参数会传递到每个设备用于下一轮的迭代训练。
在这里插入图片描述因为不同设备训练同一个模型会消耗不同的时间,尽管有时候我们力求全部使用型号相同的设备,但是由于模型内部运算的复杂性还是会导致这种问题的发生。再加上各个设备之间的独立性,这就可能导致读取参数的时间不一样,即在相同轮数的训练开始前,这些设备得到的参数值有可能不一样。一般我们会将这种问题称为异步模式下的梯度干扰,由此而引发的更严重的问题就是使用异步模式训练得到的深度学习模型有可能无法达到较优的训练结果 。

在同步模式下,所有的设备同时读取参数的取值,并且等待所有设备完成一轮训练后同步更新参数的取值,这样就解决了梯度干扰的问题。尽管如此,同步模式还是有着一定的缺陷一一其效率低于异步模式。因为需要等待,所以整体的速度取决于最慢的设备能否快速结束,这样就降低了快速设备的效率。
2.模型并行
模型并行是指将计算图的不同组成部分放在不同的设备上运算(这些组成部分会在某一设备上被复制一份或者多份),这样设计的出发点在于可以减少每一轮训练迭代的时间 。
模型并行的前提条件是模型本身可以拆分为多个可以并行运行,且互相不依赖或者依赖程度不高的子图。
在这里插入图片描述模型井行方式下的硬件计算性能的损耗存在于不同设备的通信过程中。
相比于模型并行,数据并行的方式是最常见的选择,因为数据并行的方式带来的计算性能损耗非常小。除此之外,数据并行的方式还非常易于设计,它不要求我们对模型的结构进行拆分。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值