Tensorflow多GPU计算

news/2024/12/3 2:36:21/

Tensoflow多GPU训练思维导图

  • 下面的代码都是在tensorflow版本 1.8 运行的
  • Tensorflow 使用GPU训练的时候一个小说明
1. tensorflow 默认占满所有可用GPU
2. 如果一台机器上有多个GPU,那么默认只会有第一块GPU参与计算,其余的会白白浪费掉
  • 单机单卡
常规操作,省略
  • 单机多卡

    • 各卡执行不同模型训练任务
    # 只需要在代码开头导入os,并指定使用第几块GPU,默认重0开始
    import os
    os.environ["CUDA_VISIBLE_DEVICES"]="0"  # 指定GPU就好了# 如果想查看可用的GPU,可以使用下面的代码
    def get_available_gpus():"""获取可用的GPU设备  --> ['/device:GPU:0', '/device:GPU:1', '/device:GPU:2']"""from tensorflow.python.client import device_lib as _device_liblocal_device_protos = _device_lib.list_local_devices()return [x.name for x in local_device_protos if x.device_type == 'GPU']# 等会用到的代码
    def average_gradients(tower_grads):"""这个代码没变过,都是官网给的"""average_grads = []for grad_and_vars in zip(*tower_grads):grads = []for g, _ in grad_and_vars:expend_g = tf.expand_dims(g, 0)grads.append(expend_g)grad = tf.concat(grads, 0)grad = tf.reduce_mean(grad, 0)v = grad_and_vars[0][1]grad_and_var = (grad, v)average_grads.append(grad_and_var)return average_grads
    • 各卡协同执行训练同一模型任务
      • 异步
    '''异步计算介绍
    1. 多卡计算的时候各自都有权限更新参数
    2. 会导致loss下降不稳定
    '''import os
    os.environ["CUDA_VISIBLE_DEVICES"]="0,1"  # 指定使用前两块GPUdef multi_train():"""异步GPU代码"""with tf.device("/cpu:0"):# 定义输入的占位符X = tf.placeholder(tf.float32, [None, num_input])Y = tf.placeholder(tf.float32, [None, num_classes])opt = tf.train.AdamOptimizer(learning_rate)num_gpu = len(get_available_gpus())tower_grads = []with tf.variable_scope(tf.get_variable_scope()):for i in range(2):with tf.device("/gpu:%d" % i):with tf.name_scope("tower_%d" % i):# step1.划分数据_x = X[i * batch_size:(i + 1) * batch_size]_y = Y[i * batch_size:(i + 1) * batch_size]logits = build_model(_x)  # 调用自己写的构建模型,返回logitstf.get_variable_scope().reuse_variables()  # 重用变量# step2. 计算loss以及gradsloss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=_y, logits=logits))grads = opt.compute_gradients(loss) tower_grads.append(grads)grads = average_gradients(tower_grads)# 这个情况时异步执行train_op = opt.apply_gradients(grads)# 后面的就是一样的代码的了with tf.Session() as sess:sess.run(tf.global_variables_initializer())for step in range(1, num_steps + 1):batch_x, batch_y = mnist.train.next_batch(batch_size * num_gpus)sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
    
    • 同步
    '''同步计算介绍
    1. 由CPU调度,等待所有GPU计算之后的平均grads更新参数
    2. loss下降稳定,但是效率取决于最慢的那个GPU注意:同步计算,如果初始化不恰到或者初始学习率设置过大,梯度很容易爆炸
    注意:如果查看loss会发现会出一个nan,然后之后loss一直在一个固定的数值
    '''
    import os
    os.environ["CUDA_VISIBLE_DEVICES"]="0,1"  # 指定使用前两块GPUdef multi_train():"""同步GPU代码"""with tf.device("/cpu:0"):# 定义输入的占位符X = tf.placeholder(tf.float32, [None, num_input])Y = tf.placeholder(tf.float32, [None, num_classes])opt = tf.train.AdamOptimizer(learning_rate)num_gpu = len(get_available_gpus())tower_grads = []with tf.variable_scope(tf.get_variable_scope()):for i in range(2):with tf.device("/gpu:%d" % i):with tf.name_scope("tower_%d" % i):# step1.划分数据_x = X[i * batch_size:(i + 1) * batch_size]_y = Y[i * batch_size:(i + 1) * batch_size]logits = build_model(_x)  # 调用自己写的构建模型,返回logitstf.get_variable_scope().reuse_variables()  # 重用变量# step2. 计算loss以及gradsloss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=_y, logits=logits))grads = opt.compute_gradients(loss) tower_grads.append(grads)grads = average_gradients(tower_grads)# 同步代码global_step = global_step=tf.train.get_or_create_global_step()update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)with tf.control_dependencies(update_ops):train_op = opt.apply_gradients(avg_grads, global_step=global_step # 这样子是同步# 后面的就是一样的代码的了with tf.Session() as sess:sess.run(tf.global_variables_initializer())for step in range(1, num_steps + 1):batch_x, batch_y = mnist.train.next_batch(batch_size * num_gpus)sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
  • 多机单卡

目前查到了一个例子,不过还没有调试过,如果确认能够运行再贴上来
  • 多机多卡
同多机单卡,多机单卡成功之后,无非是py文件换成单机多卡的py文件而已
  • 参考链接
    https://www.tensorflow.org/tutorials/images/deep_cnn
  • 最后,如果大家有什么说的话可以在下方留言,一起学习探讨

http://www.ppmy.cn/news/307013.html

相关文章

boost.compute使用gpu计算(c++)

boost.compute https://github.com/boostorg/compute 编译错误 cl.h找不到 下载opencl的头文件,icd(源码)和demo https://gitee.com/zhanghe666/OpenCL-Headers.git https://gitee.com/zhanghe666/OpenCL-ICD-Loader.git https://gitee.co…

GPU平台并行计算

1、GPU架构概述 GPU是一种众核架构,非常适合解决大规模的并行计算。GPU是CPU的协处理器,必须通过PCIe总线与基于CPU的主机(Host)相连来进行操作,形成异构架构,如下图所示。其中CPU为主机端(Hos…

Windows系统下实现Fortran语言的GPU计算

1.安装 visual studio2015ivf2017update4 2.安装Windows SDK 10,这一步取决于第三步安装PGI时是否提示需要安装WindowsSDK 3.安装PGI CE 18.4 注意事项: 1.三个软件必须安装在同一个盘下,否则安装后的PGI CE 无法编译。因为Windows10 SD…

CUDA学习笔记 —— (三)GPU计算性能与线程关系

文章目录 概述CPU运行GPU运行单线程GPU 1block 多线程运行多block多线程结果比对 概述 我们通过一个例子,相同的计算,我们分别在CPU,GPU单线程,GPU单block多线程,GPU多block多线程来运行对比。看GPU是如何大幅提升运算…

CPU与GPU计算能力比较

本文对比几个算法分别在CPU上计算,与GPU上计算的耗时。 测试环境: CPU: Intel(R)_Core(TM)_i7-7700_CPU__3.60GHz x 8 GPU: NVIDIA GeForce GTX 1050 一,FFT计算的性能分析。 1,dft离散傅里叶变换的公式如下。 X为源数据&am…

GPU 计算 - GPU 优化简介

GPU 优化简介 原文 - An Introduction to GPU Optimization 采用 GPUs 加速简单的计算任务. 计算机处理的很多任务都会遇到大量的计算,耗时较多的问题;而且,随着数据集越来越大,耗时将更多. 解决方法之一是,使用线程…

GPU并行效率问题——通过MPS提升GPU计算收益

现象描述 使用V100_32G型号的GPU运行计算程序时,发现程序每5秒能够完成一次任务,耗费显存6G。 鉴于V100 GPU拥有32G的显存,还有很多空闲,决定同时运行多个计算程序,来提升GPU计算收益。 然而,这一切都是想当…

GPU计算(一)

简单描述 图形处理、也就是显示核心,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。 包括市面上的游戏本也是带有独立显卡的&…