眼看用戶視頻的增長將超過服務(wù)器的算力上限,既沒有額外的服務(wù)器來支持,也不能對用戶體驗(yàn)造成大的沖擊,Instagram的工程師找到了兩種編碼過程中重復(fù)計(jì)算的部分,并將他們合二為一,如此便可節(jié)省可觀的算力。他們是如何做到的呢?
作者:Ryan Peterman, Haixia Shi
譯者:核子可樂
在對效率的不斷追求當(dāng)中,Instagram的工程師們開發(fā)出一種新的視頻處理方法,能夠?qū)⒒A(chǔ)視頻編碼的耗時縮短94%。
有了這種方法,Meta的視頻基礎(chǔ)設(shè)施無需添加更多設(shè)備即可吸納更多負(fù)載。
由此釋放出的資源,可讓更多用戶觀看高清編碼流,提供更加清晰流暢的視頻體驗(yàn)。這對網(wǎng)絡(luò)連接不佳國家/地區(qū)的用戶尤其有益。
Instagram的用戶群體不斷增長,目前月度活躍用戶已超20億。受眾的迅速擴(kuò)張也要求我們的服務(wù)器集群提供更好的性能體驗(yàn)。2021年初,我們的預(yù)測表明在未來12個月內(nèi),現(xiàn)有基礎(chǔ)設(shè)施已經(jīng)不足以消化所有用戶的視頻上傳負(fù)載。但憑借對效率的不斷追求,Instagram在工程師們開發(fā)出一種新的視頻處理方法,無需向視頻基礎(chǔ)設(shè)施內(nèi)添加更多設(shè)備即可吸納更多負(fù)載。
Instagram會為用戶上傳的視頻創(chuàng)建多種編碼版本,不同版本間各有特性。而只要利用一種類型的視頻編碼輔助生成另一種類型,即可將觀看次數(shù)較少的視頻所占用的編碼計(jì)算資源減少94%。由此釋放出的更多資源可用于生成更多高清編碼視頻流,讓更多用戶獲得更清晰、更流暢的播放體驗(yàn)。
Instagram如何分配視頻計(jì)算資源
對于上傳至Instagram的每段視頻,我們都會為其生成兩種視頻編碼版本:
基礎(chǔ)編碼,能夠適配所有Instagram客戶端,其壓縮率較低、可以在較陳舊的設(shè)備上順暢解碼和播放。
高級編碼,使用更新的壓縮技術(shù)以提升播放質(zhì)量。
問題在于,其中基礎(chǔ)視頻編碼占用了我們超過八成的計(jì)算資源儲備。如果繼續(xù)沿著這個路線發(fā)展,那么基礎(chǔ)編碼功能將在一年內(nèi)耗盡Instagram的全部資源。到那個時候,用戶上傳視頻后需要等待更長時間才能完成發(fā)布,甚至根本無法正常發(fā)布。相比之下,我們的高級編碼只占總觀看時長的15%,預(yù)計(jì)將所有算力都花在基礎(chǔ)編碼上之后,高級視頻編碼將沒有任何資源可用。
移除冗余工作負(fù)載
對于其中的基礎(chǔ)視頻編碼部分,Instagram又具體劃分出兩種類型。對于每段上傳視頻,我們首先會生成最基礎(chǔ)的自適應(yīng)碼率(ABR)版本,也就是最低功能類型。這樣一來,客戶就可以選擇最適合當(dāng)前連接速度的版本,防止帶寬波動導(dǎo)致的畫面卡頓——所謂的自適應(yīng)碼率就是這個意思。
另外一種則是很少用到的漸進(jìn)式編碼(另一種最低功能類型),我們同樣會持續(xù)生成這個版本,以保證其與無法支持ABR的舊版Instagram應(yīng)用相兼容。
傳統(tǒng)上,我們從客戶端上傳至后端的原始文件會分別對應(yīng)ABR和漸進(jìn)式編碼兩個版本。這個進(jìn)程會占用計(jì)算資源——如以下終端命令所示,將23秒長的視頻轉(zhuǎn)碼為720p,共需要86.17秒的CPU時間。
$ time ffmpeg -i input.mp4 -vf scale=-1:720 -c:v libx264 output.mp4 86.17s user 1.32s system 964% cpu 9.069 total
我們注意到,這兩組編碼具有相似的設(shè)置——使用相同的編解碼器,只是編碼配置文件和預(yù)設(shè)略有區(qū)別。于是我們意識到,完全可以用漸進(jìn)式編碼的視頻幀替換掉基礎(chǔ)ABR編碼,也就是將其重新打包為支持ABR的文件結(jié)構(gòu)。如此一來,也就消除了生成基礎(chǔ)ABR編碼所對應(yīng)的成本。以下終端命令表明,生成manifest文件并將視頻幀重新打包為相同輸入視頻且支持ABR格式的文件結(jié)構(gòu),只需要0.36秒:
$ time MP4Box -add input.mp4 -dash 2000 -profile dashavc264:onDemand -out manifest.mpd video_output.mp4 0.36s user 2.22s system 95% cpu 2.690 total
這種方法省出了高級編碼所占用的算力,犧牲掉的則是我們基礎(chǔ)ABR編碼的壓縮效率。但我們認(rèn)為,提高高級編碼的生成比例對于Instagram用戶而言應(yīng)該是好事。
建立框架,驗(yàn)證我們的理論
在投入生產(chǎn)之前,我們得先驗(yàn)證這個理論。如果單純比較基礎(chǔ)ABR編碼在變更前后的占比區(qū)別,并不足以得出有意義的結(jié)論。我們還需要衡量高級編碼占比增加后的凈值。從下圖可以看到,從基礎(chǔ)ABR中釋放出算力之后,用戶觀看高級編碼視頻的時間確實(shí)更長了。這應(yīng)該足以抵消我們發(fā)明的新基礎(chǔ)ABR算法犧牲掉的壓縮效率。
為了做出進(jìn)一步量化,我們還構(gòu)建了一套測試框架,其中的測試池和控制池復(fù)制了一小部分用戶流量。我們將各個池內(nèi)的視頻編碼保存至不同的命名空間,稍后作為視頻控制目錄或測試目錄中的一部分。這樣在交付時,人們就只能看到來自其中某一目錄的編碼,幫助我們衡量新的編碼方案是否更好。
在此次測試中,我們證明雖然測試池中基礎(chǔ)ABR編碼的壓縮效率有所下降,但高級編碼視頻的觀看時間變得更長、足以抵消這部分損失。
推向生產(chǎn)
在上線這項(xiàng)優(yōu)化后,我們的基礎(chǔ)編碼與高級編碼視頻觀看時間有了顯著變化。新的編碼方案將基礎(chǔ)ABR編碼的生成成本降低了94%。憑借更多可用資源,我們能夠?qū)⒏呒壘幋a的觀看時間占比提升至33%。換句話說,如今有更多Instagram用戶能夠體驗(yàn)到更清晰、更流暢的視頻內(nèi)容了。這對于網(wǎng)絡(luò)連接不佳國家/地區(qū)的用戶們尤其有益。
我們的工程創(chuàng)新探索永不止步,Instagram知道不斷增長的用戶群體正對我們的服務(wù)器集群提出越來越高的要求。更多優(yōu)化即將發(fā)布,敬請關(guān)注!
編輯:黃飛
?
評論