AI 前線導(dǎo)讀:Netflix (官方中文名稱:網(wǎng)飛)是全球最大的視頻流媒體平臺,在除中國大陸地區(qū)之外的所有國家和地區(qū)都提供視頻點(diǎn)播服務(wù)。全球的觀眾都在追棒 Netflix,而如此成功的 Netflix,其內(nèi)部主要使用的又是什么編程語言呢?那就是今年成為語言流行指數(shù)榜單冠軍的 Python!
更多優(yōu)質(zhì)內(nèi)容請關(guān)注微信公眾號“AI 前線”(ID:ai-front)由于我們團(tuán)隊(duì)中有很多成員準(zhǔn)備參加 PyCon,因此我們想在這篇文章中分享一些經(jīng)驗(yàn),介紹 Python 在 Netflix 是如何應(yīng)用于方方面面的。在 Netflix 的整個(gè)內(nèi)容生命周期中都會(huì)使用 Python,從決定為哪些內(nèi)容提供資金,到運(yùn)營為 1.48 億會(huì)員提供視頻服務(wù)的 CDN。我們使用并貢獻(xiàn)了許多開源 Python 包,其中的一些包將在本文中提到。如果你對此感興趣的話,可以訪問 Netflix 的招聘網(wǎng)站,或參加 PyCon 來與我們交流。
AI 前線注:
招聘網(wǎng)站:https://jobs./search?q=python
Open Connect 是 Netflix 的內(nèi)容分發(fā)網(wǎng)絡(luò)(content delivery network,CDN)??紤] Netflix 基礎(chǔ)設(shè)施的運(yùn)作的一種簡單但不精確的方法是,參照在你按下遙控器上的“播放”按鍵之前發(fā)生的所有事情(例如,你是否已經(jīng)登錄?你有何計(jì)劃?你看過什么電影?這樣我們就可以給你推薦新電影,你想看什么?)都是發(fā)生在亞馬遜網(wǎng)絡(luò)服務(wù)中(Amazon Web Services,AWS),而之后發(fā)生的所有事情(即視頻流)都是發(fā)生在 Open Connect 網(wǎng)絡(luò)中。內(nèi)容放在 Open Connect CDN 中的服務(wù)器網(wǎng)絡(luò)上,盡可能靠近終端用戶,為我們的客戶改善流媒體體驗(yàn),并降低 Netflix 和我們的互聯(lián)網(wǎng)服務(wù)供應(yīng)商(Internet Service Provider,ISP)合作伙伴的成本。
AI 前線注:內(nèi)容分發(fā)網(wǎng)絡(luò)(Content delivery network 或 Content distribution network,縮寫:CDN)是指一種通過互聯(lián)網(wǎng)互相連接的計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng),利用最靠近每位用戶的服務(wù)器,更快、更可靠地將音樂、圖片、影片、應(yīng)用程序及其他文件發(fā)送給用戶,來提供高性能、可擴(kuò)展性及低成本的網(wǎng)絡(luò)內(nèi)容分發(fā)給用戶。
設(shè)計(jì)、構(gòu)建和運(yùn)營這個(gè) CDN 基礎(chǔ)設(shè)置需要各種軟件系統(tǒng),其中很多都是用 Python 編寫的。構(gòu)成 CDN 大部分的網(wǎng)絡(luò)設(shè)備主要是由 Python 應(yīng)用程序管理。這樣的應(yīng)用程序跟蹤我們網(wǎng)絡(luò)設(shè)備的庫存:都有哪些設(shè)備、哪些型號,用什么硬件組件,都位于什么位置。這些設(shè)備的配置由幾個(gè)其他系統(tǒng)控制,包括數(shù)據(jù)源、設(shè)備配置的應(yīng)用和備份。用于收集運(yùn)行狀況和其他運(yùn)營數(shù)據(jù)的設(shè)備交互是另一個(gè) Python 應(yīng)用程序。長期以來,Python 一直是網(wǎng)絡(luò)領(lǐng)域中流行的編程語言,因?yàn)樗且环N直觀語言,允許工程師能夠快速解決網(wǎng)絡(luò)問題。隨后,人們開發(fā)了許多有用的庫,使得 Python 更為容易學(xué)習(xí)和使用。
Demand Engineering 負(fù)責(zé) Netflix 云計(jì)算的區(qū)域故障轉(zhuǎn)移、流量分配、容量運(yùn)營和集群效率。我們可以很自豪地說,我們團(tuán)隊(duì)的工具主要是由 Python 構(gòu)建的。編排故障轉(zhuǎn)移的服務(wù)使用 numpy 和 scipy 來執(zhí)行數(shù)值分析,boto3 對 AWS 基礎(chǔ)設(shè)施進(jìn)行更改,rq 用于運(yùn)行異步工作負(fù)載,我們將其打包在一個(gè) Flask API 的薄層中。放入 bpython shell 并進(jìn)行臨時(shí)制作的能力已經(jīng)不止一次挽救了局面。
AI 前線注:有關(guān) Demand Engineering 可參閱《What is Demand Engineering?》:https://www.linkedin.com/pulse/what-demand-engineering-aaron-blohowiak/
我們是 Jupyter Notebook 和 nteract 的重度用戶,可以分析運(yùn)營數(shù)據(jù)和原型可視化工具,以幫助我們檢測容量回歸(capacity regressions)。
CORE 團(tuán)隊(duì)在我們的警報(bào)和統(tǒng)計(jì)分析工作中使用 Python。在警報(bào)系統(tǒng)顯示問題時(shí),我們依靠許多統(tǒng)計(jì)和數(shù)學(xué)庫(如 numpy、scipy、ruptures、pandas)來幫助自動(dòng)分析 1000 多個(gè)相關(guān)信號。我們開發(fā)了一個(gè)用于團(tuán)隊(duì)內(nèi)外的時(shí)間序列相關(guān)系統(tǒng),以及分布式工作系統(tǒng),用于并行化大量的分析工作,以快速交付結(jié)果。
Python 也是我們通常用來自動(dòng)化任務(wù)、數(shù)據(jù)挖掘和清理的工具,也是可視化工作的便攜來源。
監(jiān)控、警報(bào)和自動(dòng)修復(fù)Insight Engineering 團(tuán)隊(duì)負(fù)責(zé)構(gòu)建和操作用于運(yùn)營洞察力、警報(bào)、診斷和自動(dòng)修復(fù)的工具。隨著 Python 越來越受歡迎,該團(tuán)隊(duì)現(xiàn)在支持 Python 客戶端的大多數(shù)服務(wù)。一個(gè)例子就是 Spectator Python 客戶端庫,這是一種用于檢測代碼以記錄維度時(shí)間序列度量的庫。我們構(gòu)建了 Python 庫來與其他 Netflix 平臺級服務(wù)進(jìn)行交互。除了庫之外,Winston 和 Bolt 產(chǎn)品也使用了 Python 框架(Gunicorn + Flask + Flask-RESTPlus)來構(gòu)建。
信息安全團(tuán)隊(duì)使用 Python 為 Netflix 實(shí)現(xiàn)了許多高層次目標(biāo):安全自動(dòng)化、風(fēng)險(xiǎn)分類、自動(dòng)修復(fù)和漏洞識別等等。我們有許多成功的 Python 開源項(xiàng)目,包括 Security Monkey(我們團(tuán)隊(duì)最活躍的開源項(xiàng)目)。我們利用 Python 來保護(hù)使用 Bless 的 SSH 資源?;A(chǔ)設(shè)施安全團(tuán)隊(duì)利用 Python 幫助使用 Repokid 進(jìn)行 IAM 權(quán)限調(diào)整。我們使用 Python 來幫助使用 Lemur 生成 TLS 證書。
我們最近的一些項(xiàng)目包括 Prism:一種批處理框架,用于幫助安全工程師測量平整道路采用、風(fēng)險(xiǎn)因素,并識別源代碼中的漏洞。我們目前為 Prism 提供了 Python 和 Ruby 庫。Diffy 取證分類工具完全使用 Python 編寫。我們還使用 Python 來檢測使用 Lanius 的敏感數(shù)據(jù)。
我們在更廣泛的個(gè)性化機(jī)器學(xué)習(xí)基礎(chǔ)設(shè)施中,廣泛使用 Python 來訓(xùn)練一些 Netflix 體驗(yàn)關(guān)鍵方面的機(jī)器學(xué)習(xí)模型:從我們的推薦算法到圖片個(gè)性化,再到營銷算法。例如,一些算法使用 TensorFlow、Keras 和 PyTorch 來學(xué)習(xí)深度神經(jīng)網(wǎng)絡(luò),XGBoost 和 LightGBM 來學(xué)習(xí)梯度提升決策樹,或者 Python 中更廣泛的科學(xué)堆棧(numpy、scipy、sklearn、matplotlib、pandas、cvxpy 等等)。由于我們不斷嘗試新的方法,我們使用 Jupyter Notebook 來驅(qū)動(dòng)我們的許多實(shí)驗(yàn)。我們還開發(fā)了一些更高級別的庫,以幫助將這些庫與我們的其他生態(tài)系統(tǒng)集成(如數(shù)據(jù)訪問、事實(shí)記錄和特征提取、模型評估和發(fā)布)。
機(jī)器學(xué)習(xí)基礎(chǔ)設(shè)施除了個(gè)性化之外,Netflix 還將機(jī)器學(xué)習(xí)應(yīng)用于整個(gè)公司的數(shù)百個(gè)用例中。其中有許多應(yīng)用程序都是 Metaflow 提供支持的,這是一個(gè) Python 框架,可以使從原型階段到生產(chǎn)階段執(zhí)行機(jī)器項(xiàng)目變得很容易。
Metafolw 提升了 Python 的極限:我們利用良好的并行化和優(yōu)化的 Python 代碼來獲取 10Gbps 的數(shù)據(jù),處理內(nèi)存中數(shù)億個(gè)數(shù)據(jù)點(diǎn),并協(xié)調(diào)數(shù)萬個(gè) CPU 內(nèi)核的計(jì)算。
我們是 Netflix 的 Jupyter Notebook 的擁躉,我們之前已經(jīng)寫過這項(xiàng)投資的原因和性質(zhì),請參閱《Beyond Interactive: Notebook Innovation at Netflix》:
https:///netflix-techblog/notebook-innovation-591ee3221233
但是,在我們?nèi)绾翁峁┻@些服務(wù)方面,Python 發(fā)揮著重要的作用。當(dāng)我們需要開發(fā)、調(diào)試、探索和原型化與 Jupyter 生態(tài)系統(tǒng)的不同交互時(shí),Python 是一種主要語言。我們使用 Python 為 Jupyter 服務(wù)器構(gòu)建自定義擴(kuò)展,允許我們代表用戶管理日志記錄、歸檔、發(fā)布和克隆筆記本等任務(wù)。我們通過不同的 Jupyter 內(nèi)核為用戶提供了多種風(fēng)格的 Python,并使用 Python 管理這些內(nèi)核規(guī)范的部署。
大數(shù)據(jù)編排團(tuán)隊(duì)(The Big Data Orchestration team)負(fù)責(zé)提供所有服務(wù)和工具來安排和執(zhí)行 ETL 和 Ad hoc 管道。
AI 前線注:Ad hoc 的意思是“特設(shè)的、特定目的的(地)、即席的、臨時(shí)的、將就的、專案的”。這個(gè)短語通常用來形容一些特殊的、不能用于其它方面的的,為一個(gè)特定的問題、任務(wù)而專門設(shè)定的解決方案。
編排服務(wù)的許多組件都是用 Python 編寫的。從我們的調(diào)度程序開始,它使用 Jupyter Notebook 和 papermill 來提供模板化的作業(yè)類型(如 Spark、Presto 等等)。這使得我們的用戶能夠以標(biāo)準(zhǔn)化的、簡單的方式來表達(dá)需要執(zhí)行的工作。要想知道有關(guān)這一主題的更多詳情,請參閱《Part2:Scheduling Noteebooks at Netflix》:
https:///netflix-techblog/scheduling-notebooks-348e6c14cfd6
在需要人工干預(yù)的情況下,我們一直使用 notebook 作為真正的運(yùn)行手冊。即:重新啟動(dòng)過去一小時(shí)內(nèi)所有失敗的事情。
在內(nèi)部,我們還構(gòu)建了一個(gè)完全用 Python 編寫的事件驅(qū)動(dòng)平臺。我們已經(jīng)創(chuàng)建了來自多個(gè)系統(tǒng)的事件流,這些系統(tǒng)將統(tǒng)一到一個(gè)工具中。這允許我們能夠定義過濾事件的條件,以及響應(yīng)或路由事件的動(dòng)作。因此,我們能夠解耦微服務(wù),并能夠了解數(shù)據(jù)平臺上發(fā)生的所有事情。
我們的團(tuán)隊(duì)還構(gòu)建了 pygenie 客戶端,它與 genie(一種聯(lián)合作業(yè)執(zhí)行服務(wù))接口。在內(nèi)部,我們對這個(gè)庫進(jìn)行了額外的擴(kuò)展,可應(yīng)用業(yè)務(wù)約定并與 Netflix 平臺集成。這些庫是用戶以變成方式與大數(shù)據(jù)平臺中的工作進(jìn)行交互的主要方式。
最后,我們團(tuán)隊(duì)致力于為 papermill 和 scrapbook 開源項(xiàng)目做出貢獻(xiàn)。我們?yōu)榇诉M(jìn)行的工作既適用于我們自己的用例,也適用于外部用例。我們的這些努力在開源社區(qū)獲得了很大吸引力,我們很高興能夠?yàn)檫@些共享項(xiàng)目做出貢獻(xiàn)。
用于實(shí)驗(yàn)的科學(xué)計(jì)算團(tuán)隊(duì)正在為科學(xué)家和工程師創(chuàng)建一個(gè)分析 AB 測試和其他實(shí)驗(yàn)的平臺??茖W(xué)家和工程師可以在數(shù)據(jù)、統(tǒng)計(jì)和可視化這三個(gè)方面做出新的創(chuàng)新。
Metrics Repo 是一個(gè)基于 PyPika 的 Python 框架,它允許貢獻(xiàn)者編寫可重用的參數(shù)化 SQL 查詢。它是任何新分析的切入點(diǎn)。
因果模式庫是一個(gè) Python 和 R 框架,供科學(xué)家為因果推理提供新的模型。它利用了 PyArrow 和 RPy2,因此可以使用這兩種語言的任何一種無縫地計(jì)算統(tǒng)計(jì)數(shù)據(jù)。
可視化庫是基于 Plotly。因?yàn)?Plotly 是一種廣泛采用的可視化規(guī)范,因此有許多工具可以讓貢獻(xiàn)者生成我們平臺可以使用的輸出。
合作伙伴生態(tài)系統(tǒng)小組正在擴(kuò)展 Python 在設(shè)備上測試 Netflix 應(yīng)用程序的使用范圍。Python 正在形成一個(gè)新的 CI 基礎(chǔ)架構(gòu)的核心,包括控制我們的編排服務(wù)器、控制 Spinnaker、測試用例查詢和過濾,以及在設(shè)備和容器上調(diào)度測試運(yùn)行。使用 TensorFlow 在 Python 中進(jìn)行額外的運(yùn)行后分析,以確定哪些測試最有可能顯示哪些設(shè)備上的問題。
我們的團(tuán)隊(duì)負(fù)責(zé)對 Netflix 目錄進(jìn)行編碼(和重新編碼),并利用機(jī)器學(xué)習(xí)來深入了解該目錄。我們將 Python 用于大約 50 個(gè)項(xiàng)目,如 vmaf 和 mezzfs,我們使用名為 Archer 的媒體映射化簡平臺( media map-reduce platform)構(gòu)建計(jì)算機(jī)視覺解決方案,并在許多內(nèi)部項(xiàng)目中使用 Python。我們還開源了一些工具來簡化 Python 項(xiàng)目的開發(fā) / 分發(fā),比如 setupmeta 和 pickley。
Python 是我們用于創(chuàng)建動(dòng)畫和 VFX 內(nèi)容的所有主要應(yīng)用程序的行業(yè)標(biāo)準(zhǔn),毫無疑問,我們正在大量使用它。我們與 Maya 和 Nuke 的所有集成都是用 Python 實(shí)現(xiàn)的,而我們的 Shotgun 工具的大部分也是用 Python 實(shí)現(xiàn)的。我們剛剛開始在云端中使用我們的工具,并與其部署我們自己的許多定制的 Python AMI / 容器。
內(nèi)容機(jī)器學(xué)習(xí)、科學(xué)與分析內(nèi)容機(jī)器學(xué)習(xí)團(tuán)隊(duì)廣泛使用 Python 來開發(fā)機(jī)器學(xué)習(xí)模型,這些模型是預(yù)測所有內(nèi)容的受眾規(guī)模、收視率和其他需求指標(biāo)的核心。
文中涉及到的部分項(xiàng)目、庫的官方地址: Open Connect:https://openconnect./en/
bpython:https:///
nteract:https:///
visualization tools:https://github.com/nteract/nteract/tree/master/packages/data-explorer
Spectator:https://github.com/Netflix/spectator-py
Security Monkey:https://github.com/Netflix/security_monkey
Bless:https://github.com/Netflix/bless
Repokid:https://github.com/Netflix/repokid
Lemur:https://github.com/Netflix/lemur
papermill:https://papermill./en/latest/
pygenie:https://github.com/Netflix/pygenie
scrapbook:https://nteract-scrapbook./en/latest/
PyPika:https://pypika./en/latest/
PyArrow:https://arrow./docs/python/
RPy2:https://rpy2./en/version_2.8.x/
Plotly:https:///
vmaf:https://github.com/Netflix/vmaf/blob/master/resource/doc/references.md
mezzfs:https:///netflix-techblog/mezzfs-mounting-object-storage-in-netflixs-media-processing-platform-cda01c446ba
setupmeta:https:///project/setupmeta/
pickley:https:///project/pickley/
原文鏈接:
https:///netflix-techblog/python-at-netflix-bba45dae649e