一、数据预处理加速(提升 4~6 倍)
- 优化原因:
- 原版 caffe ssd 数据预处理速度很慢(尤其是遇到 depthwise conv 的时候)
- 数据预处理的速度远远跟不上前向和反向计算的速度,导致训练速度很慢
- 优化方法:
- 数据预处理对多幅图片的处理改为
多线程
- 数据预处理过程中,不需要将图片格式在
datum
和cv::Mat
之间来回转换导致不必要的时间浪费 - 参考代码 https://github.com/maidabu/caffe-ssd-optimized 替换
caffe ssd
源代码中的相应层
- 数据预处理对多幅图片的处理改为
二、多卡加速:NVIDIA NCCL
- 优化原因: 使用多卡加载预训练模型进行训练的时候报错,没有安装
nccl
- 优化方法: 安装 nccl
git clone https://github.com/NVIDIA/nccl.git cd nccl sudo make install -j16
三、重新编译 cudnn_conv 使其支持 cudnn7
-
优化原因: depthwise_conv 训练耗时严重,并且占用太多内存,
cudnn7+
中对其做了优化,支持 Group 卷积 -
优化方法: 参考代码 https://github.com/chuanqi305/MobileNetv2-SSDLite/tree/master/src 替换
caffe ssd
源代码中的相应层#include "caffe/layers/cudnn_conv_layer.hpp" #if CUDNN_MAJOR >= 7 #define USE_CUDNN_GROUP_INTERNAL #endif
-
部署问题: 多个模型混合测试时,既有 caffe_ssd(不支持 group)训练的,又有 caffe_fast(支持 group)训练的,需要把 caffe_fast 模型 deploy 中的 depth conv 改为(不支持 group)的传统卷积操作,这样才能合并用一个 caffe_ssd 测试
layer { name: "conv1/dw" type: "Convolution" bottom: "conv0" top: "conv1/dw" param { lr_mult: 0.1 decay_mult: 0.1 } convolution_param { num_output: 32 bias_term: false kernel_size: 3 stride: 1 pad: 1 group: 32 # engine: CAFFE # 部署时使用 caffe_ssd,把注释拿掉 weight_filler { type: "msra" } } }