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递归计算N!的方法
May 05 Python
python开发之函数定义实例分析
Nov 12 Python
python中的错误处理
Apr 10 Python
python语言使用技巧分享
May 31 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
详解Django配置优化方法
Nov 18 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
使用Python pip怎么升级pip
Aug 11 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 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+AJAX无刷新分页实现方法
2015/11/03 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python实现图片中文字分割效果
2019/07/22 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
python绘制规则网络图形实例
2019/12/09 Python
Python实现图像的垂直投影示例
2020/01/17 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
python相对企业语言优势在哪
2020/06/12 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
英国家用电器购物网站:Hughes
2018/02/23 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
教师个人考察材料
2014/12/16 职场文书
装修安全责任协议书
2016/03/22 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Python中22个万用公式的小结
2021/07/21 Python
MySQL 条件查询的常用操作
2022/04/28 MySQL