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