当OpenVINO不支持你所部署模型算子时,你该如何做?

作者:英特尔边缘计算创新大使 颜国进
1. 前言
英特尔发行版 OpenVINO™工具套件基于oneAPI 而开发,可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,适用于从边缘到云的各种英特尔平台上,帮助用户更快地将更准确的真实世界结果部署到生产系统中。通过简化的开发工作流程, OpenVINO™可赋能开发者在现实世界中部署高性能应用程序和算法。OpenVINO™ 2023.2于2023年11月16日发布,该工具包带来了挖掘生成人工智能全部潜力的新功能。更多的生成式 AI 覆盖和框架集成,以最大限度地减少代码更改,并且扩展了对直接 PyTorch 模型转换的模型支持。支持更多新的模型,包括 LLaVA、chatGLM、Bark和 LCM等著名模型。支持更广泛的大型语言模型 (LLM)和更多模型压缩技术,支持运行时推理支持以下 Int4 模型压缩格式,通过神经网络压缩框架 (NNCF) 进行本机 Int4 压缩等一系列新的功能。
通过最新的OpenVINO™更新信息,我们可以看出,OpenVINO™其实是在不断更新迭代,并且适配更多新的模型。其主要原因是不少新出现的模型可能会带来更多新的算子,而OpenVINO™可能会在后续的版本更新中才会适配。但如果我们当前阶段需要使用OpenVINO™部署该深度学习模型,那我们该怎么做?
其实对于一些编程大佬,以及对OpenVINO™有深入研究的人,他们可以对OpenVINO™源码进行修改,然后自己写模型算子,添加到OpenVINO™中。但是,开发算子的门槛是很高的,对于大多数开发者来说,这是很困难很难实现的。
在之前部署RT-DETR模型时,我也遇到了该模型在OpenVINO™使用GPU设备部署出现算子不支持问题。因此在该文章中,我将结合该问题的解决过程,向大家展示对于大多数开发者,如何解决模型部署时出现算子不匹配问题。
2. 提交Issues
OpenVINO™是在GitHub上开源的一个项目,源码开源,因此我们可以将源码下载下来自己进行编译,因此我们可以修改源码,但是对于大多数开发者来说,修改源码是很难实现的。GitHub上的开源项目提供了Issues功能,开发者在使用时如果遇到问题,可以通过提交Issues向官方开发人员求助。提交Issues的流程如下:
(1)访问OpenVINO™厂库Issues页面(Issues · openvinotoolkit/openvino · GitHub),然后创建一个[new Issue*****r/>
(2)选择一个Issues类型,可以根据自己的问题类型进行选择。
(3)选择完类型后,就可以根据自己的问题情况,填写相关的内容。
(4)以该问题为例,简单介绍一下Issues内容:
首先是基础内容填写,主要包括OpenVINO版本、开发平台、推理设备、模型框架、所部署的模型以及问题的简单描述。对于该问题,所提交的内容如下所示:
接下来是详细复述问题出现的流程,为了让开发者能够更清楚地了解问题,这一不需要写的非常详细,确保开发人员能够完整复现该问题。如果复现步骤比较简单,可以在此处进行详细描述,如果问题副相比较复杂,并且存在多个文件,那就需要创建一个GitHub厂库存放相关文件。
最后一步就是添加错误日志输出,主要是为了让开发人员根据日志确认是否成功复现问题,或者是可以根据日志输出定位问题所在。
在提交Issues后,OpenVINO官方人员会根据问题内容,分配开发人员进行解决,此时我们就只需要等待OpenVINO官方回复即可。
3. 编译OpenVINO源码
上一步中我们已经相关方求助,不久之后便可以获得官方的解答,但是官方的解答如果涉及到源码的修改,可能对于大多数开发者来说会无从下手,对于涉及到源码的改动,如果想直接在项目中使用,就需要自行进行源码编译。因为你所提出的问题官方给出的解决方案如果比较有价值的话,可能会在后续的版本中修复,并发布到最新版本中。但对于我们使用者来说,我们需要立刻就使用,而无法等待到下一个版本发布。因此,我们将结合官方给的回复与改动,基于Windows平台,一步步从源码开始,实现源码编译与使用。官方提供的源码编译流程链接为:
https://github.com/openvinotoolkit/openvino/blob/master/docs/dev/build_window***d
3.1 下载源码
OpenVINO™源码可以通过Git进行下载,使用Git依次运行下面代码git clone https://github.com/openvinotoolkit/openvino.git
cd openvino
git submodule update --init
由于网络问题,此处下载可能较慢,但一定要保证上面下载的一些附加依赖能够完整下载,不然后面编译会出现错误。如果后面生成编译文件时出现项目缺少,那主要原因就是此处因为网络原因,有一些文件没有下载下来,此处我也是下载了好几次才下载下来完整的文件。
3.2 修改源码
上一步我们已经下载完源码,下一步就是需要根据官方给的修改意见对源码进行修改,如下图所示,该截图为官方提供的源码修改意见:在该返回意见中,我们需要在源码中增加一些代码,所以此处大家可以根据情况对源码进行修改即可。
3.3 源码编译
上一步中已经下载并修改好了源码,接下来就可以进行编译了,此处我们采用Cmake+vs2022的方式进行编译,通过Cmake编译生成VS2022项目,然后使用VS编译项目源码。首先依次运行下面两条命令:
mkdir build && cd build
cmake -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=Debug
此处需要把“<path/to/openvino>”替换成自己的OpenVINO路径,运行完第一条命令后,会创建build文件夹 并切换到该文件夹中。运行完第二条命令后,如下图所示,会根据项目中的CMakeLists文件进行编译,最后编译成功的输出如第二张图所示。
如果得不到上图效果,索命编译中出现了问题,需要回头查找相关的错误。本剧之前的编译经验,主要问题是出现在第一步中,主要原因是因为网络问题导致的相关配置没有下载。左后编译成功后,会在build文件中出现OpenVINO.sln项目解决方案
接下来我们使用VS2022打开该解决方案,然后通过设置Debug或Release来选择生成的动态链接库是什么版本,然后右击ALL_BUILD项目,点击生成,便可以运行项目进行源码编译。
友情提示,这一步源码编译由于涉及的代码文件角度,因此需要较长的时间来生成。
3.4 获取编译后的动态链接库
项目运行成功后,我们可以在下面路径下找到编译出的动态链接库文件,可以看出,编译所生成的.dll文件以及.lib文件,是我们所下载的官方发布的OpenVINO发行版Runtime中的文件是一致的,因此在后续使用时,我们只需要将我们所生成的动态链接库文件替换成沃尔玛你所编译的即可。4. 实际项目测试
该案例主要是基于RT-DETR模型使用GPU部署出现问题为例,最后我们回到该案例中,测试是否解决了我们的问题。关于使用在C++部署RTDETR模型的流程可以参考我的上一篇文章:《基于 OpenVINO™ C++ API 部署 RT-DETR 模型 | 开发者实战》(基于 OpenVINO™ C++ API 部署 RT-DETR 模型 | 开发者实战),因此此处对于C++项目配置不再作过多讲解。如下图所示,该图片是我们使用当前发行版本OpenVINO 2023.2运行结果,此处我们使用的是GPU.0集成显卡运行推理,可以看出,模型在推理阶段会出现错误导致程序崩溃结束。
接下来我们用我们上面自行编译生成的动态链接库运行程序,可以看出,在使用GPU.0集成显卡运行推理时,错误已经消失了,并且成功运行模型推理,并打印出了结果。
通过对比测试,说明官方所给出的解决方案是正确的,我们也成功根据官方给出的解决方案解决了当前问题,并且不用等待官方发布下一个版本便可以提前使用,方便大家。
5. 总结
在本文中,我们结合一个模型部署案例,向大家讲解了使用OpenVINO时出现算子不匹配等问题时,对于我们使用者来说,如何在官方开发者的帮助下,解决自己所遇到的问题。另外,通过该方式,我们也向OpenVINO反馈了代码中存在的Bug,在解决我们问题的同时,也积极为开源做出了自己的贡献。
0个评论