端智能研发核心套件,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

相关文章

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思