0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

英特尔物联网 来源: 英特尔物联网 2023-12-08 15:30 次阅读

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

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

ec08d3d6-957b-11ee-8b88-92fbcf53809c.png

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

ec220130-957b-11ee-8b88-92fbcf53809c.png

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

ec49e27c-957b-11ee-8b88-92fbcf53809c.png

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

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

ec6e5bac-957b-11ee-8b88-92fbcf53809c.png

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

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

ecb38d44-957b-11ee-8b88-92fbcf53809c.png

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

3.3源码编译

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

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

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

左滑查看更多

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

edaf0052-957b-11ee-8b88-92fbcf53809c.pngedc465b4-957b-11ee-8b88-92fbcf53809c.png

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

ede710e6-957b-11ee-8b88-92fbcf53809c.png

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

ee0659ec-957b-11ee-8b88-92fbcf53809c.png

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

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

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

ee2bc27c-957b-11ee-8b88-92fbcf53809c.png

04实际项目测试

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

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

ee50cfcc-957b-11ee-8b88-92fbcf53809c.png

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

ee719496-957b-11ee-8b88-92fbcf53809c.png

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

05总结

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

审核编辑:汤梓红

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

    关注

    60

    文章

    9608

    浏览量

    170012
  • 模型
    +关注

    关注

    1

    文章

    2887

    浏览量

    48087
  • 边缘计算
    +关注

    关注

    22

    文章

    2882

    浏览量

    46563
  • OpenVINO
    +关注

    关注

    0

    文章

    65

    浏览量

    106

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

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用CUBEAI部署tflite模型到STM32F0中,模型创建失败怎么解决?

    CRC IP,用MX生成工程时已经启用了CRC,代码中也有。 但是依旧无法生成模型。 想问问该如何解决,还是说F0还是无法部署AI模型
    发表于 03-15 08:10

    使用TVM量化部署模型报错NameError: name \'GenerateESPConstants\' is not defined如何解决?

    各位好,我在使用TVM部署模型时,遇到一下错误,请问如何解决?我进esp.py文件看,有如下两个函数是找不到定义的: GenerateESPConstants(), ExtractConstantsFromPartition
    发表于 06-28 10:50

    设计实战:怎么解决阻抗匹配问题

    可能会受不了——这就是负载过轻的情况。另一个例子,不知道大家有没有过这样的经历:就是看不清楼梯时上/下楼梯,当你以为还有楼梯时,就会出现“负载匹配”这样的感觉了。当然,也许这样的例子不太恰当,但我们可以拿它来理解负载
    发表于 01-06 16:07

    求一维数组大小,出现类型匹配的问题

    `求一维数组大小,出现类型匹配的问题,改过类型也不行`
    发表于 03-13 16:38

    Hibernate模型匹配的解决方法

    模型匹配(阻抗匹配)Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库
    发表于 05-23 06:34

    系统内的阻抗匹配问题浅析

    存在的阻抗匹配问题大家遇到的比较多,两两之间的差异性也比较明显,问题主要出现在BOM和Java Object之间的阻抗匹配上。从字面上看
    发表于 05-31 07:02

    VHDL类型匹配错误

    嗨,我正在尝试编写以下文件DorQ.vhd,但Quartus 2一直给我一个错误错误(10381):在DorQ.vhd(49)的VHDL类型匹配错误:索引名称返回一个类型匹配的值
    发表于 03-23 07:12

    部署基于嵌入的机器学习模型

    1、如何在生产中部署基于嵌入的机器学习模型  由于最近大量的研究,机器学习模型的性能在过去几年里有了显著的提高。虽然这些改进的模型开辟了新的可能性,但是它们只有在可以
    发表于 11-02 15:09

    模块间接口设计匹配问题

    模块间接口设计匹配引起的问题   如果没有一个技术能力很强的集成者,往往在模块间容易出现设计上的错误。这种情况是灾难性的,双方都是在
    发表于 11-21 14:01 678次阅读

    何解决打印模型出现虚层的现象?

    如果你会使用3D打印机,那么你的各种奇思妙将想变成现实,一个崭新的DIY世界正向你敞开大门。但是对于一些新手朋友,在刚开始使用3D打印机时,打印模型出现虚层,这样就会影响模型的精度和美观,那么,我们今天就教大家如
    的头像 发表于 06-19 11:15 2919次阅读

    ONNX格式模型部署兼容性框架介绍

      ONNXRUNTIME介绍 ONNX格式模型部署兼容性最强的框架 ONNXRUNTIME,基本上不会有算子不支持跟兼容的情况出现,只要
    的头像 发表于 06-19 11:50 1941次阅读
    ONNX格式<b class='flag-5'>模型</b><b class='flag-5'>部署</b>兼容性框架介绍

    自定义算子开发

    一个完整的自定义算子应用过程包括注册算子算子实现、含自定义算子模型转换和运行含自定义op模型四个阶段。在大多数情况下,您的
    的头像 发表于 04-07 16:11 2169次阅读
    自定义<b class='flag-5'>算子</b>开发

    opencv写好的算子,比如找边 找圆 模版匹配

    opencv写好的算子,比如找边 找圆 模版匹配
    的头像 发表于 10-16 09:54 327次阅读

    arcgis空间参考与数据框匹配何解

    当使用ArcGIS软件进行空间数据处理时,经常会遇到空间参考与数据框匹配的问题。这种匹配可能导致数据显示不正确,分析结果不准确,甚至引发其他错误。本文将详细介绍空间参考与数据框
    的头像 发表于 02-25 11:17 6764次阅读

    BOM与焊盘为什么匹配

    何解决BOM与焊盘匹配的问题? ①同步更新BOM与焊盘设计 在设计变更时,确保BOM和焊盘设计同步更新,避免信息不一致。
    的头像 发表于 04-12 12:33 316次阅读