tensorflow-gpu分配显存tf.ConfigProto和tf.GPUOptions

初次使用tensorflow-gpu时用的sess = tf.Session()启动图,这时总报如下错误

但是程序逻辑是没有问题的,后来发现是需要为其分配显存,因此需要将sess = tf.Session()改为:

config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)

allow_growth设置为True时,分配器将不会指定所有的GPU内存而是根据需求增长,但是由于不会释放内存,所以会导致碎片 

也可以改为:

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

per_process_gpu_memory_fraction指定了每个GPU进程中使用显存的上限,但它只能均匀作用于所有GPU,无法对不同GPU设置不同的上限 。

tf.ConfigProto()的参数罗列如下:

示例如下:

  • log_device_placement=True : 是否打印设备分配日志
  • allow_soft_placement=True : 如果你指定的设备不存在,允许TF自动分配设备   
  • inter_op_parallelism_threads=0:设置线程一个操作内部并行运算的线程数,如果设置为0,则表示以最优的线程数处理
  • intra_op_parallelism_threads=0:设置多个操作并行运算的线程数
import tensorflow as tf
import numpy as np

# 假设有一个W = [0.100, 0.200],b = [0.300]的线性模型
x_data = np.float32(np.random.rand(2, 100)) 
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造线性模型并初始化参数
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 损失函数采用最小化方差
loss = tf.reduce_mean(tf.square(y-y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# 初始化变量
init = tf.global_variables_initializer()


# 启动图 (graph)
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
sess.run(init)

# 训练模型并打印结果
for step in range(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))

猜你喜欢

转载自blog.csdn.net/Muzi_Water/article/details/88182751