2022年 Qcon 全球软件开发大会于 11 月 25 日~ 26 日在上海举办。
围绕着“融合通信”与“AI”两大主题,网易智企技术委员会以《融合通信技术探索与 AI 技术商业化实战》为主题设置了专场。
本次专场邀请了网易智企算法专家李雨珂、网易云信服务器开发专家曹佳俊、网易云信音视频引擎开发专家朱明亮以及网易云商自然语言处理专家冯旻伟将在现场带来主题分享,与所有开发者共同探讨融合通信的最新落地和 AI 技术商业化的实战经验。
本文为李雨珂博士的现场演讲实录。
演讲内容:
大家好,我是来自网易的算法工程师李雨珂,感谢大家在美好的周五下午参加我们的专场。我来自于网易智企,所做的工作主要和数字内容风控相关,很高兴在今天和大家分享我们在数字内容风控场景下怎么做 AI 相关的生产效率优化的。
我过去很长一段时间都在做业务侧算法落地的工作,也完整经历了以 AI 为主导的数字内容风控的发展和成熟,过程中也积累了比较好的技术经验。过去其他的场合我们也分享过关于效果提升方面的技术方案,这一块更多和效果相关。今天我想切换一个主题,来聊聊我们在这个过程中怎么做成本优化、效率提升方面的工作。
在 AI 应用过程中,成本问题始终是非常容易被刻意绕开的问题,在如今的商业竞争环境中,我个人觉得这是非常值得讨论、思考的话题。
这是我所在的部门网易智企-易盾业务中心,主要做数字内容风控,目前提供文本、图片、视频、音频检测相关的 AI 检测技术能力,识别互联网信息中的不良有害内容。在这个基础上,我们也会提供像业务风控、移动安全等等组合安全能力,帮助我们全方面识别互联网内容中的一些信息安全性,从而保障互联网整个生态的健康合规。目前我们在为网易内部多个团队提供相关服务,也为大量的外部企业提供 AI 相关的检测能力。
今天我的分享主要围绕数字内容风控的实践经验展开,有三个部分:
介绍一下这一块的业务情况。
分享一下我们在生产成本优化方面所做的工作,这里着重围绕数据、算法、服务相关的内容进行细致展开。
介绍一下我们正在进行的,以及未来期望想做的一些比较有意思的工作。
1.AI 业务应用
数字内容风控如果加入了 AI 能力,就是通过 AI 技术识别内容里面敏感的信息,因为互联网的数据类型非常全面多样,因此我们需要有全方位的能力进行覆盖。做了很长一段时间的实践以后,我们自己会觉得其实在这个场景里面,AI 是一个非常好的应用,这里有几方面的原因。
第一,对于 AI 能力覆盖的全面性有很高的要求,比如图像领域,我们在二维图像世界里面几乎所有的图像识别能力都需要在这里得到应用,比如人脸、OCR、图像分类等等。
其次,这个场景里对于 AI 效果的要求非常严苛,假如一个图片里面出现了很小尺度的敏感内容,在客户要求中也是希望识别出来的。在此基础上,这是一个很明显的开放检测的场景,因为我们无法预测用户在上传过程中会传输怎样类型的数据。
最后,由于是安全问题,因此这个过程中肯定会有黑灰产的介入,在对抗过程中我们需要研究相关的技术加强整个技术的对抗能力。
现在基于 AI 的数字内容风控能力,已经相对成熟了,但是它的发展并不是一帆风顺的,大概四五年前左右,在我个人看来它的初始效果还是相对一般,很难在线上真正应用起来。但是我们这个基础上不断努力,不断调优算法,最终可以在线上得到很可靠的应用。再后来我们会思考,有了这个基础以后,能不能解决一些更加复杂困难的问题,取得进一步的效果增益,我们也是取得了一些解决方案以及算法模型相关的技术沉淀。目前我们有时候自己也会感觉到很惊奇,算法模型对于非常困难的案例是有比较稳定的能力做识别的,这是出乎我们意料的。
这个过程当中我们积累了哪些东西?首先比较重要的是生产资料,从数据的角度来看我们有了很好的数据收集渠道,以及自建了符合我们自己业务需要的标注平台,也有稳定的内部和外部的标注团队。
从算力的角度来讲,经过这些年的发展,我们也有了很好的硬件方面的积累,也尝试过云计算平台,以及和国产化芯片做了很多合作。面对不同的部署场景,我们也有很好的各类部署方案去为客户解决相关的部署问题。
在算法部分,首先比较重要的是我们有了一支能够为商业化服务的团队,并不仅仅是搞研究,而是在服务客户过程中真正解决业务问题。这个过程当中,我们也有很好的算法定制方案的积累,同时我们的算法库也有各种各样的新武器。
在这些资源的积累上,目前我们能够从需求的角度出发去完整制作算法服务出来,面对不同的数据类型也有很好的处理能力,面对不同的场景我们也有很好的算法模块和解决方案做组装,到真正的部署场景里,我们对于云场景、手机端场景、私有化的场景,都有很好的部署、加速的方案。
在这个基础上我们继续和客户进行磨合,希望在技术的角度能够取得进一步的提升,这里我们重点会围绕高效识别、敏捷响应、快速识别、低资源消耗角度进行展开,前期工作更多围绕效果进行的,所以更多是在高效识别和敏捷响应方面。这一块让我们的算法模型在发展过程中越来越精密,整个链路也是越来越复杂,从而使得效果也是越来越好,达到了让我们惊奇的效果。
随着业务量的增加、算法模块的增加,很明显的问题就是 AI 的部署成本快速上升。(如图)在前期工作过程中会发现,随着业务量的发展,我们人力的投入成本,其他资源的投入成本,以及硬件的投入成本都是随之线性上升的,这对于商业化来说是非常不利的事情。
有些同行问过我,为什么标准化的 AI 能力做完以后成本还是那么高?不是说复用性很强吗?
这和数字内容风控自身的场景特点有比较大的关联性,在这个场景里面对于数字媒体类型全类型的识别要求非常高,需要我们不断积累能力,很难通过短时间的积累达到所有的媒体类型都有很好的识别结果。另一方面,随着新增类型的敏感内容不断出现,我们需要识别的范围也是逐步扩大,因此我们需要不断适应扩大的识别范围。不同的行业底下,监管重点和方向有一定的差异性,因此通用能力不能一下满足行业需求,定制化的需求也是在这个场景里面经常出现的。
随着数字内容风控成为了非常标准的安全能力,理论来讲对于所有对外发布的这些信息应该都经过这个能力去做处理的,所以请求量本身就是非常巨大的。
在这个过程当中,我们逐步意识到在 AI 的制作过程中,数据成本、训练成本、部署成本都是非常高的,从业务侧反馈给我们的信息,其实就是带给我们非常大的成本压力,最近一段时间,尤其是最近一年,我们团队工作重心更多转移到 AI 生产效率的优化方面,这部分也会作为我们现在以及未来很重要的发展方向,基于这些工作目前我们也是积累了一些比较好的经验。
这些经验从几个大块概括:数据获取、算法方案、服务部署,这三大块也是 AI 能力制作过程中的三个重要部分。接下来,我将对这三个部分进行更加细致的展开,介绍我们在每个部分怎么工作的。
2.AI 生产增效
首先来到数据获取部分。
在数字内容风控里面,敏感数据的获取比较困难,因为实际大部分都是正常数据,敏感数据还是占非常小的部分,尤其对于极端类型是很难获取到充足的数据。但是对于深度网络来讲又非常吃数据,这就形成了一定矛盾。早期工作过程中我们用到了主动学习的方式,帮助我们精简筛选出真正需要标注的数据,模型会对无标签数据做打标,根据策略做筛选,一般有可能是敏感样本的数据,以及模型判断还不那么确定的样本会送去做标注。
这在前期为我们的成本下降带来非常大的好处,但是整个过程还是以人工标注为基础,从数据利用的空间来看还是有提升的可能性。因此我们对于数据流程进行了升级,主要包括两个部分,一方面是在数据源头收集部分,目前会采用几种方式,首先通过多模态的方式进行数据收集,例如可以在视频当中通过 OCR 和 ASR 的结果相互验证,然后得到一定的标签。另一方面我们也会通过现在比较流行的跨模态模型选择数据,现在输入一段文本就可以检索到一张语义上对应的图片,这种方式也是比较有效率的。
第二部分会通过特征检索的方式进行。
假如说我们已经有了一些种子数据,可以把特征提取出来,在搜索域中进行比对,找到一些可能是这个类型的数据。当然这个过程当中还是可以用跨模态模型的预训练特征进行比对。假如说我们有十来张的图片,很难找到其他扩充的类型,我们会把这些图片进行特征提取,找到一个中心,通过这个中心再向外找其他可能的数据类型。如果我们连数据中心都没有应该怎么办?这里可以采用聚类的方法找到一些密集度比较高的数据,这种方法对于人脸、人声的项目有比较好的效果。
有了这些数据,就可以开展下一部分的工作,虽然有些数据其实有了确定性还算比较高的标签,但是大部分数据标签信息都是比较不确定的,或者说可以当做无标签的数据来看。为了应用这些数据,我们采用了半监督学习的方式进行训练,早期我们一般会使用像两阶段的半监督方式做训练,也得到了效果提升。到近期,更多使用在线的半监督方法,将模型打标的过程和训练的过程进行统一,方便进行反复迭代。
半监督方法确实帮我们提高了模型效果,也提高了数据利用率,这是非常重要的。但这个过程中我们发现一个问题:半监督是一个自我学习的过程,肯定有一定的局限性。如果自己的悟性比较高,一些困难的问题能够找到对应的答案,但是更多的情况下,对于困难的问题我们是无法找到标准答案,这给我们的半监督方法加上了一层枷锁,或者说天花板会比较低,让模型在自己的数据域里面受到了局限。
一个经典的在线半监督方法在使用的时候,我们会拿出数据对它进行强弱两种变换,然后输入模型得到两个结果,最后我们会对这两个结果做一些一致性上的约束,从而达到自我学习的目的。这个过程中我们想设计一种基于两种不同类型模型相互学习的半监督学习方法,具体操作过程我们是引入了不同系列的两种网络,让这两个网络互为老师和学生,相互学习。两种不同类型的网络可以适应数据的分布或者说数据的域是有不同的,经过一些实验我们也发现确实存在这样的现象,就是不同类型的网络学到的最终结果或者说判断方向会有一些差异性,这就帮助我们利用这两个类型网络的差异性,加强半监督学习的效果。
有了模型打标和半监督训练这样的过程以后,我们是不是真的不需要人工标注了?也并不是这样的,在现在互联网时代学习一门新技能的时候,可以打开视频网站找一些基础视频自我学习,但是这始终缺乏一个和老师相互交流的过程,对于一些困难的问题没有人指导的情况下其实会有一定的问题存在。假如说有一个老师真正进行教学的话,可能帮我们纠正在看视频过程中理解的误区。
在最开始的时候我们提到了标注其实比较耗成本,怎么平衡成本和效率?我们从三个角度出发,去选择哪些数据是真正需要进行人工标注的。
从模型的角度出发,看看这个模型对于这个图片输出的确定性怎么样,如果确定性不是很高的话就会拿去做标注,这是比较早期的方式。
以特征的维度为基础,如果某一批数据在特征相似度非常高的情况下,一起送去标注的价值就没有那么大。
从域的角度出发,要尽可能找一些领域不同的数据送去做标注。这里举一个例子,我们线上的一些模型经过训练以后,由于实拍类型的数据比较多,对于实拍类型的学习效果比较好。但是如果切换到电影场景甚至动漫的场景里面,效果就会很快下来。因此领域数据在这部分非常重要,这里我们可以通过领域建模的方法从一些正交的维度进行识别,挑出一些领域不同的数据做标注。
以上的介绍还是比较碎片化的,接下来我想把信息做整合,形成我们现在在用的比较完整的数据流程。首先我们会利用无标签数据做自监督模型,因为自监督是很大的话题,我这边跳过了,可以认为我们用内容风控领域的无标注数据得到了更好的预训练模型。有了这个预训练模型可以找到一些任务冷启动得到的种子数据,去训练比较一般的有监督模型,会对内容风控领域数据进行进一步的操作。按照上一页讲的人工数据挑选的规则,利用这些规则部分数据会送过去做人工打标,也就是比较高难度的数据。对于模型判断置信度比较高的数据,这一类数据不需要做人工纠正,直接当做人工标注的数据使用就可以了。剩下的就是带噪的数据,可以通过半监督的方式利用起来。整个过程中,我们对于领域内的数据进行了分门别类,采用不同方法,进一步提高了整体数据的利用率。
最后对于数据流程方面做一个总结,前期会通过主动学习的方式寻找一些更好的标注方法,也会思考怎样更有效地收集我们想要的数据,基于这些数据做更好训练方法的设计。最后结合以上讲的内容,怎么样搭建一个更加完整的数据流程,从而对数据的利用率达到最大化。
最后一部分,展开讲一下数据生成部分。
因为最近图文生成的方向非常火爆,输入一段文字就可以生成一张世界上并不存在的图片,这件事情对于数字内容风控来讲是一个很大的挑战,有的情况因为训练数据的原因,模型生成过程中就会生成一些不太适合在公开场合展示的图片。这些图片又有非常明确的领域特点,目前看下来比较偏超现实主义一些,这些素材通过我们现有的模型做识别肯定还是会有一些局限性,因此我们在数据生成方向也会做一些思考,目前也会和其他团队尤其是图文生成方向的技术团队做联动。
接下来我们来到算法部分,刚才已经提到了数字内容风控场景下,正常数据占大部分,敏感数据只有小部分,这个在服务推理的过程中也是这样的情况。因此针对这种现象,我们设计了一种前置+后置的方案,帮助我们的服务快速过滤掉正常数据,因为大部分可能是正常的不需要再做精细判断了。
一张图片进来以后,我们会过一个非常轻量的网络,过滤掉正常数据,理想的情况下 70%-80% 的数据已经被过滤掉,剩下的数据才会做更加精细的模块。执行过程中我们会用一个检测网络把区域中有可能出现目标物体的部分抽取出来,送到下游多个网络中做更加精细的识别。过程当中对于样本是有区分对待的,对于难的样本会做更加复杂的处理,对于简单的样本快速做过滤。这在前期阶段也取得了很好的效果,但是我们也会发现整个过程相对来说还是比较粗粒度的,并非是端到端的过程,我们相信对于单个模型的利用率还是有提升的空间,因此我们在这个基础上进一步做了工作。
在这部分我们参考了清华大学黄高老师关于动态网络的工作,希望在业务中真正利用细粒度的动态推理。这页下面部分还是早期粗粒度的前置+后置的方案,上面是对下面这个图的某个模块进行了细致的展开。这里大的原则,我们希望简单的案例简单处理,复杂的案例复杂处理。
首先从网络深度来讲,简单案例我们希望它在浅层的时候就已经得到了比较确定的判断,提早输出。对于复杂的案例,我们希望进入更深层次的网络做更精细的判断然后再输出。另外一个维度是从分辨率的维度,对于主体很明确的图片,我用小尺寸过模型就足够了。对于一些比较小的物体,我们希望能够拿一张大分辨率的图片来过网络,从而得到更加确定的信息。
再往下走一步,我们希望得到更加统一、更加一体化的解决方案,(如图)基于弱监督的动态推理。我们把刚才介绍的检测部分也引入到网络里面,另外也能够比较方便地做二次识别的判断。一张图片进入主干网络里面,得到特征以后会过两个分支,第一个分支是传统的分类网络得到整图的分类结果,另外一个分支会过一个分割的操作,得到一些潜在的区域。假如说整图上的判定有嫌疑的话,我们会把下一个分支中得到的分割结果,分割出一个 Patch出来,这个 Patch还是可以再去过上面的分类网络得到 Patch 的分类结果。这个相当于是进行了二次识别,一开始粗粗地看一眼,然后再用放大镜看一遍。
在训练过程中对于分类这个分支其实是比较普通的,按照正常分类操作来做就可以了,对于下游的分割分支,我们采用的是弱监督语义分割的方式,对样本做一个弱监督的分割,得到了不一定那么准确的结果,然后送到网络里面作为监督信息做训练,这样的话帮助我们节省掉做分割的时候所需要的标注成本。所以过程当中,我们是没有利用到分割的人工标注。
有了这一系列的方案以后,我们思考我们的训练方法也是需要做对应的设计,接下来我们先对比较早期的前置+后置的方案进行讨论。对于这个方案,我们希望检测模型训练完以后,接下来分类网络训练数据尽可能是检测网络输出的 Patch,当然也会有冷启动的过程,但是过程结束以后,所有的分类网络得到的输入数据来源都是经过检测网络的,这样就可以保证这两个数据源是一致的。
如果采用传统独立的训练方式,可能就会造成领域上的不适配。有一个例子,这个图片是我们的检测模型检测到的 Patch,但是会被分类模型误判。假如说我们采用独立的训练方式,这张误判数据很难进入到训练流程里面,通过联合训练保证有比较好的连续性。
对于细粒度的动态推理网络,我们也希望采取一定的动态训练方法的设计。对于多任务训练的网络来讲,传统方式是如果这个样本来了以后,在做梯度回传的时候会对整个网络产生影响。但是我们这里做了改动,希望一些简单的样本过完网络之后,只对浅层的网络进行修改参数的操作,对于复杂的样例才会对更深层次的网络进行参数的修改。这里可类比,人在学习事物的过程当中,对于简单的问题是不需要投入太多的精力做学习,而对于复杂的问题才会全身心投入做学习。基于这样的方法,能够帮助我们整个训练过程更加动态有效。
上面从数据的角度、从算法设计的角度介绍了一下怎么做成本优化以及效率提升的工作。在这里的最后一部分,我想介绍一下我们在服务部署方面的工作。
从早期开始,早期我们做了很多模型层面的加速工作,主要会选取结构更小的网络来做业务模型,这里也会采取蒸馏的方法弥补效果上的不足。这些方式初始的时候有效果,随着后来开源社区里面 AI 推理引擎的出现,我们也逐步采用了开源方案做加速,包括在服务端可以用 TVM,在移动端可以用 MNN 等等,我们对于这部分的工作也是比较重视,也是取得了比较好的业务收益,它能够在整个计算链路对于策略搜索、资源分配、算子融合做比较好的优化。
但是随着进一步的工作,我们会发现其实有可能整个服务的计算瓶颈不一定只是在深度学习的网络部分,因为服务是比较复杂的过程,有可能网络的部分优化完以后,其他的部分不优化,整个服务的性能还是会受到影响。(如图)展示了一下现有模型部署的方式,目前是按照业务方式去拆解 AI 服务,比如刚才看到的一些案例里边,我们的 OCR 服务、人脸服务都会是单独的服务,我们的服饰服务、武器服务也是单独的 AI 服务。但是哪怕只做一个任务,也是很复杂的链路,首先他会做解码的操作,做一些预处理,后面会有 AI 模型的串并联的操作,最后还有后处理。整个过程其实是复杂且动态的过程。
目前长期来看还是会围绕这样的方式去做服务,因为这对于算法的独立优化、调整、定制化来讲非常有好处。基于这种架构,我们接下来做了一些算法服务上的优化。假如说我们不做任何优化,从数据请求过来了,接收到数据以后,会相对比较自由地做计算和物理硬件上的流转。这好比说交通网络,虽然有一些简单红绿灯的机制以及并线的规则,但是早高峰的时候交通网络还是非常容易瘫痪的,这里主要原因可能是在某些节点产生拥堵,导致整体性能下降。
这里我们针对这样的问题做了一些算法服务上的重新设计,主要围绕两个部分:
动态 Batch 部分,我们对于线上稀疏和稠密的情况做动态的 Batch。
这个 Batch 来了以后,会在不同的节点里面起一个多实例的操作,不同的实例会并行处理任务。
通过这两种方式的设计,整体计算性能会有非常大的提升。最后当然不能缺乏的非常重要的一点,就是我们需要有调度管理和逻辑控制的机制,对于整个推理过程进行管理,最终让整个结果是同步的。
这和开源的方法,比如说 Triton以及 Ray 这样的服务优化框架有一些相似的地方,但我们还是希望能够更好结合自身的业务情况部署的方式去做一套独立的推理框架出来,因此借鉴了很多开源的优秀方案,设计了自己的一套框架。上面简单介绍了一下原理,下图会有更多细节方面的展示,目前这套方案也在我们数字内容风控、AI 应用内部做了很多尝试,对于不同类型的服务都有很好的支持,同时也有评估长期稳定性,未来希望在这基础上进行进一步的发展。
假如说我们的服务有非常复杂的链路,会提取特征还会做检测+分类的操作,我们的框架会把这些请求复制出来,然后发送给同步进行操作的节点做同步处理。比如说哈希特征、CNN 特征、检测,会同步进行处理的。这个过程当中可能会产生中间过程输出,比如说检测模型会生成很多的 Patch出来,这些 Patch 还是会基于多实例的方式分给下游的分类任务进一步进行操作。最后,我们会有调度和同步的机制,帮助我们的结果做对齐。
用了这套框架以后,线上的一些服务已经取得了很明显的服务效率上的提升。首先在服务的吞吐量上就有一个很明显的进步,从而有了一个结果,就是整体的硬件部署数量明显下降。这个基础上还可以结合 GPU 解码的操作,比如对于图像的解码、音频的解码放在 GPU 上进行,让整个推理过程中数据在 GPU 上不下来,这样的情况下进一步提升硬件设备的并发量。目前对于 ResNet 类的网络,在普通的推理卡上我们做到一千以上的 QPS 是比较轻松的,相比以前也是比较大的进步。对于我们在开头讲到的硬件上升的问题,通过这种方式,至少在硬件上的投入成本可以得到明显的控制。
3.进一步工作
以上详细介绍一下我们从数据的角度、算法设计的角度以及服务优化的角度怎么做AI生产效率优化的工作,最后一部分简单介绍一下进一步的工作。
首先连接上面介绍的这套服务加速框架,接下来的工作中我们会重点支持时序的类型,对于输入的 Batch、输入的维度都是动态的,我们希望能够达到最好的性能。另外我们希望有更多的案例得到支持,然后写更好的文档,帮助我们下游的使用用户理解这套框架。最终我们希望这一套框架能够回馈给社区。
第二是关于多模态的解决方案,通过多模态的方式肯定是可以提升识别问题的效果,这是因为引入了更多的信息量,我们也做了相关工作。但是这个过程中可以明显发现这是用成本换效果的,我们接下来的工作目标就是怎样低消耗的使用多模态的能力,在该使用多模态的时候才会真正引入多模态做融合、做识别操作,在不需要的时候尽可能把它控制住。
第三部分是关于知识融合的,目前我们的算法服务还是相对来说比较独立的,但是假如说我们的模型、服务经过一次的计算推理能够得到很多的标签,其实是非常省成本的一件事情。目前我们考虑的一件事情,就是将长久以来优化下来的独立服务赋能给单个网络或单个服务,让它更有能力。当然这是一件非常困难的事情,因为我们的单个网络、单个服务已经经过了长久优化,整体效果上已经达到了非常好的水平,如果做这件事情的话相当于我要把经过多年累积的武林高手的能力一股脑传授给小学生,这里会有技术上的挑战。因此,我们目前也在参考知识融合相关的技术方案。
简单做一下总结,利用 AI 做数字内容风控的过程中,我们的发展会从服务的搭建、效果的优化,逐步转化到生产效率的优化。这个过程当中,我们可以围绕数据收集、算法方案设计、服务流水线搭建去逐步解决。
这里用两个关键词总结:动态、细粒度。因为我们是动态、细粒度的做数据收集和整理,动态、细粒度的做网络推理,动态、细粒度的做整个服务的调度。
我们把现有的经验做了整理,形成了完整的链路,希望在未来我们有了新的业务需求的时候,能够参考这套方法做一些能力快速的生产。
我今天的分享内容大概就是这些,非常感谢大家的聆听!