本文来自 爱奇艺 技术产品中心 资深工程师 王亚楠在LiveVideoStackCon 2018热身分享,并由LiveVideoStack整理而成。在分享中,王亚楠分别介绍了自动码率调节的实现过程、现行算法与评价标准,并重点介绍了基于强化学习的自动码率调节算法的技术架构与实现要点。
文 / 王亚楠
整理 / LiveVideoStack
直播回放:
https://www.baijiayun.com/web/playback/index?classid=18071854329680&session_id=201807190&token=vXamnizuU6dg5tXwrQlPW6an_eFRTsE-RX2EUXwv2bLyp54lF984rOVN2zjNT9VCwX5XhtNXtMuMCTpCPak4Cg
大家好,我是王亚楠,现在就职于爱奇艺终端网络部署,今天很高兴能在这个平台来跟大家讲述一下我们在爱奇艺做的一些很有意思的工作,这个工作主要就是我们基于强化学习做的自动码率调节。
今天的主要内容:
1. 自适应码流
2. 强化学习
3. 基于强化学习的自动码率调节
今天的主要内容分三个方面,第一,介绍一下什么叫自适应码流,在自适应码流中我会着重介绍为什么要用自动码率调节。然后会给大家介绍一个很清晰的评价标准来衡量我们做的自动码率调节。第二,介绍强化学习,可能在座的大部分人对强化学习的了解应该不是很多。第三,基于强化学习的自动码率调节,在这里会简单介绍一下怎么样用强化学习来实现自动码率调节,自动码率调节现在已经有一些算法了,但这些算法都有自己的优势,当然也有自己的短处,那么为什么我们要用强化学习来做?以及我们在用强化学习做自动码率调节的时候,它应该是采用一种怎样的技术架构,以及有哪些要实现的技术要点?
1、关于我们
我们项目组是隶属于爱奇艺网络终端部的,爱奇艺目前是国内最大的长视频网络公司,仅在过去的一年,共增加两千八百多部的电视剧,以及一万多部的电影,移动端的月活动量达到6.1亿,PC端也达到了3.6亿,是除了微信和QQ之外,月活动量最多的一个应用。我们用户的网络环境和设备是千差万别的,网络环境主要分为三种, PC端主要用的是有线连接,手机端大多是的是WiFi,数据网络用的不是太多,除了这三种还有其他网络,比如连上一些其它的手机热点等等。爱奇艺的终端也包括很多种,现在最多的用户是手机用户,除了手机还有一些比较常见的如PAD和PC。另外,在中国的家庭里面,网络电视也是非常重要的一个方面。除此之外,还有一个特殊的应用——奇艺果,这是我们自己推出的一个很适合连接到网络电视上,可以将你手机上内容完全在电视上进行播放的一个工具,效果很好而且也很便宜。我们组一直致力于用技术手段为用户提供更清晰流畅的观看体验,下面为大家介绍的自适应码率调节就是提升观看体验的一种手段。
2、自适应码流
2.1 介绍自适应码流
用户在观看一个视频的时候,需要将视频内容从服务器上取到本地才能观看,在这个过程中因为用户的网络环境和设备千差万别,如何在一个复杂的环境中给用户提供一个清晰流畅的视频,自适应码流就是一个很好的解决办法。因为它可以根据用户的网络情况来为用户提供不同的码率节目,它能够更充分的利用用户的带宽,根据用户的带宽提供不同的码率节目,相比较于之前单一的码率节目,它所提供的节目会更清晰流畅。
自适应码流包括两个方面:
1)传输形式:HLS/DASH/Smooth Streaming
2) 码率调节算法:ABR
HLS是苹果公司推出的一个传输协议,Smooth Streaming是微软推出的一个标准协议,DASH是大家目前用的最多的开源的传输形式。我们可以通过码率调节算法来确定如何通过用户的网络情况来提供不同码率,它整个流程是在节目生产的时候就会被编码为不同的码率,根据用户的不同情况,比如说在PC观看还是在手机观看,以及用户的网络情况不同,会给用户分发不同码率的节目,使得用户在观看的时候能够不卡且清晰度最高。
2.2 实现过程
同一个用户的带宽在不同的时间段是会有一定的波动的,如果我们为用户只提供单一码率的话,那在一部分时间之内会造成用户很大的带宽浪费,这样用户的观看体验并不是很好,在一定观看时间内,当带宽小于码率的时候,会造成用户观看的时候非常卡,而卡顿是对用户的观看体验影响最大的一个方面。
为了使用户观看时候能够流畅,自适应码流能够根据用户的不同的网络环境和不同的设备类型,在特定的时间段内来选择特定的码率,使得用户在观看的时候既能不卡,又能提供在他的网络环境所能容纳的最高的码率节目,这样用户观看下来就会比较清晰、流畅。
当在刚开播的时候用户的网络环境可能不太好,或者是Buffer中没有内容,这时先给他一个比较低的码率,当用户的网速起来之后,或者当它的Buffer慢慢的变多之后,我们会给他提供一个比较高的码率,这样的话,他可以切换到这样一个更高的码率,如果用户的网速变得更好,那么我们也可以给他提供更高清的码率,但是这个在切换的时候,我们会选择一定的时间点,这个时间点也就是我们在自适应码流中所称为的关键帧。那么我们如何根据用户的当前状态来确定下一个要播放码率呢?目前采用的几个通用的方面,主要是带宽,还有目前已经缓存了多少的数据,设备的类型,以及当前设备所能支持的码率。当协议确定之后,就要通过自适应码流的一个非常关键的技术,也就叫自适应码率调节来根据用户的网络环境来进行码率的调节。
2.3 现行自动码率调节算法
1)基于带宽的算法:FESTIVE
基于带宽的算法主要是通过用户前一段时间的网络变化,然后来预估后续可能的网络带宽,然后根据预估的带宽,来决定这个用户所适合的码率。
2)基于Buffer的算法:BOLA
基于Buffer是因为用户的网络环境的变化最终会体现到用户的Buffer中,也就是Buffer中缓存了多少数据,是受带宽的影响的,那么只要基于Buffer,也可以决定我下一个将要选择的码率。
3)综合考虑Buffer和带宽的算法:MPC
基于Buffer和带宽的算法,也就是把这两种因素综合考虑起来。
各自优缺点:
2.4 自动码率调节评价标准
在考虑能不能用一种新的算法之前,我们需要先决定,我们怎么样来评估我们做的这个自动码率调节,要评估它在什么情况下才算是好的,它的效果是可以接受的。现在评估主要是从三个方面:清晰度,流畅度,平滑度。
简单解释一下,清晰度就是用户直观看到的码率的清晰度,比如说是720P,还是1080P;另外,流畅度比较好理解,用户只要不卡,它的观看就是流畅的,如果它卡顿的话,卡的时间越长,那用户可能就更多的会不再看你这个视频了;再一个就是平滑度,如果你在非常频繁的切换的话,用户能够很清晰的感知到你这个切换过程,也是对用户的观看体验也是有个影响的。
我们的目标就是在尽量不产生卡顿的基础上能够最大化的尽量利用用户的带宽,同时尽量减少我们的切换次数。基于这样一个标准,我们形成了一个公式:
这个公式考虑到了刚才说的三个方面的纬度,当然也会加一些调节因子。再者就是我们如果想做上线的话,需要考虑的一个重要方面就是成本控制。因为我们提高QoS的最终目的,就是希望用户能够更长时间观看我们的视频,这样会为我们带来更高的收益,但是如果我们完全不考虑带宽来为用户提高更高的码率,我们整体的带宽的成本也会变得越来越高,这样可能导致我们所取得的收益可能并不足以覆盖所付出的成本,所以如果要上线的话,成本控制也是需要考虑的一个重要方面。在这个评估模型中,它其实有很多方面都没有考虑到,一个是没有考虑到卡顿的次数;另外一个,它并不是用户观看体验直接的体现,只是我们一个计算公式。
3、强化学习
强化学习目前是AI领域中运用非常广泛的一个技术,主要是在预测,就是做决策方面比较擅长。它主要包括两个部分,一个是Agent,即最终做决策的一个单位,另外一个就是Environment,这个环境也就是Agent所面临的所有输入。整个流程就是在每一步,Environment会给Agent一个输入,这个输入也就是状态。在Agent取得这个状态以后,会采取一定的动作。在采取这个动作之后,这个Agent会获得一定的奖励,也就是Reward,那这个Agent就会观察我现在的状态,我所采取的动作是什么,我所获得的Reward是什么,这样在经过一系列的训练之后,它能够使得我之后再采取一些动作的时候,我所能获得的奖励就是最高的,就是这样一个过程。
那么为什么要用强化学习完成自动码率调节呢?
因为强化学习所解决的问题就是马尔科夫过程的问题,ABS问题又正好是一个马尔科夫过程的问题,因为ABS其实是根据我们当前的状态来选择下一个码率,它和之前的状态都是不相关的。如果我们采用强化学习来做选择下一个码率,我们把带宽,Buffer,还有等等一些播放状态来当作我的状态,只需要把这些状态输入我的Agent,无需要对带宽进行预测了,而且我们现在的技术已经可以满足,提供一些数据后,强化学习自动训练,并且针对不同的场景可以使用不同模型,这样的话,也无需进行调参。
4、基于强化学习的自动码率调节
在做成基于强化学习的自动码率调节后首先需要考虑一个问题,即这个过程是放到客户端还是服务器端来做?
1) 客户端实现码率预测功能
架构非常简单,我们只要把这个模型训练好之后,拿到客户端来做,由客户端自己来决定下一个码率就好了。
2) 服务器端实现码率预测功能
这就要实现一个BS架构,自动码率调节功能是由客户端和服务器端共同来做的,服务器端来决定选择哪个码率,然后将这个码率再发送给客户端。
另外一个问题,经过模型训练后,如何确定一个最优模型呢?
模型训练好了之后,需要进行一个评估,评估好了之后,我们会选择我们评估效果最好的那个模型来使用,在这个过程我们会选择用A/B Test的架构来选取最优模型。A/B Test的结果是确定最终模型的关键;C/S架构更适合做A/B Test,因为服务器端是可以很容易控制的,我们在CS这样一种架构上来做A/B Test是比较简单方便的。
下面来看一个实时多模型的A/B Test架构图:
客户端和服务器端进行沟通的时候,我们可以先经过一个算法的选择器,可以用一个服务器来做分发,来实现A/B Test以更好的评估训练出来的模型,在这个算法服务器后面,就是对应的一个一个的强化学习模型的服务器,通过一个算法分发器,就能够决定一个模型它所针对哪些用户。同时Selector也可以知道它所收集到的不同模型的数据是什么;然后通过这个A/B Test Selector服务器,将收集到的数据通过QoS Scorer服务器来进行最终的计算,这样就实现了一个A/B Test 的过程。
在利用A/B Test来评估最优模型的过程也会遇到很多的问题:
1) 码率预测模型的选择
强化学习它有很多模型,因为码率预测它的状态是个连续的过程,所以我们选择DRL,DRL对连续的输入输出都会有一个比较好的结果。
2) 选择合理的训练方式
首先,训练数据的收集是需要客户端来投递的;其次是Reward的选择,因为强化学习一个很重要因素就是需要给它一个Reward,那Reward的选择会直接影响到后续训练出来模型的效果;再就是On-Policy还是Off-Policy的训练方式。
3) QoS评估
我们现在很常用的一些模型它没有考虑卡顿次数的因素,所以需要考虑这个;再就是我们会增加一些用户反馈的数据来直观的表现出用户是否喜欢我们这样给他做的自动码率调节,可能有的用户并不喜欢。
4) 成本控制
我们需要考虑的非常清楚,我们为用户提供更清晰的视频,收益是否会大于支出。
5、Q&A
Q1:亚楠老师,有一位同学问到,请问你们这个是用在点播上的吗?有应用在直播吗?
A: 我们现在是在点播上用,不过会计划部署到直播端,线上现在也是有用户在用,如果你是我们的灰度用户,你可能会观看到这样一个效果。最后的效果也是我刚才介绍的一部分,这里面会有一个评分,评分最高就是用强化学习来做自动码率调节的效果,相比于其他的得分是一些其他模型的得分,目前我们来看用强化学习来做这样的事情还是可以的,相对于强化学习来说,自动码率调节还算是一个非常简单的事情。
Q2:亚楠老师可以具体的说一下QoS的评分吗?
A: QoS评分我们现在会有很多种了,我现在翻到那页PPT,我们现在的QoS评分,目前这个QoS评分是我们做得一个Reward,我们最终在做,我刚才给的那一幅图上面,会加很多其他的因素,我这里的卡顿次数,还有用户观看的体验的这样一个得分,在这里定义的QoS是清晰度的得分,还有流畅度的得分,平滑度的得分,这三项结合到一起,然后我们自己调节的这样一个模型。
Q3:输出的码率是连续的吗?
A: 输出码率是不连续的,因为自适应码率它的码率都是固定档位的,它会有几档之分,它不是连续的码率的。
Q4:在实战中有没有部署过mao的Pensieve,在相同的State&Action下,Performance是怎么样的?
A: 这是个好问题,我们这个工作就是和mao合作的,一开始是我们和他合作的,他们希望能够用一些业界的数据来证明一下,那我们在做这个事情的时候,如果做研究的模型,直接拿出来用到我们线上的话,是有很多方面是需要进行改动的,调节的。那我们最开始的思想是借鉴的毛的这个Pensieve的一个思想,最后加入了很多我们的思考,以及针对我们在实际的工作中遇到的很多问题进行了解决。那基本思想就是Pensieve,我们是和他进行一个合作的。Performance,因为我们是在这个模型之上加入了很多我们自己的一些理解,还有一些其他因素这样做的,具体的performance数据数据可以关注我们后续的技术分享。
Q5:客户端集成模型,你们感觉它的性能是怎样的?
A: 客户端集成模型我们也有评估,最终确定出来效果之后,我们觉得影响应该不会很大,特别是对PC端,当然对一些低端的安卓机可能会有一些影响,具体的一些低端的安卓机我们要不要用这样一种在客户端实现的方式,我们后面还需要继续评估。对于一些比较高端的安卓机,还有苹果机应该是没有什么影响。复杂度,看你怎么说,因为这样一个事情,除了网络和Buffer以外,就是一些我们所考虑到的,比如说成本的因素,等等这样一些因素,我们的维度是比较少的,并没有很多,所以它的复杂度也并不是很高,这样的话,对于我们的放到客户端来做,其实是有优势的。我们现在之所以会首先选择C/S架构,主要是为了先做A/B Test,做完A/B Test之后,我们能最终确定一个最优的一个模型。
Q6:比如卡顿比各播放码率分布在部署前后的变化,总带宽的变化,下载速度的统计等这些是怎样的?
A: 卡顿比,这个数据都比较细了,我们可以说一下,首先是码率分布的话,码率的质量是有一个很明显的提升的,包括我们的720P和1080P的占比都会有一个非常明显的提升,相对应的卡顿比的变化倒不是很明显。我在这里之所以提高到,提了很多次这些成本控制,就是我们观测到,因为我们的清晰度,就是高码率的占比会比较大的时候,我的带宽的增长其实是非常大的,所以这个带宽的变化也是比较大的。下载速度,当然下载速度我们倒没有特意的去评估,因为我们觉得,我们从我们评估的角度来看,卡顿比如果没有增加的话,它的下载速度是能够支撑他在下载的码率。