项目日志:caffe预测模块和yolo追踪模块的多gpu多线程改进

之前的模式是每个线程都有一个单独的模块实例,需要进行重复的模型加载。

为了实现模型为多个线程所复用,需要对模块进行改进。

嫌疑人识别模块和嫌疑车识别模块的结构是一致的,它们都先用yolo进行追踪,然后用caffe进行分类,所以涉及到这两个深度学习框架在多线程应用方面的改进。

caffe方面,它的部分代码采用了单例模式,并用boost::thread_specific_ptr来管理这部分代码(我不大清楚为什么这部分代码要用到thread local storage)。这导致没在一个线程中获取caffe的实例,都会在这个线程的local memory中分配内存,并进行一些初始化工作。占用了额外的时间和内存。对于这个问题,网上有一种做法是将caffe源码中的boost::thread_specific_ptr指针替换成普通的指针,就避免了在线程中分配内存和初始化的问题。但是,这样做在多线程场景中会出现漏洞,你必须给获取实例的get()函数中的初始化代码加上double mutex,不然可能会由于多线程而初始化不只一个实例,既不可控,也失去了单例模式的意义。还有一种做法是,不再使用单例模式,并将初始化功能从get()函数中分离出来,添加一个专门用于初始化的接口set(),并且保留了boost::thread_specific_ptr。这样做可以在thread local storage中进行可控的初始化。这些资源由context类型管理,用户使用context来获取caffe实例的控制。然后,结合多gpu的应用,作者设计了一个底层由blocking queue实现的context pool,池中的context的数量等于所有gpu上的caffe实例数量之总和。每次用户要在线程中使用caffe预测,就从池中取出一个context,用完则将其放回池中。于是乎实现了多gpu多线程之间模型的复用。

yolo这部分的改进比较棘手,由于要通过帧间目标位移来进行跟踪,所以需要在对象中维护上一帧目标的信息。那么这些信息为多线程所共享,如何在多线程间同步这些信息就需要一番功夫了。目前没有想到简单易行的改进方法,只能每个线程拥有一个独立的yolo对象了。

参考资料:
https://github.com/BVLC/caffe/issues/4595
https://github.com/NVIDIA/gpu-rest-engine

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值