Tensorflow多GPU性能不好
我们尝试实施塔式方法,但发现性能变差:Tensorflow多GPU性能不好,tensorflow,Tensorflow,我们尝试实施塔式方法,但发现性能变差: 修改自: 设备: 英特尔酷睿i7 GTX-1060 x 2 源代码: 拆分=无:默认版本 拆分=真:塔版本 从tensorflow.python.ops导入tensor\u数组\u ops 从tensorflow.python.client导入设备库 导入tensorflow作为tf 将tflib作为库导入 将numpy作为np导入 导入时间 批次=64 尺寸=1000 GPU=2 拆分=真 def初始_矩阵(形状): 返回tf.random_
- 英特尔酷睿i7
- GTX-1060 x 2
- 拆分=无:默认版本
- 拆分=真:塔版本
从tensorflow.python.ops导入tensor\u数组\u ops
从tensorflow.python.client导入设备库
导入tensorflow作为tf
将tflib作为库导入
将numpy作为np导入
导入时间
批次=64
尺寸=1000
GPU=2
拆分=真
def初始_矩阵(形状):
返回tf.random_normal(形状,stddev=0.1)
def块(参数、x、名称、重用):
W=tf.get_变量(“%sweight”%name,[DIM,DIM])
b=tf.get_变量(“%sbias”%name,[DIM])
如果不重用:参数扩展([W,b])
重塑(x,[-1,尺寸])
输出=tf.nn.sigmoid(tf.matmul(x,W)+b)
返回tf.重塑(输出,[-1,变暗,变暗])
def塔损失(参数、输入、重复使用=无):
使用tf.variable_scope(tf.get_variable_scope(),reuse=reuse):
输出=块(参数,输入,'Layer.0',重用)
输出=块(参数,输出,'Layer.1',重用)
输出=块(参数,输出'Layer.2',重用)
输出=块(参数,输出,'Layer.3',重用)
输出=块(参数,输出'Layer.4',重用)
输出=块(参数,输出'Layer.5',重用)
输出=tf.重塑(输出,[-1,DIM*DIM])
返回tf.reduce_平均值(输出)
定义所有梯度(塔楼梯度):
所有大学毕业生=[]
对于范围内的i(len(塔楼梯度[0]):
对于塔楼的毕业生(毕业生):
年级=[]
扩展的直径=tf。扩展直径(梯度[i],0)
梯度附加(扩展的)
梯度=tf.concat(轴=0,值=grads)
梯度=tf。减少总和(梯度,0)
所有梯度。附加(梯度)
返回所有大学毕业生
如果不拆分:
opt=tf.train.AdamOptimizer(学习率=1e-4,β1=0.5,β2=0.9)
inputs=tf.placeholder(tf.float32,shape=[BATCH,DIM,DIM])
参数=[]
损耗=_塔损耗(参数,输入,无)
梯度,按全局标准剪裁(梯度(损耗,参数),5.0)
apply_gradient_op=opt.apply_gradient(zip(梯度,参数))
merged=tf.summary.merge_all()
使用tf.Session(config=tf.ConfigProto(log\u device\u placement=True))作为会话:
session.run(tf.global\u variables\u initializer())
writer=tf.summary.FileWriter(“.”,session.graph)
对于范围(100)内的i:
开始=时间。时间()
运行(apply_gradient_op,feed_dict={输入:np.zeros([BATCH,DIM,DIM]))
打印'Iter'+str(i)+':time='+str(time.time()-start)
其他:
使用tf.Graph()作为_default(),tf.device('/cpu:0'):
opt=tf.train.AdamOptimizer(学习率=1e-4,β1=0.5,β2=0.9)
inputs=tf.placeholder(tf.float32,shape=[BATCH,DIM,DIM])
输入分割=tf.split(轴=0,数量或大小分割=GPU,值=输入)
参数=[]
塔_梯度=[]
重用=无
对于范围内的i(GPU):
使用tf.device('/gpu:%d“%i”):
使用tf.name\u作用域('Tower\ud“%i”)作为作用域:
使用tf.device('/cpu:0'):
损耗=\塔损耗(参数、输入\拆分[i],重用)
重用=真
梯度,按全局标准剪裁(梯度(损耗,参数),5.0)
塔楼梯度附加(梯度)
梯度=_所有梯度(塔楼梯度)
apply_gradient_op=opt.apply_gradient(zip(梯度,参数))
merged=tf.summary.merge_all()
使用tf.Session(config=tf.ConfigProto(log\u device\u placement=True))作为会话:
session.run(tf.global\u variables\u initializer())
writer=tf.summary.FileWriter(“.”,session.graph)
对于范围(100)内的i:
开始=时间。时间()
运行(apply_gradient_op,feed_dict={输入:np.zeros([BATCH,DIM,DIM]))
打印'Iter'+str(i)+':time='+str(time.time()-start)
Remove'和tf.device('/cpu:0')确实有所改进!谢谢但它仍然需要大约0.908358812332的时间才能执行,与单个GPU的结果类似。你知道这件事吗?
for i in range(GPUs):
with tf.device('/gpu:%d'%i):
with tf.name_scope('Tower_%d'%i) as scope:
with tf.device('/cpu:0'): ### this line may cause all op allocated on cpu, try remove this line
loss = _tower_loss(param, inputs_splits[i], reuse)
reuse = True