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 ElementTree 基本读操作示例
Apr 09 Python
跟老齐学Python之通过Python连接数据库
Oct 28 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
python 简单的多线程链接实现代码
Aug 28 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
python pycharm最新版本激活码(永久有效)附python安装教程
Sep 18 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
如何更换python默认编辑器的背景色
Aug 10 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
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
vue组件开发之slider组件使用详解
2020/08/21 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
整理Python中的赋值运算符
2015/05/13 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
pymysql模块使用简介与示例
2020/11/17 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
遗体告别仪式主持词
2014/03/20 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
食堂管理制度范本
2015/08/04 职场文书
安全伴我行主题班会
2015/08/13 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
调解协议书范本
2016/03/21 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Python 中面向接口编程
2022/05/20 Python