Tensorflow实现多GPU并行方式


Posted in Python onFebruary 03, 2020

Tebsorflow开源实现多GPU训练cifar10数据集:cifar10_multi_gpu_train.py

Tensorflow开源实现cifar10神经网络:cifar10.py

Tensorflow中的并行分为模型并行和数据并行。模型并行需要根据不同模型设计不同的并行方式,其主要原理是将模型中不同计算节点放在不同硬件资源上运算。比较通用且能简便地实现大规模并行的方式是数据并行,同时使用多个硬件资源来计算不同batch的数据梯度,然后汇总梯度进行全局更新。

数据并行几乎适用于所有深度学习模型,总是可以利用多块GPU同时训练多个batch数据,运行在每块GPU上的模型都基于同一个神经网络,网络结构一样,并且共享模型参数。

import os
import re
import time
import numpy as np
import tensorflow as tf
import cifar10_input
import cifar10

batch_size = 128
max_steps = 1000
num_gpus = 1 # gpu数量


# 在scope下生成神经网络并返回scope下的loss
def tower_loss(scope):
 # 数据集的路径可以在cifar10.py中的tf.app.flags.DEFINE_string中定义
 images, labels = cifar10.distorted_inputs()
 logits = cifar10.inference(images) # 生成神经网络
 _ = cifar10.loss(logits, labels) # 不直接返回loss而是放到collection
 losses = tf.get_collection('losses', scope) # 获取当前GPU上的loss(通过scope限定范围)
 total_loss = tf.add_n(losses, name='total_loss')
 return total_loss


'''
外层是不同GPU计算的梯度,内层是某个GPU对应的不同var的值
tower_grads = 
[[(grad0_gpu0, var0_gpu0), (grad1_gpu0, var1_gpu0),...],
 [(grad0_gpu1, var0_gpu1), (grad1_gpu1, var1_gpu1),...]]
zip(*tower_grads)= 相当于转置了
[[(grad0_gpu0, var0_gpu0), (grad0_gpu1, var0, gpu1),...],
 [(grad1_gpu0, var1_gpu0), (grad1_gpu1, var1_gpu1),...]]
'''


def average_gradients(tower_grads):
 average_grads = []
 for grad_and_vars in zip(*tower_grads):
  grads = [tf.expand_dims(g, 0) for g, _ in grad_and_vars]
  grads = tf.concat(grads, 0)
  grad = tf.reduce_mean(grads, 0)
  grad_and_var = (grad, grad_and_vars[0][1])
  # [(grad0, var0),(grad1, var1),...]
  average_grads.append(grad_and_var)
 return average_grads


def train():
 # 默认的计算设备为CPU
 with tf.Graph().as_default(), tf.device('/cpu:0'):
  # []表示没有维度,为一个数
  # trainable=False,不会加入GraphKeys.TRAINABLE_VARIABLES参与训练
  global_step = tf.get_variable('global_step', [],
          initializer=tf.constant_initializer(0),
          trainable=False)
  num_batches_per_epoch = cifar10.NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN / batch_size
  decay_steps = int(num_batches_per_epoch * cifar10.NUM_EPOCHS_PER_DECAY)
  # https://tensorflow.google.cn/api_docs/python/tf/train/exponential_decay
  # decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
  # staircase is True, then global_step / decay_steps is an integer division
  lr = tf.train.exponential_decay(cifar10.INITIAL_LEARNING_RATE,
          global_step,
          decay_steps,
          cifar10.LEARNING_RATE_DECAY_FACTOR,
          staircase=True)
  opt = tf.train.GradientDescentOptimizer(lr)

  tower_grads = []
  for i in range(num_gpus):
   with tf.device('/gpu:%d' % i):
    with tf.name_scope('%s_%d' % (cifar10.TOWER_NAME, i)) as scope:
     loss = tower_loss(scope)
     # 让神经网络的变量可以重用,所有GPU使用完全相同的参数
     # 让下一个tower重用参数
     tf.get_variable_scope().reuse_variables()
     grads = opt.compute_gradients(loss)
     tower_grads.append(grads)
  grads = average_gradients(tower_grads)
  apply_gradient_op = opt.apply_gradients(grads, global_step=global_step)

  init = tf.global_variables_initializer()
  # True会自动选择一个存在并且支持的设备来运行
  sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))
  sess.run(init)
  tf.train.start_queue_runners(sess=sess)

  for step in range(max_steps):
   start_time = time.time()
   _, loss_value = sess.run([apply_gradient_op, loss])
   duration = time.time() - start_time

   if step % 10 == 0:
    num_examples_per_step = batch_size * num_gpus
    examples_per_sec = num_examples_per_step / duration
    sec_per_batch = duration / num_gpus

    print('step %d, loss=%.2f(%.1f examples/sec;%.3f sec/batch)'
      % (step, loss_value, examples_per_sec, sec_per_batch))



if __name__ == '__main__':
 train()

以上这篇Tensorflow实现多GPU并行方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python获取单个程序CPU使用情况趋势图
Mar 10 Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
python global关键字的用法详解
Sep 05 Python
python ftplib模块使用代码实例
Dec 31 Python
Python简单实现区域生长方式
Jan 16 Python
python中with用法讲解
Feb 07 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
Python 必须了解的5种高级特征
Sep 10 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
python如何通过twisted搭建socket服务
Feb 03 #Python
关于Tensorflow分布式并行策略
Feb 03 #Python
基于python修改srt字幕的时间轴
Feb 03 #Python
Python实现不规则图形填充的思路
Feb 02 #Python
Python ORM编程基础示例
Feb 02 #Python
Python 面向对象之类class和对象基本用法示例
Feb 02 #Python
flask 框架操作MySQL数据库简单示例
Feb 02 #Python
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
HTML DOM的nodeType值介绍
2011/03/31 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
python将回车作为输入内容的实例
2018/06/23 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
Python sorted排序方法如何实现
2020/03/31 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
预备党员入党思想汇报
2014/01/04 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
标准版离职证明书
2014/09/12 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python