开发者实战 | 当 OpenVINO™ 不支持你所部署模型算子时,你该如何做?

点击蓝字

关注我们,让开发变得更有趣

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

6373655084ecf8ec3fd015003e65387c.png

01

前言

英特尔发行版 OpenVINO™ 工具套件基于 oneAPI 而开发,可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,适用于从边缘到云的各种英特尔平台上,帮助用户更快地将更准确的真实世界结果部署到生产系统中。通过简化的开发工作流程,OpenVINO™ 可赋能开发者在现实世界中部署高性能应用程序和算法。

ba5ad4fb150b8bdc77a40ed1dfc1219f.png

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

be67f07b99bcef18507eb55cea1c7bf8.png

02

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

d2095d92833bc3cd5d99eb878af94148.png

03

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

eb3a5334648e37797408a098698e934c.png

04

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

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

efe80fbc3501dd9f57210c731740535e.png

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

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

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

03

编译 OpenVINO™ 源码

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

官方提供的源码编译流程链接为:

https://github.com/openvinotoolkit/openvino/blob/master/docs/dev/build_windows.md

outside_default.png

3.1 下载源码

outside_default.png

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

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

左滑查看更多

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

outside_default.png

3.2 修改源码

outside_default.png

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

b58e593c1460b3b3aa55dfba58a6c9f7.png

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

outside_default.png

3.3 源码编译

outside_default.png

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

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

mkdir build && cd build
cmake -G "Visual Studio 17 2022" <path/to/openvino> -DCMAKE_BUILD_TYPE=Debug

左滑查看更多

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

6bb4d68e03d65d6d85d52c22451ec5d8.png

ae2da9c9a5396890eb30d6dfee5c934f.png

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

c6b4d434b0cde56d3a457886d8819e39.png

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

39fe7c670c84a18cdecf34f0e9877e43.png

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

outside_default.png

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

outside_default.png

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

5040389556f532b5861ec9a1840f63ed.png

04

实际项目测试

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

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

a64e073ca03580899ff85f6722bde265.png

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

cda0bf76bc911889a71b69bb08fa5953.png

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

05

总结

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

OpenVINO™

--END--

你也许想了解(点击蓝字查看)⬇️➡️ OpenVINO™ 2023.2 发布:让生成式 AI 在实际场景中更易用➡️ 开发者实战 | 介绍OpenVINO™ 2023.1:在边缘端赋能生成式AI➡️ 基于 ChatGLM2 和 OpenVINO™ 打造中文聊天助手➡️ 基于 Llama2 和 OpenVINO™ 打造聊天机器人➡️ OpenVINO™ DevCon 2023重磅回归!英特尔以创新产品激发开发者无限潜能➡️ 5周年更新 | OpenVINO™  2023.0,让AI部署和加速更容易➡️ OpenVINO™5周年重头戏!2023.0版本持续升级AI部署和加速性能➡️ OpenVINO™2023.0实战 | 在 LabVIEW 中部署 YOLOv8 目标检测模型➡️ 开发者实战系列资源包来啦!➡️ 以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️ 还不知道如何用OpenVINO™作画?点击了解教程。
扫描下方二维码立即体验 
OpenVINO™ 工具套件 2023.2

点击 阅读原文 立即体验OpenVINO 2023.2

39c282417c16511a7e3628d49dfd975f.png

文章这么精彩,你有没有“在看”?

猜你喜欢

转载自blog.csdn.net/OpenVINOCC/article/details/134985839