端智能研发核心套件,MNN 工作台深度解析

2024-03-17 03:18

本文主要是介绍端智能研发核心套件,MNN 工作台深度解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

b92988fa9a38002b8e7d791bf938da94.gif

MNN 工作台开源地址:

开源地址:https://github.com/alibaba/MNN

背景

随着移动互联网的快速发展,人工智能在移动端上的应用越来越广泛,端智能在图像识别、视频检测、数据计算等核心场景发挥着重要作用。众所周知,Python 是算法进行端智能研发的首选语言,目前阿里巴巴内已经建立了端智能的研发生态,包含 Python 虚拟机,系列的数据/视觉等运行时 Python 扩展库、Python 任务调度库,以及配套的任务发布系统等等。

端智能的主要场景在数据计算、视觉内容理解这两个领域,如果算法研发完全在 PC 端的会简单的多,因为 PC 环境对于 Python 的研发有官方天然的支持,但在移动端上,进行算法的部署、调试、验证,仍处在“刀耕火种”的时代,目前算法主要通过两种途径:

  1. 日志调试:完全脱离运行时代码,通过在代码中插入日志,验证程序的运行逻辑和结果。

  2. PC 模型端侧环境:为了能够进行代码的断点调试,在 PC 侧搭建和安装端侧 Python 代码依赖的所有库,让 Python 程序能独立地运行和在和调试在 PC 端通用 IDE(如 PyCharm )上,数据输入则使用 Mock 的方式。

通过打日志当然也能验证结果和定位问题,但一旦工程稍微复杂点,生产效率会非常低;而脱离移动端环境,在 PC 侧独立运行,并不能反应真实的运行环境(实时数据、运行性能等),无法保证 PC 和端侧数据的一致性。

上面两种研发方式的主要问题是脱离了代码当前的运行环境,因而会产生调试信息的缺失。我们知道,每一种语言在开发者之间的流行都离不开配套的 IDE 调试工具,就像可以使用 Xcode 调试手机应用的 OC 代码一样,我们需要一种能真正进行端智能算法在端侧部署和调试的工具和方案,来提高 AI 研发生产效率。

9082484f881d295c2d96c3453782e945.png

MNN 工作台

MNN 是阿里巴巴开源的一个轻量级深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。

开源地址:https://github.com/alibaba/MNN

除 MNN 引擎建设外,MNN 团队还深度参与了阿里内部的端AI应用实践。AI 应用门槛高、算法模型部署链路长是长期困扰我们的问题。为了解决这两个问题,我们将上百次实践中长期积累的方案沉淀为一站式 AI 研发范式 —— MNN 工作台。(www.mnn.zone 或点击文末阅读原文,下载 MNN 工作台)

MNN 工作台提供了端 AI 的研发范式,同时它也是一个对移动端 Python 的通用调试编辑器,工作台不仅包含标准的端侧 Python 调试能力,还覆盖了阿里集团内端智能算法常用的研发部署场景,是算法研发的效率工具。

73d22760366ae4573d3ae51478253f90.png

工作台提供了 VSCode 风格的 Python 集成开发环境,它的使用过程很简单,一般分为三步:

085042e885cc2891dc929cc554f49d13.png

  1. 建立连接:应用通过扫描工作台上的二维码,建立局域网内手机和PC的连接 

  2. 代码推送:工作台上的工程通过局域网推送到端侧应用中 

  3. 运行:端侧应用触发执行端侧 Python 代码,如果设置了断点,就可以进行端侧代码的调试了

a0aec2d7b015e9c820ad93ddae8f5abc.gif

  端计算研发

MNN 工作台同样为阿里内重要的端智能场景 - 端计算的研发提供了高效的本地调试部署方案,覆盖了 Walle/Jarvis、CV 这几个主要的端计算场景。

  • 研发流程

9a62d3a21279c6b4626f25188a401741.png

在此之前,端计算的研发是依赖于平台发布的,在开发阶段将调试日志加到代码中,通过预发/beta发布到平台,然后再扫码连接到平台将日志输出,通过日志来定位和分析问题,以此往复。这种方式相对比较原始,开发调试周期也比较长,一次修改或验证就是一轮上传发布的操作,而且调试信息只有日志,整体开发效率比较低。

68c15ec5981e1546078b9034bc88f05a.png

上图为算法使用工作台进行端计算研发的一般过程:

  1. 新建端计算工程,或打开从平台 clone 的端计算工程

  2. 应用扫码连接工作台,此时工作台中会实时输出算法的日志

  1. 在工作台 IDE 环境中开发代码,修改配置,添加资源

  2. 运行任务,此时任务会通过本地推送部署到端上。线上/预发环境都可以,任何代码都不会影响到线上,无需担心稳定性问题

  1. 代码断点调试、查看堆栈、变量等

  2. 工作台本地测试通过后,提交代码,再进行后续的平台发布操作

工作台有效解决了算法在开发阶段的调试部署问题,它的主要优势在于:

  1. 本地部署,开发阶段可以完全脱离平台

  2. 支持端计算工程的实时 Python 调试

  3. 端上部署不受预发/线上环境,或窗口期的限制

  4. 实时查看端侧算法的运行性能

  • 持久化调试

c450f909a7a7ac8d457fb04a341158af.gif

端计算任务的触发一般都是 UT,也有工程主动调用的,不管触发方式如何,代码只要推送一次,后面每次触发都会运行调试,除非代码有修改才需要重新推送,这就是工作台的持久化调试能力。

  • 实时日志

dcc3fa72a236c3735b1dd9350ba5181b.gif

工作台支持各种类型日志的实时打印,在设备与工作台连接成功后就可以开始使用,支持的日志类型包含:

  1. Current Task:本工程日志,包含本工程普通 print 日志和工程的运行日志 

  2. Python:应用中所有的 Python 日志

  3. C:通过端计算提供的 C 接口打印的日志 

  4. OC/Java:通过端计算中 Java/OC 接口打印的日志

  • 端文件浏览器

 451ab2c56ed8ae9e00ab7c0ca33a4d0c.gif

端计算研发中,经常需要查看或处理设备的本地文件,如数据库文件、深度学习模型、资源图片、脚本等等。工作台中提供了可视化的设备文件浏览器,iOS 设备上可以查看应用的沙盒目录,Android 设备上的浏览和 Android Studio 一样,同时支持常用的目录/文件的本地保存和路径拷贝。

  • 依赖二方库联调

有时算法需要去查看依赖库代码的运行情况,工作台同样能支持依赖 Python 二方库的研发,本地部署时会将算法指定的依赖库和工程一起推送到端上,调试的时候也能断点到库代码中。

401f539ef3bc1606d27d1bcfa81a08cf.gif

上图展示了一个 Jarvis 工程依赖 Jarvis 基础库中的代码进行联调的过程,log.log 为 Jarvis 基础库中的打印方法。依赖二方库联调只影响到本工程,对其他工程不会产生任何影响。 

  视觉内容理解研发 

Walle/Jarvis 都属于端计算的数据场景,除此之外很大一部分算法处理的都是视频、图片,最常见的是摄像头/视频流输入、内存中的图片,典型的算法如图像分类、目标检测等,他们都是算法在计算机视觉(CV,Computer Vision)场景中的具体应用,简称视觉算法。

  • CV 部署方案

端计算框架为数据算法提供了丰富了 Python 运行时扩展库,算法可以基于这些库开发各种 Python 计算任务,然后部署在端上执行。而针对视觉场景,图片和视频流的处理一般都涉及到计算机视觉库 OpenCV 以及函数计算库 Numpy,之前的端侧 Python 运行时库中并不包含,所以算法在 PC 上使用 Python 开发的视觉算法并不能直接运行在端上,所以一般都是使用 SDK 集成的部署方式:

99aaf056100cbe33a83e92643e811814.png

算法使用 Python 在 PC 环境开发,通常都会基于 OpenCV/Numpy 等基础库,移植到端上时,虽然端上这些基础还未支持,但可以通过一些方式转换为类似的 C/C++ 实现,如格式转换使用 MNN CV 替换 OpenCV 的实现,同时也要针对端侧的运行环境做一些性能优化。后面蓝色的部分都需要工程同学深度参与,封装 Android/iOS 上的 SDK,然后搭建本地的 Demo 应用验证,再集成到应用中。

其主要缺点在于:

  1. 视觉算法需要针对端侧部分重新实现和优化,成本较高

  2. 算法严重依赖工程协作,工程维护SDK的成本也比较大(以算法为核心的SDK)

  3. 算法的测试验证需要让工程开发App Demo,且算法一般不能直接在手淘等应用环境中测试算法代码

  4. 发布后一旦出现缺陷,无论是算法还是工程问题,迭代周期依赖应用的版本计划,一般超过1周

MNNKit 就是视觉算法最典型的 SDK 集成方式。

a6d87802b81dc8f12d619f51b6cc438b.png

以往视觉算法的部署只能通过算法 C/C++ 的形式集成到应用,不过目前端侧运行时已经建设完善了CV 运行时能力(OpenCV/Numpy/MNN/MNNRuntime),这样视觉算法就可以像一个普通 Walle 任务一样,通过工作台或发布平台动态地部署到端上,典型的业务如猫客中的白屏检测,淘宝直播中的智能看点等,都是通过这种方式部署的。

通过运行时部署 CV 算法的主要优势在于:

  1. 算法可以自己搭建视觉验证 Playground Demo(见下文三端一体)

  2. 和普通端计算任务一样,CV 算法使用 Python 开发,动态发布,迭代周期短

  3. 可以使用工作台本地部署,在应用中调试算法,预发/线上环境都可以

  • CV 研发流程

6d7acbca96197f9c7b509250d01d3a41.png

上图为使用工作台进行 CV 算法研发的完整过程,算法初步产出后,会经历三个研发测试阶段:

  1. 单元测试:算法在独立 Demo 中验证视觉效果的正确性;

  2. 预集成测试:算法在目标应用中和关联业务一起进行本地测试,因为算法还未使用平台部署方式,所以称为预集成测试;

  1. 集成测试:算法通过平台部署,预发回归测试,然后线上灰度/正式发布;

算法在上线前在平台进行集成测试,而单元测试和预集成测试都可以在工作台环境中进行。

  • 三端一体

与端计算数据算法有所不同的是,新开发的 CV 模型,一般都会先在本地进行效果验证,它是独立于集成的应用的,就相当于在 Demo 中的单元测试。比如你开发了一个图像算法,如目标检测,你想在端上看一下检测的结果对不对,定位的坐标准不准,那你就需要一个 Android/iOS 的应用,把模型和代码集成进去,然后再去开发上层代码(典型的如 MNNKit Demo)。作为算法并不了解 Android/iOS 开发,往往需要工程同学协助,协同成本较高。

有没有一种方式能让算法脱离工程,自己去写一个Android/iOS 上的 Playground 验证应用呢?

跨平台效果调试库 DebugUI

MNN工作台针对算法在模型效果验证中的痛点,提供了“三端一体”的解决方案。简单来说,我们提供了一套跨平台效果调试的 Python 扩展库 - DebugUI,算法可以使用 DebugUI 的 Python API,快速搭建一个视觉验证应用,并且能在一端编写,三端运行。

a779deac36da9a553d13a3d3f50fbf04.png

DebugUI 扩展库抽象和提取了视觉效果验证的核心链路,为算法提供了了精简又实用的 Python 接口,覆盖了目前视觉算法实际的验证场景:

  1. 输入模式:一般数据来源只有图片和视频

  2. 交互组件:用于简单的控制,比如可以通过滑块调整阈值,通过选择器切换使用的模型,通过开关打开/关闭某个功能,等等

  3. 渲染组件:用于展示结果,比如分类得分值可以用文本渲染,人脸点位可以使用关键点渲染,人像分割可以用图像渲染,等等

  4. 数据回调:摄像头、相册选择,交互组件的事件,均会产生数据回调交给算法处理

  5. 环境变量:算法可以获取工程设置的变量,比如某个本地文件路径,等等

ecbb26fed58488427c054e078e828901.gif

工作台模型市场内置了常用的一些开箱即用算法,如漫画脸、人脸检测、OCR、人像分割、卡通风格等等,它们都是算法使用 DebugUI 搭建的 Playground 示例应用。上图中展示的就是人脸检测算法的Playground示例,在 Mac、Android、iOS 上运行都能得到相同的检测结果,这就是“一端编写,三端运行”。

Playground 代码调试

使用 DebugUI 搭建的 Playground 同样支持 Python 代码的断点调试,这对于算法在模型单元测试阶段的开发是很有帮助。

6c8225f5342343a8e7ef3967ce69a34a.gif

  • CV 算法调试

使用三端一体快速搭建视觉 Playground 应用验证算法效果后,接下来就是将算法模块通过工作台本地部署到集成应用(如手淘)中,应用环境会包含业务模块的主动调用触发算法,这样就可以在集成应用中进行算法调试了,这个就是预集成测试的阶段。

算法通过工作台本地调试通过后,在平台进行预发/beta的发布测试,这个就是走平台部署的方式了,只不过是在应用的预发环境部署,这就是集成测试阶段。集成测试通过之后,算法正式发布上线。

9b0edae820098aec92f392b97a34945b.gif

如图示例淘宝直播在预集成测试阶段,使用工作台进行 CV 算法的本地部署,工程主动调用算法的初始化、摄像头每隔几秒执行推理,都会触发进入到对应方法的调试断点,这样就可以方便的在应用中调试 CV 算法了。

  • 性能测评

算法经常需要评测代码的运行性能以针对性的进行优化,尤其是对于 CV 实时算法。MNN工作台提供了端上 Python 代码运行实时的性能显示,通过“profile”方式运行 Python 工程,可以看到代码的执行路径,以及路径中每一行代码的执行时间和次数。这对于在实际应用环境中评测算法的运行性能,分析性能优化的瓶颈很有帮助。

47d77917394fcd31ac5b7c9ce43ed63f.gif

如图示例了淘宝直播中使用 profile 来评测 CV 算法的性能,运行时间和次数会实时地显示在对应的代码行。profile 适用于所有能通过工作台部署的 Python 工程,Walle、Jarvis、CV、Playground 等工程都可以进行性能评测。后续我们会在性能评测中加入更多的端侧实时信息,如内存、CPU 占用等,帮助算法更好的分析代码性能。

结语

端智能的研发过程中,算法的开发只是一小部分,大部分工作其实都在算法之外,MNN 工作台不仅降低了普通开发者的 AI 研发的门槛,同时也是算法研发的提效工具,它有效解决了端 Python 的开发部署困难,让算法可以脱离工程自己搭建 Demo 应用,也支持了阿里集团内主要的端智能的研发场景,这样算法同学可以更加专注于算法本身的开发,从而提高 AI 的研发生产效率。

✿  拓展阅读

10a7dcc3b56f98ce9f19469cc311d133.png

作者|鹿尤

编辑|橙子君

出品|阿里巴巴新零售淘系技术

b3cf65328ffe8af6bc1c74d12f2431d1.png

d924c7d563985d5d4b273c11f4df2337.png

这篇关于端智能研发核心套件,MNN 工作台深度解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817639

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象