前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netflix:提升视频编码工作流效率

Netflix:提升视频编码工作流效率

作者头像
用户1324186
发布2021-08-25 10:54:42
9040
发布2021-08-25 10:54:42
举报
文章被收录于专栏:媒矿工厂媒矿工厂

来源:InfoQ: Improving Video Encoding System Efficiency @Netflix 主讲人:Susie Xia 内容整理:胡经川 这篇文章中 Susie Xia 讨论了 Netflix 使用的视频编码系统,以及用于分析性能和提高系统效率的工具和技术。

目录

  • 视频编码系统
    • 为什么需要压缩?
    • 视频编码 pipeline
  • 挑战
  • 三项技术
    • 使用高解析度的工具
    • 利用好硬件特性
    • 调整工作负载大小

1视频编码系统

为什么需要压缩?

首先,我们需要了解视频为什么需要压缩。视频具有庞大的数据量,对于以 4K 或更高的分辨率拍摄的电影,一整天的拍摄将产生 2 至 8T 字节的原始数据。想象一下,一部可能是在几周或几个月内拍摄的电影,这个数据量是非常庞大的。当一部电影准备好后,经过编辑,视频源文件就会被送入 Netflix 系统。通常情况下,视频源文件很大,尽管没有原始镜头那么大,对于一集 1 小时长的视频源文件,将近有 500G 字节大小。向客户提供几百 G 的视频是不现实的,所以我们需要压缩内容,使客户在各种条件下都能流畅地观看,无论他们是用最快宽带下的的 4K HDR 电视,还是用蜂窝网络非常不稳定的移动手机。

这个压缩视频源文件的过程就是我们所说的视频编码。视频编码是一个伟大的流媒体体验的基础。Netflix 致力于在 1000 多种支持的设备上向客户提供最优的画面质量。视频编码是在 Netflix 云基础设施运行的最重要的工作负载之一。

视频编码 pipeline

图:视频编码 pipeline

视频编码 pipeline 如上图所示。让我们放大视频编码 pipeline 的细节,看看是什么样子的。在最左边,有一个视频源,在最右侧,有一台 4K 电视,我们想在上面观看节目。当原始内容第一次被摄取到系统中时,首先运行一些快速验证。接下来,媒体内容被分解成更小的块,每个块是视频的一部分,通常持续时间约为 30 秒至几分钟,然后以大规模并行的方式,在服务器上对这些视频块进行独立编码。一旦所有的块完成了编码过程,它们就会被重新组合,成为一个单一的编码视频资产。这个视频文件与原始视频源文件相比,大约小 1000 倍。然后,DRM 保护将被添加到视频资产和包中,并生成流。该包,即流媒体资产被分发到世界各地的 CDN,并准备好被客户播放。

这个简化的管道视图显示了它在某一个配置中的样子。为了支持数以千计的不同设备并优化每个设备的体验,我们需要针对不同的视频编解码器、分辨率和比特率运行这个过程。在现实中,必须为整个 Netflix 的所有节目流做这个工作,这在云中成为一个大规模的并行计算问题,峰值时有数十万个 CPU 同时运行。

2挑战

我们知道编码管道是什么样子的,现实中 Netflix 的编码工作流是什么样的呢?首先,工作流是突发和不可预测的,这是由合作伙伴或团队来完全驱动的。例如,一个工作室突然发布了一整季的剧集,那么就需要尽可能快地对它们进行编码。另外,大多数工作可以分解为较小的处理步骤来并行运行,一个 30 分钟的剧集的到来可能会产生 25 万个任务同时处理。第三,媒体处理算法是 CPU 密集型的,仅仅是一小段视频就可能需要几个小时甚至几天。它还要求大量的内存磁盘 I/O。最后,每隔一段时间,必须为部分甚至整个节目单的内容重新编码,以便能够利用最新的编解码和优化技术,这个过程则可能需要几个月才能完成。

在这样的一个工作流中,有两个维度需要牢记,即延迟和吞吐量。对于延迟,在最高层次上看,意味着能多快地发布一个新的节目,这不仅仅意味着客户可以多快开始观看,也意味着内部团队可以开始使用这些材料进行营销;在较低的层次上看,则需要衡量工作项目能以多快的速度单独完成。对于吞吐量,则意味着重新编码整个节目单需要多长时间,还有,在给定的资源下,有多少工作可以并行完成?

3三项技术

考虑到以上的一些挑战,在这里介绍 Netflix 团队应用的三种技术,以帮助提高视频编码系统的效率。这些技术是关于使用正确的工具来检查你的工作负载。其次是知道你的硬件能提供什么,以及如何充分利用它。最后,找出一种方法,在分布式系统中适当地适应工作负载。

使用高解析度的工具

Netflix Atlas 工具

让我们从第一个技巧开始,称之为使用高解析度的工具。这个想法很简单,你能优化的东西仅限于你能观察到的东西。大家可能经常使用一个显示 CPU 利用率的标准时间序列图来查看 CPU 工作情况。在这里向大家展示的是一个叫做 Netflix Atlas 的开源工具,Netflix 使用它来分析微服务。

图:Netflix Atlas 界面

Atlas 可以提供了 1 分钟的平均指标来进行监控,效果相当好。在上图中,显示的是一个视频编码工作者在 3 小时内的 CPU 利用率。请注意,工作者从队列中获取工作项目,并按顺序处理它们。正如你所看到的,CPU 的利用率是相当高的,范围从 40% 到 100%。这张图中的前 30 分钟,该工作者正在处理 59 个 H.264 编码任务。在接下来的 30 分钟里,它只做了一个 HEVC 编码任务。在最后的一个半小时里,有 80 个任务在做 VP9 编码。在总共 3 个小时内,有 140 个任务正在运行,其中相当多的任务在同一分钟内开始和结束。但该图表是以 1 分钟为间隔,视图太粗糙了,不能准确地告诉我们一个任务中发生了什么。所以进一步挖掘信息很重要。

Netflix Vector 工具

为了进一步挖掘,需要使用一个可以提供更多颗粒度的工具。在这里,我们介绍 Netflix Vector,也是一个开源工具,它可以提供 1 秒的系统指标平均值。使用这个工具,你可以清楚地看到,在这个 15 秒的任务中,CPU 从 0% 攀升到 50%,然后下降到 10%,然后又回升到 100%,再一路下降到 0%,这对于系统在做什么更加直观。

图:Netflix Vector界面

FlameScope 与 FlameGraph 工具

然后介绍 FlameScope,这是一个性能可视化分析工具,它允许我们放大 CPU 配置文件的一小部分,因此我们可以在一秒钟内发现正在发生的事情。在这个可视化中,每个单元都有从白色到粉红色到红色的颜色,可以用它来分析不同编解码器的任务。这张图的的两个轴都是是时间范围,一列是一秒钟的切分,大约被分为 50 份,每个单元或像素的大小约为 20 毫秒。颜色的深度表示在该时间范围内有多少个 CPU 在工作。更酷的是,通过点击并选择一组像素,我们可以看到时间范围内的火焰图。

图:FlameScope 界面

回到不同编码任务的可视化上。我们可以看到,他们似乎都没有充分利用 CPU,否则它们就会是全红的。我们还可以看到,有不同类型的模式,这表明有共同的性能问题,从而指导我们做些什么。第一,空闲的 CPU 时间被表示为白色列,这意味着 CPU 什么都不做,这通常表明有机会进行更多的并行化。我们也有浅粉色的区域,这表明只有一个 CPU 被使用。如果我们以 H.264 为例,大的粉红色区域有一些红点表示扰动,这可能是中断或系统任务。对于这种情况,一个常见的优化策略是看你是否能消除这些块的资源争用。最后,我们有大的红块,这是一个很好的指标,说明程序充分利用了 CPU 的优势。除此之外,还可以通过研究哪些函数正在运行,并重写它们以使它们运行得更快来尝试优化。

要做到这一点,一个可能非常方便的工具是 FlameGraph。你可以通过点击热图中的一个像素子集来进入 Flame Graph。它是一个可视化应用程序和内核堆栈的工具,可以快速而准确地识别出最频繁的代码路径。一个框架越宽,它在堆栈中出现的频率就越高。有了这个,你可以很容易地找出我们可以进一步优化的东西。

图:FlameGraph 界面

总之,使用高解析度的工具就像通过放大镜观察系统,它可以帮助我们找出所有潜在的可以进行性能优化的地方。

利用好硬件特性

第二种技术是利用好硬件特性使任务运行得更快。你有一辆跑车,如果你不全速驾驶它,当然是在安全的赛道环境下,你就没有最大限度地发挥它的全部潜力。

以一个编码任务为例,通过研究上面的火焰图,我们知道总的 CPU 时间有 33% 花在了一个特定的函数上,这个函数以紫色突出显示。这段实例来自 JPEG2000 的编码器和解码器库,一旦我们深入研究这段代码,我们发现大部分的编码工作涉及到时域和频域的转换,以及其他处理卷积的方法。这种类型的度量计算通常是利用特殊硬件的好时机,如 FPGA,或 GPU。然而,在大多数 x86 上已经有了优化的成果。所以在我们的案例中,我们决定利用矢量指令,如 AVX2、SSE,它们允许更快的度量图,这会大大加快你的程序速度。当然,这不是一件容易的事,这需要很好地了解你的硬件和软件,这样你就知道该调什么。硬件上可能有一个特殊的旋钮,等待你去发现。

调整工作负载大小

第三个也是最后一个技术,分享的是关于适当调整工作负载的大小,以便更好地利用资源。这里有一个改进的 AV1 编码的例子。AV1 是一个新的编解码器,它可以减少 15% 的比特率,但要求编码的 CPU 时间增加 1.5 倍。假设我们已经应用了前面两个技术,你已经把工作人员完全优化了,同时也充分利用了硬件功能。通过监控 CPU 的利用率,我们发现它的运行速度为 25%。我们在想,如何才能提高整个实例的吞吐量?然后我们所做的就是实现一些并发的 worker,根据我们运行的实例类型进行扩展。最终,实现了 100% 的 CPU 利用率,而且我还把单实例的吞吐量提高了一倍。

图:改进的 AV1 示例

另外就是你需要很清楚你的工作结构。如果你想使用很多参数来塑造编码工作项目的类型,如分辨率、编解码器、帧数,还有资源利用率,如 CPU、内存、磁盘、网络,工作持续时间等。一个好的方法是你可以对编码过程进行注释,以了解不同应用阶段的资源消耗。这里是一个注释编码任务的 CPU 利用率的例子。事实上,我们对其他系统指标也是如此。为了做到这一点,我们基本上对我们的代码进行了仪表化处理,在不同的阶段,它自动发出带有我们想要的所有属性的消息。这些属性包括阶段、持续时间、来源、编码宽度和高度、编解码器和帧的数量。我们将这些数据持久化到数据仓库中进行进一步分析,结果是帮助我们更好地了解正在运行的工作。

图:代码仪表化

附上演讲视频:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 媒矿工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1视频编码系统
    • 为什么需要压缩?
      • 视频编码 pipeline
      • 2挑战
      • 3三项技术
        • 使用高解析度的工具
          • Netflix Atlas 工具
          • Netflix Vector 工具
          • FlameScope 与 FlameGraph 工具
        • 利用好硬件特性
          • 调整工作负载大小
          相关产品与服务
          图像处理
          图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档