Tensorflow 多 GPU 训练方法

        现代工作站可能会包含多个用于科学计算的 GPU。默认情况下,Tensorflow 采用一个 GPU 训练模型。TensorFlow 可利用此环境在多个卡上同时运行训练操作。如果要以并行的分布式方式训练模型,则需要协调训练过程。

1 原理说明

        TensorFlow并行计算分为:模型并行数据并行。模型并行是指根据不同模型设计不同的并行方式,模型不同计算节点放在不同GPU或者机器上进行计算。数据并行是比较通用简便的实现大规模并行方式,同时使用多个硬件资源计算不同 batch 数据梯度,汇总梯度进行全局参数更新。

        同步数据并行,所有GPU计算完batch数据梯度,统计将多个梯度合在一起,更新共享模型参数,类似使用较大batch。GPU型号、速度一致时,效率最高。 异步数据并行,不等待所有GPU完成一次训练,哪个GPU完成训练,立即将梯度更新到共享模型参数。 同步数据并行比异步收敛速度更快,模型精度更高。 

2 方法

        以下方法博主不区分其实际原理,一切以实践可行性为主,博主采用英伟达的 1080Ti 训练,tensorflow 版本为1.12.0。

方法1

 在 Python 代码中,采用以下指令设置需要的 GPU 型号,比如我用 0 号和 1 号 GPU 训练模型:

os.environ['CUDA_VISIBLE_DEVICES']= '0, 1'

    该方法经博主测试,结果显示 0 号 GPU 占据显存约 5%- 20%, 浮动变化,1 号 GPU 占据显存约 60% 。

    在单个 GPU 训练的时候,单个 GPU 占显存约 60%。

方法2

    在命令行中,假设我要运行 cifar10_multi_gpu_train.py 文件,采用以下设置(官网教程)。

python cifar10_multi_gpu_train.py --num_gpus=2

    该方法经博主测试似乎并没有卵用。

方法3

    在 Python 代码中,采用以下设置。该方法博主没有亲测,代码及结果来自官网。

# Creates a graph.
c = []
for d in ['/device:GPU:2', '/device:GPU:3']:
  with tf.device(d):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
    c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
  sum = tf.add_n(c)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(sum))

显示以下内容:

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K20m, pci bus
id: 0000:02:00.0
/job:localhost/replica:0/task:0/device:GPU:1 -> device: 1, name: Tesla K20m, pci bus
id: 0000:03:00.0
/job:localhost/replica:0/task:0/device:GPU:2 -> device: 2, name: Tesla K20m, pci bus
id: 0000:83:00.0
/job:localhost/replica:0/task:0/device:GPU:3 -> device: 3, name: Tesla K20m, pci bus
id: 0000:84:00.0
Const_3: /job:localhost/replica:0/task:0/device:GPU:3
Const_2: /job:localhost/replica:0/task:0/device:GPU:3
MatMul_1: /job:localhost/replica:0/task:0/device:GPU:3
Const_1: /job:localhost/replica:0/task:0/device:GPU:2
Const: /job:localhost/replica:0/task:0/device:GPU:2
MatMul: /job:localhost/replica:0/task:0/device:GPU:2
AddN: /job:localhost/replica:0/task:0/cpu:0
[[  44.   56.]
 [  98.  128.]]

   

    最后,如果你没有多个 GPU,还是老老实实单个 GPU 训练吧,上面的设置不会有任何结果。

 

 

 

参考资料:

https://www.tensorflow.org/tutorials/images/deep_cnn?hl=zh-cn#training_a_model_using_multiple_gpu_cards

https://blog.csdn.net/li201592013/article/details/78232922

https://www.tensorflow.org/tutorials/images/deep_cnn?hl=zh-cn#launching_and_training_the_model_on_multiple_gpu_cards

https://stackoverflow.com/questions/37893755/tensorflow-set-cuda-visible-devices-within-jupyter

https://stackoverflow.com/questions/36668467/change-default-gpu-in-tensorflow

你可能感兴趣的:(深度学习,Tensorflow,tensorflow,GPU,英伟达,深度学习,分布式)