如果我使用 Halide,为什么 opencv dnn 会变慢?
Why is opencv dnn slower if I use Halide?
我正在测试 opencv 源代码树中一些示例的性能,具体取决于是否使用卤化物。
令人惊讶的是,如果使用卤化物进行计算,性能会更差:
- squeezenet_halide:使用卤化物时约 24 毫秒,不使用卤化物时约 16 毫秒。
- resnet_ssd_face:使用卤化物约 84 毫秒,不使用卤化物约 36 毫秒。
我已经按照 this tutorial. The opencv code was downloaded from the master branch of the opencv git repository 中的说明编译了 halide 和 opencv。
我已经使用示例文件 'resnet_ssd_face.cpp' 和 'squeezenet_halide.cpp' 测试了性能。在这两种情况下,我都在调用 'forward' 之前包含了这些代码行之一,以激活或停用卤化物:
net.setPreferableBackend(DNN_BACKEND_HALIDE); // use Halide
net.setPreferableBackend(DNN_BACKEND_DEFAULT); // NOT use Halide
时间是在调用 'forward' 函数后使用此代码测量的:
std::vector<double> layersTimings;
double freq = cv::getTickFrequency() / 1000;
double time = net.getPerfProfile(layersTimings) / freq;
std::cout << "Time: " << time << " ms" << std::endl;
教程中是否遗漏了什么? Halide 应该用不同的参数编译吗?
我的设置是:
OS: Linux (Ubuntu 16.04)
CPU: Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
GPU: nVidia GeForce GT 730 (Driver Version: 384.90)
Cuda: CUDA Version 9.0.176
考虑到 Dmitry Kurtaev and looking the wiki in the OpenCV GitHub account, I found a page 的评论,其中包含比较不同方法的基准(我错过了教程中的链接)。
此外,还有一个 merge request 包含了类似的基准。
在两者中,时间测量表明使用 Halide 的性能比使用原始 c++ 方法的性能差。
我可以假设 Halide 集成处于早期阶段。此外,正如 Zalman Stern 评论,Halide 调度正在进行中,opencv 的 dnn 模块中的原始优化可能比包含的 Halide 调度更准确。
我希望这个措施能在未来的 OpenCV 版本中有所改变,但就目前而言,这就是性能。
我的回答有点不相关但很有帮助
人脸检测+人脸对齐:
正常 SSD 检测时间:50 - 55 毫秒
使用 Openvino 推理引擎:40 - 45 毫秒
我正在测试 opencv 源代码树中一些示例的性能,具体取决于是否使用卤化物。
令人惊讶的是,如果使用卤化物进行计算,性能会更差:
- squeezenet_halide:使用卤化物时约 24 毫秒,不使用卤化物时约 16 毫秒。
- resnet_ssd_face:使用卤化物约 84 毫秒,不使用卤化物约 36 毫秒。
我已经按照 this tutorial. The opencv code was downloaded from the master branch of the opencv git repository 中的说明编译了 halide 和 opencv。
我已经使用示例文件 'resnet_ssd_face.cpp' 和 'squeezenet_halide.cpp' 测试了性能。在这两种情况下,我都在调用 'forward' 之前包含了这些代码行之一,以激活或停用卤化物:
net.setPreferableBackend(DNN_BACKEND_HALIDE); // use Halide
net.setPreferableBackend(DNN_BACKEND_DEFAULT); // NOT use Halide
时间是在调用 'forward' 函数后使用此代码测量的:
std::vector<double> layersTimings;
double freq = cv::getTickFrequency() / 1000;
double time = net.getPerfProfile(layersTimings) / freq;
std::cout << "Time: " << time << " ms" << std::endl;
教程中是否遗漏了什么? Halide 应该用不同的参数编译吗?
我的设置是:
OS: Linux (Ubuntu 16.04)
CPU: Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz
GPU: nVidia GeForce GT 730 (Driver Version: 384.90)
Cuda: CUDA Version 9.0.176
考虑到 Dmitry Kurtaev and looking the wiki in the OpenCV GitHub account, I found a page 的评论,其中包含比较不同方法的基准(我错过了教程中的链接)。
此外,还有一个 merge request 包含了类似的基准。
在两者中,时间测量表明使用 Halide 的性能比使用原始 c++ 方法的性能差。
我可以假设 Halide 集成处于早期阶段。此外,正如 Zalman Stern 评论,Halide 调度正在进行中,opencv 的 dnn 模块中的原始优化可能比包含的 Halide 调度更准确。
我希望这个措施能在未来的 OpenCV 版本中有所改变,但就目前而言,这就是性能。
我的回答有点不相关但很有帮助
人脸检测+人脸对齐:
正常 SSD 检测时间:50 - 55 毫秒
使用 Openvino 推理引擎:40 - 45 毫秒