7 月 5 日,快手 Y-tech 部门 AI 工程团队的崇洋铭在 GMTC 全球大前端技术大会(北京站)2021,做了题为《端侧 AI SDK 框架,爆款特效批量生产背后的秘密》的演讲。他从一系列酷炫的快手特效分享展开,结合具体落地案例,和大家分享了快手的计算机视觉技术在短视频特效和智能创作的 AI 工程化落地过程中,遇到的挑战、思考和实践。本文根据此次演讲整理。
作为国民短视频社区,快手平台平均日活跃用户 3.79 亿,全球月活跃用户达到 10 亿。在蓬勃发展的用户社区中,快手 Y-tech 部门研发的计算机视觉、计算机图形学、AR/VR 等 AI 能力,落地快手旗下各 App,为内容生产的各个环节提供智能创作的能力。
围绕这些 AI 能力的落地,我们分为四个部分展开:第一部分先介绍一下背景,包括效果展示、整体 AI 架构和存在的挑战。第二部分是快手的端上 AI SDK 的架构设计,设计思路包括统一接口、建设完善的公共库、功能模块化和插件化、以及统一运算流程。第三部分针对性能这个最大的挑战,来探讨一下我们的解决思路。整体上,通过图形图像库和模型分机型下发平台这两套方案,来分别解决前后处理和模型推理这两部分的性能瓶颈。细节上,我们结合三个具体案例,来分享一下通过多种时序模式、多线程框架和缓存设计来在不同的业务场景上提高性能。最后,我们谈谈对未来的展望。
背 景
这里展示了“童话公主”、“隐身衣”、“梵高星空”和“万物 AR”这四款魔法表情特效,精致效果的背后,每一款都用到了前沿且多能力复合的 AI 技术,包括生成式技术(GAN)、增强现实(AR)、人脸关键点、人像分割、天空分割等等。
其中,2020 年 11 月上线的 GAN 类玩法“童话魔法”,达到了数百万作品量和数十亿播放量。
除了特效拍摄,Y-tech 的 AI 能力还落地了多样的业务场景。编辑场景的“智能抠像”可以从视频片段中抠出人像、头部或天空;相机拍摄的“智能识物”可以扫一扫识别出场景中各个物体;相册场景的“一键出片”的可以从用户的相册中分析场景和物体,自动生成影集。
这些能力的背后,是快手的一套从模型训练到端上推理的完整 AI 架构。
上图中,右侧的一列展示了开发环境的主要模块,包括数据管理、训练平台、引擎工具等一系列平台和框架。
左侧展现了端上运行时的架构,也是本次分享的重点。AI 接口层、AI 算法层和 AI 底层库这三个部分组成了 Y-tech 的 AI SDK——YKit。YKit 通过对接各个中台 SDK,来落地快手旗下的各业务方 App,此外业务方也可以直调 YKit,提供更灵活的对接方式。
YKit 底层调用的 KwaiNN 推理引擎(前身为 YCNN),是快手自研的深度学习推理引擎,针对不同的硬件平台做了适配和指令级优化,相比常见的开源推理引擎,有着优秀的性能表现。
在操作系统层面,YKit 以同一套 C++ 原生代码支持 iOS、安卓、macOS、Windows 和 Linux 各端。在硬件层面,YKit 和 KwaiNN 针对不同的芯片进行了适配和优化,并自动搭配下发不同的模型,以提供最佳的效果与性能的平衡。
YKit 内部的算法分为若干个大类,各大类下面再细分具体的算法功能点,提供共计近百种 AI 能力。例如分割抠图类包含人像分割、头部分割、衣服分割、指甲分割等等;人脸人体类包含人脸关键点、人体关键点、人脸属性、表情识别等等;生成式类则实现了 SDK 代码和模型结构的高度复用,搭配不同的训练数据和前后处理参数,提供各种丰富的效果,包括年龄渐变、表情套系(大笑、嘟嘴、皱眉等)、童话魔法、国风等等。
在 YKit 每日几千亿次的调用量、几亿次的模型创建量、近百种 AI 能力的背后,也同时对工程团队提出了巨大挑战。
第一个挑战来自效果。 首先是 AI 能力数量,如何对各种各样的 AI 能力和需求,做到高度复用公共基础层,接入统一的框架,决定了新功能是能够快速开发落地、还是会越来越臃肿导致拉低效率。效果观感,则与 SDK 的图像前后处理能力和数据接口相关。参数可配置能力决定了算法开发和线上迭代的效率,以及是否能满足不同的业务方需求,影响了新玩法和落地方式的丰富度。特效包装,则受到与下游特效团队 SDK 的接口对接的灵活性和易用性的影响。
第二部分的挑战在性能。 大家知道,快手的老铁人群多样化,机型分布也很广泛,如何保证在占比极高的中低端机上提供流畅的效果,直接影响到老铁们的用户体验。内存开销和崩溃率,在某些应用场景中尤其重要,例如直播过程中人脸关键点检测一旦崩溃导致 App 退出,会造成巨大的负面影响。包体积大小,对尤其是中低端机的安装成功率、进而到整体用户数量都有直接的影响。性能挑战这一部分,是日常开发中遇到的最常见的难题。
第三个挑战是成本。 这里涉及了算法从开发到上线的每个环节,包括算法和工程同学的开发投入、QA 同学的测试周期、下游的业务对接效率和上游算法在后期迭代时的效率。
框架设计
介绍完了背景,我们谈谈 YKit 针对以上挑战,在整体框架层面设计时的考虑。
YKit 框架主要分为三部分:核心库、功能模块和工具链。
核心库包含了各算法公用的模块,其中接口层包含两个部分:调用接口保证了所有算法的一套从初始化、到参数设置、运行、获取结果等的统一接口;通用数据接口是一套方便在调用方和内部算法模块快间进行输入输出转换的库,综合了 json 和 pb 等格式的设计优点,并提供灵活的类型转换和更高的性能,同时减少了依赖方需要发版的频率。
图形图像库针对前后处理进行了性能优化,并封装了易于调用的接口。模块工厂提供了功能点的插件化能力。模型管理对不同底层硬件提供分级的模型,达到最佳性能。数据转换提供了图像色彩空间和格式等等的转换。引擎接口方便对底层 KwaiNN 引擎的调用。日志和上报收集调用次数、线上性能、各业务方调用情况等信息,帮助不断改善 YKit。
功能模块在大类层面提供编译开关和配置,各大类里实现具体的二级功能点,等会儿会具体介绍。
工具链包括多端 Demo,新算法开发时,只需要实现 C++ 底层的算法功能,无需添加上层与客户端相关的逻辑代码,即可在各端运行。自动化文档用 Doxygen 从算法代码和 Demo 代码自动生成,配合前面提到的通用数据接口,保证和业务方对接时的高效。本地素材库方便快速调试和验证。另外还有单元测试和打包平台来方便日常开发。
在运算流程上,YKit 综合了各个算法功能的特点、以及上下游拍摄、特效等 SDK 的框架和接口,设计了两条链路的通用运算流程。算法根据自身需求,既可以运行两条链路,也可以只运行其中一条。CPU 链路提供了灵活的前后处理类型,并支持多个功能点串联。GPU 链路针对不同算法需要的后处理,提供高性能的 shader 运算。
我们再看看算法功能点接入的设计。
从提供能力的逻辑来看,YKit 分为以下几层:最底层是 KwaiNN 引擎,它既是 YKit 的基础库,也可以单独提供给业务方进行推理直调,达到最轻量化;上层是 YKit 的框架层,其中的功能模块库,包含了算法功能点的模块基类,算法功能模块工厂使各功能模块在编译时注册能力,运行时动态加载,宏开关可以根据不同平台的定制能力和配置依赖库;再上层是核心模块,如人脸关键点这样高频使用的能力,随 YKit 包一起提供,以达到快速加载,提升用户体验;最上层是动态模块,在安卓上由特效素材或业务逻辑触发动态下发,可使包体积减小 50%。
性能优化和配套工具链
接下来的第三部分,我们谈谈快手在性能方面的探索和实践。
YKit 的流程和算法能力虽然多样,但是总结下来整体运算分为两个主要部分:前后处理和模型推理。针对前后处理部分,我们的解决思路是建立一个高效易用的图形图像库,提升前后处理的效率。对模型推理部分,KwaiNN 引擎已经做了大量的底层优化,YKit 要做的就是为各硬件平台和机型进行最优的模型适配,整个过程做到自动化和智能化,提升落地效率。下面分别看一下这两个部分。
YKit 中建立了一套图形图像库,提供统一的上层接口,这样算法在开发时无需关注不同的硬件平台,图形图像库的运算后端会适配对应的算子,包括 CPU 基础计算、Neon、OpenGL、Metal 等后端。目前有 50 多个优化后的算子,并且在不断扩充中。
YKit 配套的模型分级下发平台,默认提供了 10 档机型分级,包括 iOS 和安卓的高、中、低,华为 HiAI、iPhone CoreML 等等,AI 能力在开启时,会拉取对应的分级模型包,充分利用底层 KwaiNN 针对 CPU、GPU、NPU 各平台的优化。模型分级下发平台还提供了丰富的可配置性,以及部署安全性。
上面是解决性能问题的两个主要部分,下面我们举三个具体案例,来看看不同功能点在实际落地时还有哪些优化思路。
案例一是近年来大火的 GAN 类特效,这里我们把这个大类沉淀成了一套通用方案。在模型上,我们对不同的效果复用 8 档模型结构设计,覆盖从几个 G 到几十 M 的 MAC(乘法加法操作)运算量跨度区间,通过前面提到的模型分级下发平台来适配各档机型。在时序上,我们设计了 3 种不同的运行模式,来达到在高端机上提供最佳效果、低端机上保证流畅度的平衡。随模型平台下发的,还有 20 余个可配置参数,这样新的效果玩法往往只需要通过参数来改变前后处理流程,做到快速上线。
案例二是一个运算流程更复杂的人脸动态效果,它包含了人脸关键点、人脸 3D 重建、人脸渲染、GAN 模型推理、二次关键点计算共 5 个步骤。对于这么重的计算,我们利用了功能模块化设计的优势,结合了拍摄 SDK 的多线程架构和 YKit 内部多线程架构,将运算分散在 3 个 CPU 线程和 1 个 GPU 线程上,大幅提高了性能。
案例三对应的是刚才 PPT 第二页展示的视频智能抠像的能力。在这里,视频编辑场景与实时拍摄场景的用户交互形态不同,对性能的侧重点也有不同的需求,快手的编辑 SDK 使用了 CPU 预分析和 GPU 渲染的两阶段设计,来提升用户播放视频时的流畅度。YKit 为此提供了推理缓存接口,这套通用接口可以用于各个 AI 能力,并且除了可缓存最终结果,也可对功能内的不同细粒度结果进行缓存。此外,针对不同机型等级提供了优化的缓存大小,以节省硬盘空间。在解析缓存时,YKit 会进行数据校验,并支持对缺失缓存的帧进行重新推理。编辑 SDK 与 YKit 合作开发的智能抠像功能,落地后在性能上实测远优于竞品。
最后,我们再回顾一下开头提出的三个主要挑战。大家可以在下图里看到,上面一系列的框架设计、配套工具和优化,是如何一一对应来解决这些问题的。
未来展望
对于未来,我们有很多新的期待。首先我们会继续推进服务端与移动端的统一,这包括输出效果和工程代码两个层面;其次,对于机型分布广泛的老铁们,我们会不断打磨更高的性能,让更多的人能够体验到酷炫的 AI 能力;此外,开发效率始终是我们想要提升的点。最终的目标,还是为用户提供更好的 AI 服务,持续提升每个人独特的幸福感。
作者介绍
崇洋铭,在快手 Y-tech 部门负责 AI SDK 架构,包括业务开发、链路优化和底层开发,实现高效的算法落地和上线,在给生产侧创造更多更有趣的拍摄玩法的同时,赋能更多样的 AI 落地场景。毕业于清华大学和卡耐基梅隆大学,加入快手前曾在 Facebook 和微软 HoloLens 部门任职,参与 MR 和 3D 等创新技术的研发。GMTC 北京 2021 明星讲师。
Y-tech 团队是快手公司在人工智能领域的探索者和先行者。我们致力于通过计算机视觉、计算机图形学、机器学习、AR/VR/HCI 等多领域的交叉,一方面帮助每个人更好的表达自己和创作内容,另一方面为每个人提供更好的内容体验和交互方式。Y-tech 在北京、深圳、杭州、Palo Alto 均有研发团队。如果你对我们做的事情感兴趣,希望一起做酷炫的东西,创造更大的价值,欢迎联系并加入我们!
本文转自 公众号:AI前线 ,作者崇洋铭,点击阅读原文