Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 用同步方法和VAR实现多GPU BN层的方法_Tensorflow_Caffe_Torch_Multi Gpu_Batch Normalization - Fatal编程技术网

Tensorflow 用同步方法和VAR实现多GPU BN层的方法

Tensorflow 用同步方法和VAR实现多GPU BN层的方法,tensorflow,caffe,torch,multi-gpu,batch-normalization,Tensorflow,Caffe,Torch,Multi Gpu,Batch Normalization,我想知道在使用多GPU进行培训时,通过同步批次统计信息实现批次规范化层的可能方法 Caffe也许有一些Caffe的变体可以这样做,比如。但对于BN层,我的理解是它仍然只同步层的输出,而不同步均值和变量。也许MPI可以同步means和vars,但我认为MPI的实现有点困难 Torch我看到了一些评论和,它们表明running_mean和running_var可以同步,但我认为batch mean和batch var不能同步,或者很难同步 Tensorflow通常与caffe和火炬相同。BN的实施是

我想知道在使用多GPU进行培训时,通过同步批次统计信息实现批次规范化层的可能方法

Caffe也许有一些Caffe的变体可以这样做,比如。但对于BN层,我的理解是它仍然只同步层的输出,而不同步均值和变量。也许MPI可以同步means和vars,但我认为MPI的实现有点困难

Torch我看到了一些评论和,它们表明running_mean和running_var可以同步,但我认为batch mean和batch var不能同步,或者很难同步

Tensorflow通常与caffe和火炬相同。BN的实施是指。我知道tensorflow可以将操作分发给
tf.device()
指定的任何设备。但是,计算方法和VARS在BN层的中间,所以如果我在CPU中收集方法和VARS,我的代码将是这样的:

cpu\u聚集=[]
标签_批次=[]
对于范围内的i(numGPU):
使用tf.device('/gpu:%d“%i”):
使用tf.variable_scope('block1',reuse=i>0):
图像批处理,标签批处理=cifar批处理输入。生成批处理输入(“cifar10”,列车数据路径,批处理大小,“列车”)
标记批次。追加(标记批次)
x=_conv('weights',图像_batch,3,3,16,_stein_arr(1))
块1_聚集。附加(x)
使用tf.device('/cpu:0'):
打印块1\u聚集[0]。获取\u形状()
x1=tf.concat(块1_聚集,0)
#打印x1.get_shape()
均值,方差=tf.nn.矩(x1,[0,1,2],name='矩')
对于范围内的i(numGPU):
使用tf.device('/gpu:%d“%i”):
使用tf.variable_scope('block2',reuse=i>0):
shape=cpu\u聚集[i]。获取\u shape()。作为\u列表()
在[2,4]中断言len(shape)
n_out=形状[-1]
beta,gamma,moving_mean,moving_var=get_bn_变量(n_out,True,True)
x=tf.nn.batch\u标准化(
cpu_聚集[i],均值,方差,β,γ,0.00001)
x=_relu(x)
这仅适用于一个BN层。为了在cpu中收集统计数据,我必须破解代码。如果我有超过1000亿层,那将很麻烦

我不是这些图书馆的专家,所以可能有一些误解,请随意指出我的错误


我不太在乎训练速度。我正在做图像分割,这会消耗大量GPU内存,BN需要合理的批量大小(例如大于16)才能获得稳定的统计数据。因此,使用多GPU是不可避免的。在我看来,tensorflow可能是最好的选择,但我无法解决破坏代码的问题。其他库的解决方案也将受到欢迎。

我不确定是否完全理解您的问题,但如果您正确设置了变量范围,
tf.GraphKeys.UPDATE\u OPS
集合应该自动为每个塔的批处理更新OPS。如果同步应用所有更新操作,则参数服务器将隐式平均这些操作,您所要做的就是确保在平均和应用渐变之前应用更新。(如果我正确理解你的意图)

由于变量范围,每一组更新操作都将更新相同的变量,因此要同步更新操作,您所需要做的就是对整个更新操作集进行梯度计算。您还应该将所有批处理规范层封装在一个
name\u scope
中,以避免在
UPDATE\u ops
中获取任何无关的操作。代码框架如下:

update_ops = []
for i, device in enumerate(devices):
  with tf.variable_scope('foo', reuse=bool(i > 0)):
    with tf.name_scope('tower_%d' % i) as name_scope:
      with tf.device(device):
        # Put as many batch_norm layers as you want here
      update_ops.extend(tf.get_collection(tf.GraphKeys.UPDATE_OPS,
                                          name_scope))
# make gradient calculation ops here
with tf.device(averaging_device):
  with tf.control_dependencies(update_ops):
    # average and apply gradients.
如果要在某些现有代码上尝试此操作,请尝试删除此处的
If i==0
行:


您将看到一些速度减慢(出于这个原因,我们通常只使用一个塔来计算批处理范数统计),但它应该可以满足您的需要。

我找到了一种用纯tensorflow和纯python实现的方法


可以在城市景观上进行培训,并获得可比的性能。

自TF2.2起,就提供了专门的keras层SyncBatchNormalization

任何评论都值得赞赏,似乎在caffe中都可以做到。谢谢Eli Bixby。您是否使用多个GPU成功完成了培训BN。请看我的问题并给我一些评论谢谢@Eli Bixby的回答,但很抱歉可能会有一些错误。对于BN,不仅应累积或更新
统计数据
。还应考虑每次反向传播时的梯度。如果使用小批量,梯度根本不稳定。你在这里建议的只是转发,反向是通过自动微分计算的,这是不正确的。你应该使用足够大的批处理大小,使每个GPU都饱和。根据我们的经验,即使在GPU之间进行分片,也足以通过仅从我们的经验中的单个GPU分片传播梯度来为批处理_范数生成稳定的梯度(请参阅我链接的代码)。在使用当前的高级批处理规范函数之前,无法对批处理规范梯度求平均值,您必须自己在低级TF中实现它。@Eli Bixby,谢谢。我处理的分割任务通常会消耗大量内存,因此无法使用大批量。您是否有在低级别TF中实施的经验,或者有一些具体的例子?更好的是计算梯度的实现。我没有任何尝试手动执行此特定任务的经验,但是它应该遵循与手动平均梯度完全相同的模式,除了要计算梯度,而不是平均梯度,而是平均批次范数统计,以便计算梯度。因此,您需要创建一些手动绑定到设备的批处理操作,然后使用操作列表提取平均统计数据。这将类似于