在 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 示例。)
「深度学习一遍过」必修28:基于C3D预训练模型训练自己的视频分类数据集的设计与实现
「深度学习一遍过」必修28:基于C3D预训练模型训练自己的视频分类数据集的设计与实现