【哪吒开发板试用】(二)在iGPU上使用OpenVINO(C++)推理Transformer模型
上篇文章分享了哪吒开发板的开箱和Ubuntu22.04系统的安装,这篇文章将分享一下我使用哪吒开发板在iGPU上使用OpenVINO(C++)推理Transformer模型的过程。
OpenVINO配置
在OpenVINO官网下载linux版本的压缩包到开发板上
将压缩包解压
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#98c379">tar</span> -zxvf l_openvino_toolkit_ubuntu22_2<span style="color:#d19a66">024.3.0.160</span>41.<span style="color:#d19a66">1</span>e3b88e4e3f_x86_64.tgz</span></span>
进入解压目录,安装依赖
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#98c379">cd</span> l_openvino_toolkit_ubuntu22_2<span style="color:#d19a66">024.3.0.160</span>41.<span style="color:#d19a66">1</span>e3b88e4e3f_x86_64/
<span style="color:#98c379">sudo</span> -E ./install_dependencies/install_openvino_dependencies.sh</span></span>
然后配置环境变量
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#e6c07b">source</span> ./setupvars.sh</span></span>
至此,OpenVINO就安装好了,因为我当前的项目不需要其他依赖包,如果需要跑Yolo这样的模型就还需要安装OpenCV等其他依赖。
如果需要将模型部署在iGPU上,还需要另外安装OpenCL runtime packages,参见官方说明文档,这里我使用deb包的方式进行安装,按照Github的说明下载7个deb包到开发板上,然后dpkg安装
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#98c379">sudo</span> dpkg -i <span style="color:#98c379">*.deb</span></span></span>
如果有依赖报错,就要先apt安装依赖,然后再dpkg安装7个deb包
<span style="background-color:#282c34"><span style="color:#abb2bf">sudo apt <span style="color:#c678dd">install</span> ocl-icd-libopencl1</span></span>
这样在iGPU上进行OpenVINO推理的环境就配置完成了。
Transformer模型推理
下面是我自己项目的一个演示,我的模型是一个基于Tansformer的小模型,训练完生成后onnx中间表示,OpenVINO可以直接使用onnx进行推理,不过转为OpenVINO IR格式的模型推理会快一点,转换命令如下:
<span style="background-color:#282c34"><span style="color:#abb2bf">ovc <span style="color:#c678dd">model</span>.onnx</span></span>
转换默认会生成FP16的模型,如果精度有较大损失,可指定compress_to_fp16为False就不会进行FP16量化了。
<span style="background-color:#282c34"><span style="color:#abb2bf">ovc model.onnx <span style="color:#98c379">--compress_to_fp16</span>=<span style="color:#56b6c2">False</span></span></span>
转换后,将生成.xml和.bin两个文件,.xml文件描述了模型的结构,.bin文件包含了模型各层的参数。
我这里使用cmake进行构建,在CMakeLists.txt中指定前面解压的OpenVINO路径
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#61aeee">cmake_minimum_required</span>(VERSION <span style="color:#d19a66">3.10</span>.<span style="color:#d19a66">0</span>)
<span style="color:#61aeee">project</span>(AutoInjector_Transformer)
<span style="color:#61aeee">set</span>(CMAKE_CXX_STANDARD <span style="color:#d19a66">20</span>)
<span style="color:#61aeee">set</span>(CMAKE_CXX_STANDARD_REQUIRED ON)
<span style="color:#61aeee">set</span>(OpenVino_ROOT /home/up/openvino/l_openvino_toolkit_ubuntu22_2024.<span style="color:#d19a66">3.0</span>.<span style="color:#d19a66">16041.1</span>e3b88e4e3f_x86_64/runtime)
<span style="color:#61aeee">set</span>(OpenVINO_DIR ${OpenVino_ROOT}/cmake)
<span style="color:#61aeee">find_package</span>(OpenVINO REQUIRED)
<span style="color:#e6c07b">include_directories</span>(
${OpenVino_ROOT}/include
${OpenVino_ROOT}/include/openvino
)
<span style="color:#e6c07b">link_directories</span>(
${OpenVino_ROOT}/lib
${OpenVino_ROOT}/lib/intel64
)
<span style="color:#61aeee">add_executable</span>(AutoInjector_Transformer AutoInjector_Transformer.cpp)
<span style="color:#61aeee">target_link_libraries</span>(AutoInjector_Transformer openvino)</span></span>
然后通过cmake构建项目
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#e6c07b">mkdir</span> build && <span style="color:#c678dd">cd</span> build
cmake ..
<span style="color:#c678dd">make</span></span></span>
然后运行生成的可执行文件
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#98c379">./AutoInjector_Transformer</span></span></span>
可以看到,在iGPU上的推理速度还是很快的,前几次推理稍慢,8ms,后续基本稳定在4ms,这跟我之前在RTX4060 GPU上用TensorRT推理并没有慢多少。然后我这里修改了代码改为CPU运行,重新编译、运行,结果在CPU上的速度还要更快一点。
以上就是在哪吒开发板上配置OpenVINO环境,在iGPU上推理Transformer模型的过程,相关代码、模型和数据因为涉及保密,不方便开放,因此我在Github上开源了另一个基于OpenVINO部署YoloV8模型对摄像头采集到的图像进行实时目标检测的项目,大家感兴趣的话可以clone下来跑一跑项目地址:https://github.com/EtAiorsW/yolov8-openvino