在 Keras 上训练 c3d。训练减慢了中期和ETA攀升

Posted

技术标签:

【中文标题】在 Keras 上训练 c3d。训练减慢了中期和ETA攀升【英文标题】:Training c3d on Keras. Training slows down mid epoch and ETA climbs up 【发布时间】:2019-01-23 22:10:12 【问题描述】:

我正在尝试在 keras (v2.2.0) 上训练 c3d

超参数和信息:

    批量大小 - 32 生成器的 Keras 工作器数量 - 32(max_queue_size = 30) Amazon EC2 p3.8xlarge 机器 GPU 数量 4 一个 Data Point numpy 维度:(90x80x80x3)[序列长度为 90 的视频,图像维度为 80,80,3] 优化器 - 亚当 学习率 - 8e-5

输出架构是:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv1 (Conv3D)               (None, 90, 80, 80, 64)    5248
_________________________________________________________________
pool1 (MaxPooling3D)         (None, 90, 40, 40, 64)    0
_________________________________________________________________
conv2 (Conv3D)               (None, 90, 40, 40, 128)   221312
_________________________________________________________________
pool2 (MaxPooling3D)         (None, 45, 20, 20, 128)   0
_________________________________________________________________
conv3a (Conv3D)              (None, 45, 20, 20, 256)   884992
_________________________________________________________________
conv3b (Conv3D)              (None, 45, 20, 20, 256)   1769728
_________________________________________________________________
pool3 (MaxPooling3D)         (None, 22, 10, 10, 256)   0
_________________________________________________________________
conv4a (Conv3D)              (None, 22, 10, 10, 512)   3539456
_________________________________________________________________
conv4b (Conv3D)              (None, 22, 10, 10, 512)   7078400
_________________________________________________________________
pool4 (MaxPooling3D)         (None, 11, 5, 5, 512)     0
_________________________________________________________________
conv5a (Conv3D)              (None, 11, 5, 5, 512)     7078400
_________________________________________________________________
conv5b (Conv3D)              (None, 11, 5, 5, 512)     7078400
_________________________________________________________________
zero_padding3d_1 (ZeroPaddin (None, 11, 7, 7, 512)     0
_________________________________________________________________
pool5 (MaxPooling3D)         (None, 5, 3, 3, 512)      0
_________________________________________________________________
flatten_1 (Flatten)          (None, 23040)             0
_________________________________________________________________
fc6 (Dense)                  (None, 4096)              94375936
_________________________________________________________________
dropout_1 (Dropout)          (None, 4096)              0
_________________________________________________________________
fc7 (Dense)                  (None, 4096)              16781312
_________________________________________________________________
dropout_2 (Dropout)          (None, 4096)              0
_________________________________________________________________
dense_1 (Dense)              (None, 6)                 24582
=================================================================
Total params: 138,837,766
Trainable params: 138,837,766
Non-trainable params: 0
_________________________________________________________________

第一个 epoch 开始很好,但在中间,它开始极度减速(ETA 开始增加而不是减少)。 GPU 触发的频率(使用nvidia-smi 测量)减慢了很多。 CPU 使用率也有所增加。

另外一个奇怪的地方是 4 个 GPU 的内存使用情况并不统一。看起来一个 GPU 的使用率比其他 GPU 多,而且很早就被填满了:

虽然众所周知 c3d 很难训练,但像 LRCN 这样的小型模型也有类似的结果。

这里有什么我遗漏的优化吗?

还有什么是分析此类问题的最佳方式。

编辑

随后的运行(在将ctrl+c 打到上面之后)更糟

Creating train generator with 41828 samples.
2018-08-16 22:08:17.766289: E tensorflow/stream_executor/cuda/cuda_driver.cc:903] failed to allocate 7.66G (8220311552 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
   4/1307 [..............................] - ETA: 12:27:49 - loss: 2.3928 - acc: 0.1406

【问题讨论】:

请问您在训练什么数据集? 【参考方案1】:

我在多 GPU 模型上体验过,如果您增加工人,ETA 会增加。我认为你应该根据你的 CPU 能力限制工人的数量可能是 2 或 4,并将批量大小增加四倍。

由于批处理由 CPU 加载,如果您更新 CPU 上的权重,请检查其利用率,这可能会增加您的 ETA。

【讨论】:

以上是关于在 Keras 上训练 c3d。训练减慢了中期和ETA攀升的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PyTorch 在预训练模型上添加新层? (给出了 Keras 示例。)

使用 GPU 在 EC2 实例上训练 Keras 模型很慢

「深度学习一遍过」必修28:基于C3D预训练模型训练自己的视频分类数据集的设计与实现

「深度学习一遍过」必修28:基于C3D预训练模型训练自己的视频分类数据集的设计与实现

「深度学习一遍过」必修28:基于C3D预训练模型训练自己的视频分类数据集的设计与实现

「深度学习一遍过」必修28:基于C3D预训练模型训练自己的视频分类数据集的设计与实现