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

语言: CN / TW / HK

作者:鹿尤

背景

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

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

  • 日志调试:完全脱离运行时代码,通过在代码中插入日志,验证程序的运行逻辑和结果。
  • PC 模型端侧环境:为了能够进行代码的断点调试,在 PC 侧搭建和安装端侧 Python 代码依赖的所有库,让 Python 程序能独立地运行和在和调试在 PC 端通用 IDE(如 PyCharm )上,数据输入则使用 Mock 的方式。

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

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

MNN 工作台

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

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

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

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

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

  1. 建立连接:应用通过扫描工作台上的二维码,建立局域网内手机和PC的连接
  2. 代码推送:工作台上的工程通过局域网推送到端侧应用中
  3. 运行:端侧应用触发执行端侧 Python 代码,如果设置了断点,就可以进行端侧代码的调试了

端计算研发

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

研发流程

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

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

  1. 新建端计算工程,或打开从平台 clone 的端计算工程
  2. 应用扫码连接工作台,此时工作台中会实时输出算法的日志
  3. 在工作台 IDE 环境中开发代码,修改配置,添加资源
  4. 运行任务,此时任务会通过本地推送部署到端上。线上/预发环境都可以,任何代码都不会影响到线上,无需担心稳定性问题
  5. 代码断点调试、查看堆栈、变量等
  6. 工作台本地测试通过后,提交代码,再进行后续的平台发布操作

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

  • 本地部署,开发阶段可以完全脱离平台
  • 支持端计算工程的实时 Python 调试
  • 端上部署不受预发/线上环境,或窗口期的限制
  • 实时查看端侧算法的运行性能

持久化调试

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

实时日志

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

  • Current Task:本工程日志,包含本工程普通 print 日志和工程的运行日志
  • Python:应用中所有的 Python 日志
  • C:通过端计算提供的 C 接口打印的日志
  • OC/Java:通过端计算中 Java/OC 接口打印的日志

端文件浏览器

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

依赖二方库联调

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

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

视觉内容理解研发

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

CV 部署方式

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

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

其主要缺点在于:

  1. 视觉算法需要针对端侧部分重新实现和优化,成本较高
  2. 算法严重依赖工程协作,工程维护SDK的成本也比较大(以算法为核心的SDK)
  3. 算法的测试验证需要让工程开发App Demo,且算法一般不能直接在手淘等应用环境中测试算法代码
  4. 发布后一旦出现缺陷,无论是算法还是工程问题,迭代周期依赖应用的版本计划,一般超过1周

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

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

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

  • 算法可以自己搭建视觉验证 Playground Demo(见下文三端一体)
  • 和普通端计算任务一样,CV 算法使用 Python 开发,动态发布,迭代周期短
  • 可以使用工作台本地部署,在应用中调试算法,预发/线上环境都可以

CV 研发流程

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

  1. 单元测试:算法在独立 Demo 中验证视觉效果的正确性;
  2. 预集成测试:算法在目标应用中和关联业务一起进行本地测试,因为算法还未使用平台部署方式,所以称为预集成测试;
  3. 集成测试:算法通过平台部署,预发回归测试,然后线上灰度/正式发布;

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

三端一体

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

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

  • 跨平台效果调试库 DebugUI

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

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

  • 输入模式:一般数据来源只有图片和视频
  • 交互组件:用于简单的控制,比如可以通过滑块调整阈值,通过选择器切换使用的模型,通过开关打开/关闭某个功能,等等
  • 渲染组件:用于展示结果,比如分类得分值可以用文本渲染,人脸点位可以使用关键点渲染,人像分割可以用图像渲染,等等
  • 数据回调:摄像头、相册选择,交互组件的事件,均会产生数据回调交给算法处理
  • 环境变量:算法可以获取工程设置的变量,比如某个本地文件路径,等等

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

  • Playground 代码调试

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

CV 算法调试

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

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

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

性能评测

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

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

结语

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

我们招聘啦!

欢迎加入阿里巴巴淘系技术部-端智能团队,负责构建行业领先的开源推理引擎 MNN 以及一站式机器学习软件-MNN 工作台,在阿里我们负责核心电商的 AR 平台及新形式的商品导航,同时还有应用规模巨大的端云协同的搜索推荐、用户触达、直播内容理解等创新应用及系统。

招聘岗位:

算法类:CV/CG/推荐/搜索/机器学习/模型压缩 工程类:iOS/Android/Java服务端/C++/端上高性能计算 简历投至方式

简历投递:[email protected]

关注我们,每周 3 篇移动技术实践&干货给你思考!