解决caffe工程在多线程下不调用GPU的CUDA计算的问题

一、问题描述

本地电脑编译的“人证比对”工程,拿到其他电脑运行,不能调用CUDA核,只能在CPU上进行运算,因此,识别速度非常慢。

本地电脑-A:rtx2060, 显卡驱动,cuda10.1

其他电脑-B:geforce1060,显卡驱动

二、解决过程

1. 因为B机器上使用的Openpose工程可以正常使用cuda,怀疑是工程配置问题。

    (1)在A电脑的Openpose工程下,使用06_face_from_image项目下替换掉人证比对代码。使用Openpose的第三方库。拿到B机器上,仍然不能使用gpu进行计算。

    (2)使用同事电脑(显卡也为GeForce1060,在此电脑编译的Openpose可以在B电脑上运行,正常调用gpu),编译出来的工程,还是不能使用GPU进行计算。

2. 在A电脑上写了一个CUDA Sample,编译成exe后,拿到B电脑运行,可以调用GPU运算。(可以排除显卡型号不同,导致编译的exe不能用的问题)

3. 在A电脑上,用以前的一个人脸识别工程,流程是opencv调用摄像头,进行人脸检测和识别。发现在B机器上可以使用GPU计算。

三、灵感来了

突然发现,我的人证比对工程和二.3的区别就是人证比对工程的前项推理函数,都是创建了一个线程来执行:

g_checkThr = std::thread(checkStream, img);

突然想到:线程不是只能在CPU上开辟吗??没有听过在GPU上开辟线程的操作啊!!!好像这个线程把计算就固定在了CPU上,即使你指定了GPU,也不行。

于是开始Google(关键词 :gpu thread caffe),从这个看到了一句话:

被电到了!!!

于是在checkStream函数第一行就加上caffe::Caffe::set_mode(caffe::Caffe::GPU)。

如下:

void checkStream(std::string  img)
{
	caffe::Caffe::set_mode(caffe::Caffe::GPU);
	// 日志打印
	CLog::Initialize("D:\\tijianji\\npapi_faceid\\log_haibofaceid.cfg");
	LOGOUT("-------face program started-------");
    ……
}

好了!!!

也可以看中文解释

the `Caffe::mode_` variable that controls this is thread-local,
so ensure you’re calling `caffe.set_mode_gpu()` in each thread
before running any Caffe functions. That should solve your issue.

Caffe set_mode GPU 在多线程下失效
在main thread中设置GPU模式,在worker thread中调用网络进行检测,
GPU模式不起效,默认仍然使用CPU模式,所以速度很慢,和GPU相比慢了
10倍左右。

解决方案:在子线程中set_mode,然后调用网络进行检测。
(1)创建网络在main thread。static 网络存储在全局静态数据区。
worker thread可以直接使用。
(2) 在worker thread中检测,需要在子线程中set_mode,然后调用网络进行检测。

结论:
(1)caffe的set_mode所在的线程必须和使用nets进行forward的线程相同。否则默认使用CPU模式,速度会很慢。
(2)caffe的nets初始化可以在main thread也可以在worker thread。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值