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 yield使用方法示例
Dec 04 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
Python中static相关知识小结
Jan 02 Python
《Python学习手册》学习总结
Jan 17 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
python3射线法判断点是否在多边形内
Jun 28 Python
Python实现图片添加文字
Nov 26 Python
Tensorflow实现在训练好的模型上进行测试
Jan 20 Python
tensorflow estimator 使用hook实现finetune方式
Jan 21 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
超级详细实用的pycharm常用快捷键
May 12 Python
基于Python实现将列表数据生成折线图
Mar 23 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 字符串分割和比较
2009/10/06 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
9个比较实用的php代码片段
2016/03/15 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
js Math 对象的方法
2013/09/01 Javascript
浅谈javascript的url参数parse和build函数
2017/03/04 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
windows系统下Python环境搭建教程
2017/03/28 Python
python matlibplot绘制3D图形
2018/07/02 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Python二元赋值实用技巧解析
2019/10/25 Python
为什么python比较流行
2020/06/19 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
厂长助理岗位职责
2013/12/27 职场文书
领班岗位职责范文
2014/02/06 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
质量安全标语
2014/06/07 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
奠基仪式致辞
2015/07/30 职场文书
工作服管理制度范本
2015/08/06 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技
Nginx跨域问题解析与解决
2022/08/05 Servers