使用GPU训练TensorFlow模型

查看GPU-ID

CMD输入:

nvidia-smi

使用GPU训练TensorFlow模型_第1张图片

观察到存在序号为0的GPU ID

使用GPU训练TensorFlow模型_第2张图片

观察到存在序号为0、1、2、3的GPU ID

在终端运行代码时指定GPU

如果电脑有多个GPU,Tensorflow默认全部使用。如果想只使用部分GPU,可以设置CUDA_VISIBLE_DEVICES

命令行输入:

# 指定采用1号GPU运行*.py
CUDA_VISIBLE_DEVICES=1 python *.py
Environment Variable Syntax      Results

CUDA_VISIBLE_DEVICES=1           Only device 1 will be seen
CUDA_VISIBLE_DEVICES=0,1         Devices 0 and 1 will be visible
CUDA_VISIBLE_DEVICES="0,1"       Same as above, quotation marks are optional
CUDA_VISIBLE_DEVICES=0,2,3       Devices 0, 2, 3 will be visible; device 1 is masked
CUDA_VISIBLE_DEVICES=""          No GPU will be visible

在Python代码中指定GPU

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 选择ID为0的GPU
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
# 通过ID选择GPU
def selectGpuById(id):
    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
    os.environ["CUDA_VISIBLE_DEVICES"] = "{}".format(id)

如果存在多个GPU,需要明确op操作在哪个GPU上调用 - 可以使用with ... Device语句明确指定那个CPU或GPU将被调用:

with tf.Session() as ses:
    with tf.device("/gpu:1"):
        matrix1=tf.constant([[3.,3.]])
        matrix2=tf.constant([[2.],[2.]])
        product=tf.matmul(matrix1,matrix2)
字符 对应的操作
"/cpu:0" The CPU of your machine
"/gpu:0" The GPU of yout machine ,if you have one

查看TensorFlow是CPU还是GPU版本

Python环境中输入:

import numpy
import tensorflow as tf
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print(sess.run(c))
# 显示详细信息
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1060, pci bus id: 0000:01:00.0, compute capability: 6.1
2019-08-27 11:08:16.462966: I tensorflow/core/common_runtime/direct_session.cc:296] Device mapping:
MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1060, pci bus id: 0000:01:00.0, compute capability: 6.1
a: (Const): /job:localhost/replica:0/task:0/device:GPU:0
b: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2019-08-27 11:08:16.463885: I tensorflow/core/common_runtime/placer.cc:54] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:GPU:0
2019-08-27 11:08:16.464145: I tensorflow/core/common_runtime/placer.cc:54] a: (Const)/job:localhost/replica:0/task:0/device:GPU:0
2019-08-27 11:08:16.464394: I tensorflow/core/common_runtime/placer.cc:54] b: (Const)/job:localhost/replica:0/task:0/device:GPU:0
[[22. 28.]
 [49. 64.]] 

不希望使用GPU

CUDA_VISIBLE_DEVICES=""

设置Tensorflow使用的显存大小

(1)定量设置显存

默认tensorflow是使用GPU尽可能多的显存。可以通过下面的方式,来设置使用的GPU显存:

# 分配给Tensorflow的GPU显存大小为:GPU实际显存*0.7
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

(2)按需设置显存

# 如果想按需分配,可以使用allow_growth参数
gpu_options = tf.GPUOptions(allow_growth=True)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))  

限制GPU使用率

Tensorflow为了加速代码的运行速率,在运行的时候会占用一切能用的GPU资源,导致其他程序无法使用GPU

采用tf.ConfigProto(),在创建session的时候对GPU使用率进行参数配置

  • tf.ConfigProto(log_device_placement=True):记录设备的指派情况(运行时,获取操作或张量在哪个设备上运行,在终端输出指派的情况)
  • tf.ConfigProto(allow_soft_placement=True):自动选择适合的可用的设备(无需指派)

限制代码的GPU使用 - 存在两种限制方法:

(1)第一种是代码在运行的时候动态的申请资源,需要多少拿多少

# 使用最小的GPU资源
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
self.sess=tf.Session(config=config)

(2)第二种是限制GPU的使用率

config = tf.ConfigProto() 
config.gpu_options.per_process_gpu_memory_fraction = 0.4 # 占用GPU40%的显存 
session = tf.Session(config=config)

 

转载于:https://www.cnblogs.com/YSPXIZHEN/p/11416843.html

你可能感兴趣的:(人工智能,python)