【发布时间】:2018-12-17 09:06:08
【问题描述】:
我正在尝试使用 ResNeXT 类型的架构对一些 77 长度信号对进行分类。然而,即使使用相对适中的 38k 参数,该模型的运行速度也非常慢,每个 epoch 大约需要 12 天 60M 训练示例。内存使用量也会上下波动约 10 GB,这表明分配和垃圾收集出现问题。
我希望 1D 模型相对较快,因为这些模型通常应用于更大尺寸和更多层的图像。
我尝试使用 tensorflow-chrome 分析 Keras,但只得到空的输出文件。我采用的方法是否有问题,如何有效诊断和优化 keras 模型中的性能问题?
此外,模型有点疯狂(占用 100% cpu 并锁定整个计算机,除非 CPU 内核限制为 1)
batch size 从 5000 增加到 50000 会使内存使用的波动更大,并占用所有可用的(64G)内存)。将其减少到 500 可以阻止大的波动,但是对于训练时间的估计仍然在 200+ 小时的范围内。
正确安装 CUDA9 + cudnn + tensorflow-gpu 可将每个 epoch 的预期运行时间缩短约 2 倍至 100 小时。 CPU 负载仍然很高,GPU 负载很低,但不再锁定。
我已经运行了具有更多参数的其他模型而没有任何问题,所以我认为这与这个特定模型的不寻常结构有关。
型号代码如下:
def relubn(b):
return BatchNormalization()( ReLU()( b ) )
def resnext_1d( layer_in, n_in, n_paths, n_bottleneck, kernel_size ):
paths = []
b = Conv1D(n_bottleneck * n_paths,1)( layer_in )
b = relubn(b)
for i in range(0,n_paths):
group = Lambda(lambda z: z[:, :, i * n_bottleneck:(i + 1) * n_bottleneck])( b )
c = Conv1D(n_bottleneck,kernel_size, padding='same')( group )
paths.append( c )
con = concatenate(paths)
comb = Conv1D(n_in,1)( con )
comb = relubn( comb )
return relubn( add( [layer_in, comb] ) )
in1 = Input(shape=(77,2))
l1 = Conv1D(64, (9,), padding='same')( in1 )
l2 = resnext_1d( l1, 64, 8, 4, 9 )
l3 = resnext_1d( l2, 64, 8, 4, 9 )
l4 = resnext_1d( l3, 64, 8, 4, 9 )
l5 = resnext_1d( l4, 64, 8, 4, 9 )
l6 = resnext_1d( l5, 64, 8, 4, 9 )
l7 = resnext_1d( l6, 64, 8, 4, 9 )
l8 = resnext_1d( l6, 64, 8, 4, 9 )
ap = GlobalAveragePooling1D()( relubn(l8) ) # 64x1
out_class = Dense(28, activation='softmax')( ap )
【问题讨论】:
-
1.对于大型模型,Keras 的设计速度非常慢。 (github.com/tensorpack/benchmarks/tree/master/other-wrappers)。 2. 使用
tf.split比在 for 循环中切片张量更有效。 -
1.也许吧,但按照当今的标准,这个模型很小。 2. 我刚试过 tf.split,效果不明显。
-
@ppwwyyxx 声称“按设计非常慢”是一个非常强烈的主张,不支持您的链接。
-
您使用的是 GPU 吗?您使用的是什么批量大小?训练期间的 GPU/CPU 利用率是多少?
-
您的批处理大小听起来太大了,使用 32/64 之类的值并增加它直到获得最佳性能
标签: python tensorflow keras deep-learning profiling