Archer是Netflix的媒体处理引擎,底层是执行MapReduce的各种Docker,在上层跑各种算法。Archer可以检测出视频中的图像错误,字幕对关键内容的遮挡等问题。本文来自Netflix的科技博客,由LiveVideoStack摘译整理。
文 / Naveen Mareddy, Frank San Miguel, Mangala Prabhu and Olof Johansson
译 / 王月美
原文:https://medium.com/netflix-techblog/simplifying-media-innovation-at-netflix-with-archer-3f8cbb0e2bcb
想象一下,你正在开发一个快速原型,即通过电影《布莱德》的所有帧来筛选出威尔·史密斯的最佳镜头,并且需带有动感十足的背景。你的目标是以高新人度正确地获得计算机视觉算法,而不必考虑:
过去,我们开发人员必须考虑以上包括在内的所有这些事情。正如你所看到的,当目标是简单地获得正确的算法时,这是非常重要的。在此篇博客中,我们将分享我们如何构建一个名为Archer的平台,在Archer中一切都以透明方式处理,使用户能够直入算法。
图1:来自运行在Archer上的“标题图像选择算法”中的样本
关于我们
我们是来自于媒体云工程团队(MCE)。我们支持高级媒体处理,其中包括媒体代码转换,预告片生成以及用于艺术品的高质量图像处理。我们的计算机农场运行数以万计的EC2实例来处理动态工作负载。计算机饥饿用例的一些示例包括A / B测试,基于镜头编码的目录范围重新编码以及高质量标题图像。我们负责处理媒体计算平台的大规模分布式计算方面,并与编码技术团队密切合作,共同制定媒体标准和编解码器。
我们的历程
在Archer之前,已经可以使用内部开发的媒体处理平台(代号Reloaded)在云中进行分布式媒体处理。尽管它功能强大和灵活性高,但Reloaded平台的开发需要在观察软件开发最佳实践,持续集成(CI),部署编排和分阶段发布培训的同时,仔细设计动态工作流,数据模型和分布式工作线程。虽然这些是为功能推出做出的正确选择,但对于那些只关注其算法的研究人员而言,这其实是一个障碍和干扰。为了获得敏捷性并免受云部署的干扰,我们的用户要尽可能在本地计算机上运行实验。但是该处规模是有限的。他们最终是需要针对大型内容目录运行他们的算法,以获得更好的信号。
我们研究了Apache Spark,Kubernetes和Apache Flink等分布式计算框架。 这些框架均缺少重要功能,如对媒体对象的一流支持,针对每次执行的自定义docker镜像或具有公平资源平衡的多租户群集支持。
图2:本地运行大型实验的痛苦
然后我们就意识到,我们可以将Reloaded中的最佳属性与流行的分布式计算框架中的模式相结合,并综合减轻了前面提到的一些困难,提供了一个易于使用的平台,可以为点对点实验,某些确定类型的生产用例进行大规模地运行。
Archer
Archer是一个易于使用的MapReduce样式平台,用于使用容器进行媒体处理,以便用户可以提供其操作系统级别的依赖关系。常见的媒体处理步骤,如挂载视频帧,由该平台处理。开发人员编写三个功能:分割,map和收集; 并且它们可以使用任何一种编程语言。Archer专为简单的媒体处理而设计,这就意味着该平台能够识别媒体格式,并为流行的媒体格式提供“白手套式”处理。例如,ProRes视频帧是Archer中的第一个类对象,并支持将视频源分割为基于镜头的块[1](镜头是相机不移动的视频片段)。
使用Archer可构建许多创新应用程序,其中包括检测由数码相机故障引起的坏点像素的应用程序,使用机器学习标记音频的应用程序以及为字幕执行自动质量控制(QC)的应用程序。后续,我们将会看到更多的应用实例。
图3:运行中的坏点像素检测器[1]
高级视图
从10,000英尺的高度来看,Archer其实拥有多个组件来运行工作。一切均是从REST API开始,来接受工作请求。然后工作流引擎选中请求并驱动MapReduce工作流,将工作调度为优先级队列的消息。应用程序工作线程在队列中进行侦别并执行用户提供的媒体处理功能。考虑到工作的动态性,Archer使用了一个队列感知缩放器来连续移动资源,以确保所有应用程序获得足够的计算资源。 (请参阅@Scale 2017会议上Archer的展示 https://atscaleconference.com/videos/archer-a-distributed-computing-platform-for-media-processing/)。
图4:Archer的高级架构
简单操作
通过高效访问云中的大文件,使用任意媒体文件与不可视基础架构进行快速原型设计等功能,使得Archer的简单操作成为可能。
MapReduce风格 - 在Archer中,用户认为他们的处理工作具有三个功能:分割,map和收集。分割功能的作用是将媒体分成更小的单元。map功能将媒体处理算法应用于每个分割之中。收集功能是来自map阶段的结果结合起来。用户可以用他们选择的编程语言或使用内置的语言功能来实现以上三个功能。Archer为常见任务提供了内置功能,例如基于镜头的视频帧分离器和连接收集器。通过仅实现map功能构建应用程序并使用分离器和收集器的内置程序非常常见。而且,Archer用户可以将内置的可重用功能提供给平台。
图5:显示MapReduce阶段的示例Archer作业
视频帧作为图像—大多数计算机视觉算法(CV)喜欢使用JPEG / PNG图像来检测复杂的特征,如运动估计和相机镜头检测。视频源格式使用自定义压缩技术来表示原始来源,并且需要进行解码以将源格式转换为图像。为避免需要重复相同的代码来解码视频帧(每种源格式不同),Archer有一项功能,可允许用户在作业提交期间选择图像格式,质量以及裁剪参数。
基于容器的runtime — Archer用户将其应用程序打包为Docker图像。它们以相同的方式在本地或云中运行应用程序。基于容器的本地开发使得用户能够快速地将应用程序转换为工作状态并在此之后又快速迭代,然后,使用一些命令来将应用程序按规模地运行在云中。基于Docker的环境允许用户安装他们选择的操作系统依赖关系,并且每个应用程序可以独立于其他应用程序来选择他们的操作系统依赖关系。例如,在Archer中运行的实验可能会安装FFmpeg等媒体工具的快照版本,并获得快速反馈,而产生式应用将依赖于已发布的版本。Archer使用Titus(Netflix的容器管理平台)大规模运行这些容器。
图6:按比例在云中运行相同的操作系统的依赖关系
访问内容目录—大多数Archer应用程序需要访问Netflix内容目录中的媒体源。Archer job API提供了一个内容选择器,用户可以选择他们选择的可播放作为其作业执行的输入。例如,您可以通过仅知道电影ID来针对电影《布莱德》的UHD视频源运行算法。并且,无需担心云中视频源的位置或媒体格式。
本地开发— Netflix的开发者生产力团队已经构建了一个名为Newt(Netflix Workflow Toolkit)的工具来简化本地开发人员的工作流程。Archer使用Newt来提供丰富的命令行界面,此使得本地开发变得简单。开始一个新的Archer作业或下载实验结果仅用一个命令即可。这些命令将本地Docker工作流程以及与Archer作业API的交互进行了包装。另外,使用用户所选择的编程语言来构建应用程序也很容易。
图7:本地开发工作流程
Archer助你一臂之力
借助像Archer这样的简单平台,我们的工程师可以在几小时或几天的时间内自由地联想、创作并实现它们。如果没有Archer完成繁杂的任务,我们可能没有尝试过这些创新。我们的用户利用了数千万个CPU小时创建出惊人的应用程序。以下举例:
图8:在字幕创作工具中使用的Archer应用程序生成的镜头更改数据
图9:在Archer平台上运行的文本检测算法
图10:运行在Archer上的应用程序挑选的标题图像
图11:由Archer启用的插图图像发现
图12:为插图自动选择最佳姿势
图13:由Archer启用的文本遮挡检测
总结
Archher仍处于积极发展的阶段,我们正努力不断扩展其功能和规模。我们对其拥有的经验越多,则实现可能性就越大。以下是我们规划图中的一些项目:
在接下来即将发布的博客文章中,我们将撰写安全媒体存储服务,支持Archer和Netflix的其他项目。
虽然Archer平台还是比较新的,待完善与改进的,但是Netflix的许多团队每天正在验证该平台,他们正在采用Netflix产品并在Netflix产品中进行创新。热情和使用频率正在不断增长,以此同时,我们也需要优秀的工程人才。
参考文献
[1] S. Bhattacharya, A. Prakash, and R. Puri, Towards Scalable Automated Analysis of Digital Video Assets for Content Quality Control Applications, SMPTE 2017 Annual Technical Conference, and Exhibition, Hollywood & Highland, Los Angeles, California, 2017
本文分享自 LiveVideoStack 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!