如何解决模型部署时出现算子不匹配问题

描述

 

作者:颜国进 英特尔边缘计算创新大使

 

01前言

英特尔发行版 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 设备部署出现算子不支持问题。因此在该文章中,我将结合该问题的解决过程,向大家展示对于大多数开发者,如何解决模型部署时出现算子不匹配问题。

02提交 Issues

OpenVINO 是在 GitHub 上开源的一个项目,源码开源,因此我们可以将源码下载下来自己进行编译,因此我们可以修改源码,但是对于大多数开发者来说,修改源码是很难实现的。GitHub 上的开源项目提供了 Issues 功能,开发者在使用时如果遇到问题,可以通过提交 Issues 向官方开发人员求助。

提交 Issues 的流程如下:

01访问 OpenVINO 厂库 Issues 页面,然后创建一个 [new Issues]

OpenVINO 厂库 Issues 页面:

https://github.com/openvinotoolkit/openvino/issues

OpenVINO

02选择一个 Issues 类型,可以根据自己的问题类型进行选择

OpenVINO

03选择完类型后,就可以根据自己的问题情况,填写相关的内容

OpenVINO

04以该问题为例,简单介绍一下 Issues 内容:

首先是基础内容填写,主要包括 OpenVINO 版本、开发平台、推理设备、模型框架、所部署的模型以及问题的简单描述。对于该问题,所提交的内容如下所示:

OpenVINO

接下来是详细复述问题出现的流程,为了让开发者能够更清楚地了解问题,这一不需要写的非常详细,确保开发人员能够完整复现该问题。如果复现步骤比较简单,可以在此处进行详细描述,如果问题副相比较复杂,并且存在多个文件,那就需要创建一个 GitHub 厂库存放相关文件。

最后一步就是添加错误日志输出,主要是为了让开发人员根据日志确认是否成功复现问题,或者是可以根据日志输出定位问题所在。

在提交 Issues 后,OpenVINO 官方人员会根据问题内容,分配开发人员进行解决,此时我们就只需要等待 OpenVINO 官方回复即可。

03编译 OpenVINO 源码

上一步中我们已经相关方求助,不久之后便可以获得官方的解答,但是官方的解答如果涉及到源码的修改,可能对于大多数开发者来说会无从下手,对于涉及到源码的改动,如果想直接在项目中使用,就需要自行进行源码编译。因为你所提出的问题官方给出的解决方案如果比较有价值的话,可能会在后续的版本中修复,并发布到最新版本中。但对于我们使用者来说,我们需要立刻就使用,而无法等待到下一个版本发布。因此,我们将结合官方给的回复与改动,基于 Windows 平台,一步步从源码开始,实现源码编译与使用。

3.1 下载源码

 

OpenVINO 源码可以通过 Git 进行下载,使用 Git 依次运行下面代码:

 

git clone https://github.com/openvinotoolkit/openvino.git
cd openvino
git submodule update --init

 

左滑查看更多

由于网络问题,此处下载可能较慢,但一定要保证上面下载的一些附加依赖能够完整下载,不然后面编译会出现错误。如果后面生成编译文件时出现项目缺少,那主要原因就是此处因为网络原因,有一些文件没有下载下来,此处我也是下载了好几次才下载下来完整的文件。

 

3.2 修改源码

 

上一步我们已经下载完源码,下一步就是需要根据官方给的修改意见对源码进行修改,如下图所示,该截图为官方提供的源码修改意见:

OpenVINO

在该返回意见中,我们需要在源码中增加一些代码,所以此处大家可以根据情况对源码进行修改即可。

 

3.3 源码编译

 

上一步中已经下载并修改好了源码,接下来就可以进行编译了,此处我们采用 Cmake+vs2022 的方式进行编译,通过 Cmake 编译生成 VS2022 项目,然后使用 VS 编译项目源码。

首先依次运行下面两条命令:

 

mkdir build && cd build
cmake -G "Visual Studio 17 2022"  -DCMAKE_BUILD_TYPE=Debug

 

左滑查看更多

此处需要把“”替换成自己的 OpenVINO 路径,运行完第一条命令后,会创建 build 文件夹 并切换到该文件夹中。运行完第二条命令后,如下图所示,会根据项目中的 CMakeLists 文件进行编译,最后编译成功的输出如第二张图所示。 

OpenVINOOpenVINO

如果得不到上图效果,说明编译中出现了问题,需要回头查找相关的错误。跟俊之前的编译经验,主要问题是出现在第一步中,主要原因是因为网络问题导致的相关配置没有下载。最后编译成功后,会在 build 文件中出现 OpenVINO.sln 项目解决方案。

OpenVINO

接下来我们使用 VS2022 打开该解决方案,然后通过设置 Debug 或 Release 来选择生成的动态链接库是什么版本,然后右击 ALL_BUILD 项目,点击生成,便可以运行项目进行源码编译。

OpenVINO

友情提示,这一步源码编译由于涉及的代码文件角度,因此需要较长的时间来生成。

 

3.4 获取编译后的动态链接库

 

项目运行成功后,我们可以在下面路径下找到编译出的动态链接库文件,可以看出,编译所生成的 .dll 文件以及 .lib 文件,是我们所下载的官方发布的 OpenVINO 发行版 Runtime 中的文件是一致的,因此在后续使用时,我们只需要将我们编译生成的动态链接库文件替换到当前项目中即可。

OpenVINO

04实际项目测试

该案例主要是基于 RT-DETR 模型使用 GPU 部署出现问题为例,最后我们回到该案例中,测试是否解决了我们的问题。关于使用在 C++ 部署 RTDETR 模型的流程可以参考我的上一篇文章:《基于 OpenVINO C++ API 部署 RT-DETR 模型 | 开发者实战》,因此此处对于 C++ 项目配置不再作过多讲解。

如下图所示,该图片是我们使用当前发行版本 OpenVINO 2023.2 运行结果,此处我们使用的是 GPU.0 集成显卡运行推理,可以看出,模型在推理阶段会出现错误导致程序崩溃结束。

OpenVINO

接下来我们用我们上面自行编译生成的动态链接库运行程序,可以看出,在使用 GPU.0 集成显卡运行推理时,错误已经消失了,并且成功运行模型推理,并打印出了结果。

OpenVINO

通过对比测试,说明官方所给出的解决方案是正确的,我们也成功根据官方给出的解决方案解决了当前问题,并且不用等待官方发布下一个版本便可以提前使用,方便大家。

05总结

在本文中,我们结合一个模型部署案例,向大家讲解了使用 OpenVINO 时出现算子不匹配等问题时,对于我们使用者来说,如何在官方开发者的帮助下,解决自己所遇到的问题。另外,通过该方式,我们也向 OpenVINO 反馈了代码中存在的 Bug,在解决我们问题的同时,也积极为开源做出了自己的贡献。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分