查看GPU-ID
CMD输入:
nvidia-smi
观察到存在序号为0的GPU ID
观察到存在序号为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)