如何将caffe的data prefetch变为多线程预取?

在深度学习研究时,数据预取会经常成为训练的瓶颈,一般来说,判断瓶颈的时候,看GPU利用率即可。通过nvidia-smi或者watch -n 1 nvidia-smi(实时刷新)都可查看GPU的利用率。

如上图所示,GPU利用率不能完全打满,断断续续的忽高忽低,大概率是因为数据取出速度慢 (其他原因,如GPU带宽一般不会成为瓶颈)。除此之外,在blocking_queue.cpp中也会打印出 Waiting for data日志。

目前的caffe实现中,由BasePrefetchingDataLayer基类及其对应的子类(如data_layer, video_data_layer, image_data_layer等)组成, BasePrefetchingDataLayer中主要部件如:

(1)BasePrefetchingDataLayer:构造函数,根据model(caffe.proto)中设置的data_param {pretch: 8}, 构造size=8的blocking_queue阻塞队列,并分配synced_memory缓存(显存);

  (2)  InternalThreadEntry(负责while循环, 不断取出batch(load_batch)放入prefetch_full_队列并同步到GPU);

(3)Forward_cpu: 负责从prefetch_full_.pop("Waiting for data") 弹出准备好的batch 并送入下一层的bottom blob;  

  (4)  prefetch_full_: 阻塞队列,负责缓存已经load的数据,供给网络持续消费;

 (5) prefetch_free_: 阻塞队列, 消费掉的batch缓存进行回收,供数据预取下次取出的batch使用;

  对于子类来说,比如video_data_layer, 主要是实现load_batch或定义自己的InternalThreadEntry,根据实际load的数据情况进行改动,不做具体说明.

  caffe master分支的数据预取为单线程,与solver->step(1)异步执行, 隐藏了数据延迟.数据处理的时间一般有:GPU同步,解码(取决于数据的存储格式,考虑到存储空间, 一般是jpg压缩存储,或者原始的jpg文件, 或者原始的video文件), 数据增强(例如:crop, resize, flip, mirror, 色调变化,resize, rotate等) 等.

解码,一般来说都是比较耗时的,如果喂给网络的是(超)高清图片,事前没有resize,则更耗时;对于视频来说,一batch会加载很多的数据,也是很耗时.接下来的data augument也是相当耗时.总之,这种情况下,数据预取很可能会成为瓶颈.

blocking_queue队列为天然的阻塞队列,为我们提供了很多方便,由单线程预取,变成多线程预取,是解决数据预取瓶颈的一条思路.其他的降低瓶颈的方法也有很多,例如:nvidia gpu解码,多线程视频解码,npp库data augument, nvidia dali等,不再一一说明.

如何改为多线程预取呢?主要是重载InternalThreadEntry操作, 一个简单的逻辑如下:

思路很简单,boost启动一组线程,  load_entry函数中,主要循环load batch,从prefetch_free_取出空闲buffer,  装载数据并塞入prefetch_full_队列,供给网络消费,不再执行BasePrefetchingDataLayer的InternalThreadEntry操作.

水平有限,请多指教!谢谢!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seasermy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值