本文作者:雨行、列宁、阿洛、腾冥、枭骑、无蹄、逍城、少奇、持信、云芑
本文是上一篇内容《广告深度学习计算:阿里妈妈智能创意服务优化》工作的进一步延伸,欢迎阅读交流。
概述
随着视频、文案、图文等多媒体模型在阿里妈妈智能创意、内容风控等业务场景的广泛落地,在提升业务效果的同时,也为在线部署带来了诸多新的挑战。本文聚焦于多媒体AI服务场景下,提升GPU利用率以及避免GPU资源浪费这一核心问题,分析了用Python上线多媒体AI推理服务GPU利用率低的原因,以及在线流量波动造成的资源分配困难,并给出了我们的解决方案 high_service。
一、多媒体AI服务特点及挑战
1. 多媒体业务场景简介
多媒体AI服务涉及到了智能视频制作、图文创意、智能文案、违规内容检测等众多场景,如:
微视频,通过多模态检索技术从长视频中裁剪出3-10秒最吸引用户眼球的主要内容,或者使用剧本自动生成视频,投放到搜索、推荐等场景,留住用户并促成点击。
智能抠图,从商品主图中选取出主体商品或者模特,作为其他智能创意服务的素材。

智能文案,根据不同载体(图片、视频、信息流卡片等)以及不同媒体的风格,为商品生成最恰当的文案。下表展示了我们为淘宝和头条自动生成的不同风格的文案。
违规内容检测,对违规词以及违规图片进行筛查过滤,规避风险。
2. 多媒体AI服务部署挑战
2.1 “成也Python,败也Python”
对于Python的态度,可以说是“又爱又恨”。在模型训练方面,Python因其动态语言特性,以及丰富的数据处理库(如Numpy/Pandas等),成为算法同学的首选。尤其是随着越来越多的顶会文章采用PyTorch,使得Python+PyTorch组合几乎成为多媒体模型训练的标配。
但是作为线上推理服务,Python由于全局解释器锁(下文简称GIL锁),导致单进程服务模式无法充分利用多核CPU的处理能力,GPU Kernel Launch线程频繁被其它线程中断,使得Cuda Cores得不到足够的任务而空闲,GPU利用率相应的也就很低。
既然单进程的方式不行,那么Python多进程可以吗?答案是部分可以,因为多进程部署需要为每个进程加载一份GPU模型,而这无疑会受到GPU显存的约束。我们知道,随着多媒体模型在图片分类、目标检测、图像分割等领域的表现越来越亮眼,其代价便是模型的复杂度与模型参数的几何级增加。除了模型参数占显存外,中间运算结果以及Cuda Context内容(约占用几百MB显存)均需要占用显存资源。此外,一个服务会往需要多个模型共同协作,这使得每个进程加载一份模型的方式不可行。下表显示了我们部分多媒体服务,在单进程模式下对于显存的需求。
但是多媒体场景下,Python转C++困难很大。原因有几项:
视频处理逻辑处理复杂。视频数据需要经过抽帧采样、尺寸变化、通道转换、归一化等复杂的预处理,模型输出的图片还要合成视频、FFmpeg转码等后处理。
C++图片处理库不如Python完善,很多Numpy和Python的函数需要手写C++实现,效率低下,开发周期长。
C++与Python结果一致性很难保证,调试困难。
正是因为上述Python转C++的困难,使得“Python训练+Python线上推理”的模式,成为特别迫切的需求。这种模式不仅方便算法同学自助上线,更加快了算法迭代更新的速度,保证了最新的研究成果能够及时落地。
2.2 流量不均匀
除了Python带来的问题外,流量不均匀也为多媒体AI落地带来了诸多挑战,包括但不限于
流量潮汐现象严重,波动很大,无法按峰值流量准备机器
在线服务与离线训练任务的一个很大不同,就是流量波动非常大。离线训练由于是算法同学主动发起的,因此通过合理的任务调度,可以保证GPU时刻都有任务运行。但是对于在线服务来说,其流量来源于用户的操作。因此流量波动很大,主要体现在