速度超快!字節跳動開源序列推理引擎LightSeq

2020-12-17 TechWeb

這應該是業界第一款完整支持 Transformer、GPT 等多種模型高速推理的開源引擎。

 

2017 年 Google 提出了 Transformer [1] 模型,之後在它基礎上誕生了許多優秀的預訓練語言模型和機器翻譯模型,如 BERT [2] 、GPT 系列[13]等,不斷刷新著眾多自然語言處理任務的能力水平。與此同時,這些模型的參數量也在呈現近乎指數增長(如下圖所示)。例如最近引發熱烈討論的 GPT-3 [3],擁有 1750 億參數,再次刷新了參數量的記錄。

如此巨大的參數量,也為模型推理部署帶來了挑戰。以機器翻譯為例,目前 WMT[4]比賽中 SOTA 模型已經達到了 50 層以上。主流深度學習框架下,翻譯一句話需要好幾秒。這帶來了兩個問題:一是翻譯時間太長,影響產品用戶體驗;二是單卡 QPS (每秒查詢率)太低,導致服務成本過高。

因此,今天給大家安利一款速度非常快,同時支持非常多特性的高性能序列推理引擎——LightSeq。它對以 Transformer 為基礎的序列特徵提取器(Encoder)和自回歸的序列解碼器(Decoder)做了深度優化,早在 2019 年 12 月就已經開源,應用在了包括火山翻譯等眾多業務和場景。據了解,這應該是業界第一款完整支持 Transformer、GPT 等多種模型高速推理的開源引擎。

LightSeq 可以應用於機器翻譯、自動問答、智能寫作、對話回復生成等眾多文本生成場景,大大提高線上模型推理速度,改善用戶的使用體驗,降低企業的運營服務成本。

相比於目前其他開源序列推理引擎,LightSeq具有如下幾點優勢:

1. 高性能

LightSeq推理速度非常快。例如在翻譯任務上,LightSeq相比於Tensorflow實現最多可以達到14倍的加速。同時領先目前其他開源序列推理引擎,例如最多可比Faster Transformer快1.4倍。

2. 支持模型功能多

LightSeq支持BERT、GPT、Transformer、VAE 等眾多模型,同時支持beam search、diverse beam search[5]、sampling等多種解碼方式。下表詳細列舉了Faster Transformer[7]、Turbo Transformers[6]和LightSeq三種推理引擎在文本生成場景的功能差異:

3. 簡單易用,無縫銜接Tensorflow、PyTorch等深度學習框架

LightSeq通過定義模型協議,支持各種深度學習框架訓練好的模型靈活導入。同時包含了開箱即用的端到端模型服務,即在不需要寫一行代碼的情況下部署高速模型推理,同時也靈活支持多層次復用。

使用方法

利用 LightSeq 部署線上服務比較簡便。LightSeq 支持了 Triton Inference Server[8],這是 Nvidia 開源的一款 GPU 推理 server ,包含眾多實用的服務中間件。LightSeq 支持了該 server 的自定義推理引擎 API 。因此只要將訓練好的模型導出到 LightSeq 定義的模型協議[9]中,就可以在不寫代碼的情況下,一鍵啟動端到端的高效模型服務。更改模型配置(例如層數和 embedding 大小)都可以方便支持。具體過程如下:

首先準備好模型倉庫,下面是目錄結構示例,其中 transformer.pb 是按模型協議導出的模型權重,libtransformer.so 是 LightSeq 的編譯產物。

- model_zoo/- model_repo/- config.pbtxt- transformer.pb- 1/- libtransformer.so 

然後就可以啟動Triton Inference Server[8],搭建起模型服務。

trtserver --model-store=${model_zoo} 

性能測試

在 NVIDIA Tesla P4 和 NVIDIA Tesla T4 顯卡上,筆者測試了 LightSeq 的性能,選擇了深度學習框架 Tensorflow v1.13 和解碼場景支持較為豐富的 Faster Transformer v2.1 實現作為對比。Turbo Transformers 解碼方法比較單一(只支持 Beam Search ,不支持文本生成中常用的採樣解碼),尚未滿足實際應用需求,因此未作對比。

機器翻譯性能

在機器翻譯場景下,筆者測試了 Transformer base 模型(6層 encoder、6層 decoder 、隱層維度 512 )採用 beam search 解碼的性能,實驗結果如下:

可以發現,在小 batch 場景下,Faster Transformer 和 LightSeq 對比 Tensorflow 都達到了 10 倍左右的加速。而隨著 batch 的增大,由於矩陣乘法運算佔比越來越高,兩者對 Tensorflow 的加速比都呈衰減趨勢。LightSeq 衰減相對平緩,特別是在大 batch 場景下更加具有優勢,最多能比 Faster Transformer 快 1.4 倍。這也對未來的一些推理優化工作提供了指導:小 batch 場景下,只要做好非計算密集型算子融合,就可以取得很高的加速收益;而大 batch 場景下則需要繼續優化計算密集型算子,例如矩陣乘法等。

最後在 WMT14 標準的法英翻譯任務上,筆者測試了 Transformer big 模型的性能。LightSeq 在 Tesla P4 顯卡上平均每句翻譯延遲為 167ms ,Tesla T4 上減小到了 82ms。而作為對比, TensorFlow 延遲均為 1071ms,LightSeq 分別達到了 6.41 和 13.06 倍加速。另外,筆者嘗試了其他多種模型配置,得到了比較一致的加速效率。例如更深層的模型結構上(encoder加深至 16 層),LightSeq 得到的加速比,分別是 6.97 和 13.85 倍。

文本生成性能

上述機器翻譯通常採用 Beam Search 方法來解碼, 而在文本生成場景,經常需要使用採樣( Sampling )來提升生成結果的多樣性。下圖展示了 Transformer base 模型採用 top-k/top-p sampling 的性能測試對比:

可以發現,在需要使用採樣解碼的任務中,LightSeq 在大部分配置下領先於 Faster Transformer,最多也能達到 1.4 倍的額外加速。此外,相比於 TensorFlow 實現,LightSeq 對 GPT 和 VAE 等生成模型也達到了 5 倍以上的加速效果。

服務壓力測試

在雲服務上,筆者測試了在實際應用中 GPT 場景下,模型服務從 Tensorflow 切換到LightSeq 的延遲變化情況(服務顯卡使用 NVIDIA Tesla P4)。可以觀察到,pct99 延遲降低了 3 到 5 倍,峰值從 360 毫秒左右下降到 80 毫秒左右,詳細結果如下圖所示:

更多的對比實驗結果可以在 LightSeq 性能評測報告 [10] 中查看到。

技術原理

以 Transformer 為例,一個機器翻譯/文本生成模型推理過程包括兩部分:序列編碼模塊特徵計算和自回歸的解碼算法。其中特徵計算部分以自注意力機制及特徵變換為核心(矩陣乘法,計算密集型),並伴隨大量 Elementwise(如 Reshape)和 Reduce(如Layer Normalization)等 IO 密集型運算;解碼算法部分包含了詞表 Softmax、beam 篩選、緩存刷新等過程,運算瑣碎,並引入了更複雜的動態 shape。這為模型推理帶來了眾多挑戰:

1. IO 密集型計算的細粒度核函數調用帶來大量冗餘顯存讀寫,成為特徵計算性能瓶頸。

2. 複雜動態 shape 為計算圖優化帶來挑戰,導致模型推理期間大量顯存動態申請,耗時較高。

3. 解碼生成每一步字符過程邏輯複雜,難以並行化計算從而發揮硬體優勢。

LightSeq 取得這麼好的推理加速效果,對這些挑戰做了哪些針對性的優化呢?筆者分析發現,核心技術包括這幾項:融合了多個運算操作來減少 IO 開銷、復用顯存來避免動態申請、解碼算法進行層級式改寫來提升推理速度。下面詳細介紹下各部分的優化挑戰和 LightSeq 的解決方法。

算子多運算融合

近年來,由於其高效的特徵提取能力,Transformer encoder/decoder 結構被廣泛應用於各種 NLP 任務中,例如海量無標註文本的預訓練。而多數深度學習框架(例如 Tensorflow、Pytorch 等)通常都是調用基礎運算庫中的核函數(kernel function)來實現 encoder/decoder 計算過程。這些核函數往往粒度較細,通常一個組件需要調用多個核函數來實現。

以層歸一化(Layer Normalization)為例,Tensorflow 是這樣實現的:

mean = tf.reduce_mean(x, axis=[-1], keepdims=True)variance = tf.reduce_mean(tf.square(x - mean), axis=[-1], keepdims=True)result = (x - mean) * tf.rsqrt(variance + epsilon) * scale + bias 

可以發現,即使基於編譯優化技術(自動融合廣播(Broadcast)操作和按元素(Elementwise)運算),也依然需要進行三次核函數調用(兩次 reduce_mean,一次計算最終結果)和兩次中間結果的顯存讀寫(mean 和 variance)。而基於 CUDA,我們可以定製化一個層歸一化專用的核函數,將兩次中間結果的寫入寄存器。從而實現一次核函數調用,同時沒有中間結果顯存讀寫,因此大大節省了計算開銷。有興趣的同學可以在文末參考連結中進一步查看具體實現[11]。

基於這個思路,LightSeq 利用 CUDA 矩陣運算庫 cuBLAS[12]提供的矩陣乘法和自定義核函數實現了 Transformer,具體結構如下圖所示:

藍色部分是自定義核函數,黃色部分是矩陣乘法。可以發現,矩陣乘法之間的運算全部都用一個定製化核函數實現了,因此大大減少了核函數調用和顯存讀寫,最終提升了運算速度。

動態顯存復用

為了避免計算過程中的顯存申請釋放並節省顯存佔用,LightSeq 首先對模型中所有動態的 shape 都定義了最大值(例如最大序列長度),將所有動態shape轉換為靜態。接著在服務啟動的時候,為計算過程中的每個中間計算結果按最大值分配顯存,並對沒有依賴的中間結果共用顯存。這樣對每個請求,模型推理時不再申請顯存,做到了:不同請求的相同 Tensor 復用顯存;同請求的不同 Tensor 按 shape 及依賴關係復用顯存。

通過該顯存復用策略,在一張 T4 顯卡上,LightSeq 可以同時部署多達 8 個 Transformer big 模型(batch_size=8,最大序列長度=8,beam_size=4,vocab_size=3萬)。從而在低頻或錯峰等場景下,大大提升顯卡利用率。

層級式解碼計算

在自回歸序列生成場景中,最複雜且耗時的部分就是解碼。LightSeq 目前已經支持了 beam search、diversity beam search、top-k/top-p sampling 等多種解碼方法,並且可以配合 Transformer、GPT使用,達到數倍加速。這裡我們以應用最多的 beam search 為例,介紹一下 LightSeq 對解碼過程的優化。

首先來看下在深度學習框架中傳統是如何進行一步解碼計算的:

# 1.計算以每個token為結尾的序列的log probability

log_token_prob = tf.nn.log_softmax(logit) # [batch_size, beam_size, vocab_size]log_seq_prob += log_token_prob # [batch_size, beam_size, vocab_size]log_seq_prob = tf.reshape(log_seq_prob, [-1, beam_size * vocab_size]) 

# 2. 為每個序列(batch element)找出排名topk的token

topk_log_probs, topk_indices = tf.nn.top_k(log_seq_prob, k=K) 

# 3. 根據beam id,刷新decoder中的self attention模塊中的key和value的緩存

refresh_cache(cache, topk_indices) 

可以發現,為了挑選概率 top-k 的 token ,必須在 [batch_size, beam_size, vocab_size]大小的 logit 矩陣上進行 softmax 計算及顯存讀寫,然後進行 batch_size 次排序。通常 vocab_size 都是在幾萬規模,因此計算量非常龐大,而且這僅僅只是一步解碼的計算消耗。因此實踐中也可以發現,解碼模塊在自回歸序列生成任務中,累計延遲佔比很高(超過 30%)。

LightSeq 的創新點在於結合 GPU 計算特性,借鑑搜索推薦中常用的粗選-精排的兩段式策略,將解碼計算改寫成層級式,設計了一個 logit 粗選核函數,成功避免了 softmax 的計算及對十幾萬元素的排序。該粗選核函數遍歷 logit 矩陣兩次:

• 第一次遍歷,對每個 beam,將其 logit 值隨機分成k組,每組求最大值,然後對這k個最大值求一個最小值,作為一個近似的top-k值(一定小於等於真實top-k值),記為R-top-k。在遍歷過程中,同時可以計算該beam中logit的log_sum_exp值。

• 第二次遍歷,對每個 beam,找出所有大於等於 R-top-k 的 logit 值,將(logit - log_sum_exp + batch_id * offset, beam_id * vocab_size + vocab_id)寫入候選隊列,其中 offset 是 logit 的下界。

在第一次遍歷中,logit 值通常服從正態分布,因此算出的R-top-k值非常接近真實top-k值。同時因為這一步只涉及到寄存器的讀寫,且算法複雜度低,因此可以快速執行完成(十幾個指令周期)。實際觀察發現,在top-4設置下,根據R-top-k只會從幾萬token中粗選出十幾個候選,因此非常高效。第二次遍歷中,根據R-top-k粗選出候選,同時對 logit 值按 batch_id 做了值偏移,多線程並發寫入顯存中的候選隊列。

粗選完成後,在候選隊列中進行一次排序,就能得到整個batch中每個序列的準確top-k值,然後更新緩存,一步解碼過程就快速執行完成了。

下面是k=2,詞表大小=8的情況下一個具體的示例(列代表第幾個字符輸出,行代表每個位置的候選)。可以看出,原來需要對 16 個元素進行排序,而採用層級解碼之後,最後只需要對 5 個元素排序即可,大大降低了排序的複雜度。

可視化分析計算延遲

為了驗證上面幾種優化技術的實際效果,筆者用 GPU profile 工具,對 LightSeq 的一次推理過程進行了延遲分析。下圖展示了 32 位浮點數和 16 位浮點數精度下,各計算模塊的延遲佔比:

可以發現,在兩種計算精度下:

1. 經過優化後,cuBLAS 中的矩陣乘法計算延遲分別佔比 82% 和 88% ,成為推理加速新的主要瓶頸。而作為對比,我們測試了 Tensorflow 模型,矩陣乘法計算延遲只佔了 25% 。這說明 LightSeq 的 beam search 優化已經將延遲降到了非常低的水平。

2. 緩存刷新分別佔比 10% 和 6% ,比重也較高,但很難繼續優化。今後可以嘗試減少緩存量(如降低 decoder 層數,降低緩存精度等)來繼續降低延遲。

3. 其他運算總計佔比 8% 和 6% ,包括了 Layer Normalization、beam search 和中間結果的顯存讀寫等。

可視化結果說明了 LightSeq 已經做到了極致優化,大大提升了推理速度。

傳送門:

GitHub項目地址:

https://github.com/bytedance/lightseq

 

相關焦點

  • 速度超快,字節跳動開源序列推理引擎LightSeq
    因此,今天給大家安利一款速度非常快,同時支持非常多特性的高性能序列推理引擎——LightSeq。它對以 Transformer 為基礎的序列特徵提取器(Encoder)和自回歸的序列解碼器(Decoder)做了深度優化,早在 2019 年 12 月就已經開源,應用在了包括火山翻譯等眾多業務和場景。
  • 字節跳動:開源Fedlearner框架,廣告投放增效209%
    前不久,字節跳動聯邦學習技術團隊也開源了自研的聯邦學習平臺 Fedlearner 。據介紹,字節跳動聯邦學習平臺 Fedlearner 已經在電商、金融、教育等行業多個落地場景實際應用。字節跳動聯邦學習技術負責人吳迪在接受 InfoQ 專訪時表示,聯邦學習面臨的困難更多是如何為客戶爭取可感知的最大商業價值,不同行業的夥伴,其產品特點和價值訴求各不相同。
  • 頭條、抖音後,誰是字節跳動的新引擎?
    作為字節跳動流量和營收支柱,頭條和抖音已經或即將碰到天花板。字節跳動瘋狂布局遊戲、在線教育、電商三大賽道,這裡能長出新增長引擎嗎? 2個多月前,知名出版人路金波在今日頭條上寫了一段話,其中引用了作家林語堂在文章中寫過的一句感慨:「為什麼我們這個行星是個很好的行星」。
  • 字節跳動的B面
    而除了今日頭條和抖音,字節跳動還有西瓜視頻、懂車帝、皮皮蝦等產品,但以上這些,均是字節跳動的A面。鮮為人知的是,字節跳動正大肆發力教育,並布局車聯網。而如果不是疫情的發生,字節跳動推出的企業辦公套件飛書也不會在國內如此普及,這些,也僅僅是字節跳動B面的一部分。
  • 字節跳動今年廣告流水收入或超1700億 抖音貢獻大
    雷帝網 樂天 11月15日報導一直沒上市的字節跳動正成長為一家行業巨頭。日前一份字節跳動專家會資料顯示,字節跳動預計今年巨量引擎媒體廣告會達到1500-1550億流水收入,其中:抖音預期1000-1050億 ,今日頭條在350億上下,西瓜在50億左右,懂車帝會實現約30億以上收入。今年抖音和懂車帝是廣告收入增長最快的產品。
  • 字節跳動的圖資料庫研發實踐
    2019 年年初,Gartner 數據與分析峰會上將圖列為 2019 年十大數據和分析趨勢之一,預計全球圖分析應用將以每年 100% 的速度迅猛增長,2020 年將達到 80 億美元。因此,我們團隊同時也開啟了在離線圖計算場景的支持和實踐。 下面會從圖資料庫和圖計算兩個部分,分別來介紹字節跳動在這方面的一些工作。
  • 阿里正式開源輕量級深度學習端側推理引擎「MNN」
    阿里近日正式開源了輕量級深度學習端側推理引擎「MNN」。與 Tensorflow、Caffe2 等同時覆蓋訓練和推理的通用框架相比,MNN 更注重在推理時的加速和優化,在大規模機器學習應用中具有優勢。本文詳細闡述了MNN背後的技術框架和規劃。 近日,阿里正式開源輕量級深度學習端側推理引擎「MNN」。
  • 「三張」掌控字節跳動 張一鳴要去哪裡?
    字節跳動,發生了成立以來最大的人員變動。張利東和張楠晉升為字節跳動中國董事長和CEO,整體負責字節跳動中國業務的發展。至於張一鳴,他說自己從公司日常運營中脫身,聚焦於更大的挑戰。抖音對於字節跳動有多重要?在營收上,根據網易科技之前的報導,2019年字節跳動總營收約為1200億,抖音的收入約為500億,貢獻了快接近一半的收入。在用戶人數上,截至2020年1月5日,抖音日活躍用戶數已突破4億。抖音的成功成為張楠手中的王炸。
  • 字節跳動的失意版圖
    截至2020年11月,據不完全統計,字節跳動已經布局了社交社區、文娛傳媒、遊戲、人工智慧、企業服務、教育培訓、醫療健康等11個賽道,涵蓋消費網際網路到產業網際網路,「拳打」騰訊,「腳踢」阿里,被網際網路驗證成功過的領域,幾乎都散落著字節跳動的野心。中信證券研報顯示,2019年字節跳動整體收入在1200-1400億元量級,廣告收入佔比超85%,抖音貢獻約50%。
  • 最快開源OLAP引擎!ClickHouse在頭條的技術演進
    AI 前線導讀:ClickHouse 是由號稱「俄羅斯 Google」的 Yandex 公司開源的面向 OLAP 的分布式列式資料庫,能夠使用 SQL 查詢生成實時數據報告。本文整理自字節跳動高級研發工程師陳星在 QCon 全球軟體開發大會(北京站)2019 上的演講,他介紹了 ClickHouse 的關鍵技術點、在字節跳動的應用場景以及主要的技術改進。ClickHouse 是由號稱「俄羅斯 Google」的 Yandex 開發而來,在 2016 年開源,在計算引擎裡算是一個後起之秀,在內存資料庫領域號稱是最快的。
  • 谷歌開源神經機器翻譯技術,推出tf-seq2seq框架
    陳樺 編譯自 Google官方博客量子位 報導 | 公眾號 QbitAI谷歌研究軟體工程師、谷歌大腦團隊成員Anna Goldie和Denny Britz今天撰文,宣布在「谷歌神經機器翻譯」的基礎上推出開源框架tf-seq2seq,給外部研究人員提供幫助。
  • 字節跳動的境況有多糟糕?
    來源:第一財經字節跳動的境況有多糟糕? 字節跳動的系統一旦運轉起來,確實可以沿著光纜和蜂窩網絡在地球上無限繁殖。但現在,它正被肢解並趕進籠子裡。字節跳動創始人張一鳴在8月3日的內部信中表示,字節跳動正在與一家科技公司討論,目標是保證TikTok這個App能在美國市場繼續運營下去——這應該是他目前能期待的較好結局。△向下滑動圖片,查看更多內部信內容但就是這樣的結局,對字節跳動來說也非常困難——要實現它已經很困難,而且實現之後,字節跳動面臨的境況也比想像的糟糕。
  • 快看漫畫運營主體發生工商變更 字節跳動退出股東行列
    【TechWeb】9月17日消息,企查查信息顯示,9月16日,快看漫畫運營主體快看世界(北京)科技有限公司工商資料發生變更,股東北京閃星科技有限公司退出,該公司為字節跳動100%控股的企業。
  • 百度與字節跳動合併?百度稱暫不考慮收購,字節跳動回應「學好英語」
    原標題:百度與字節跳動合併?百度稱暫不考慮收購,字節跳動回應「學好英語」(圖片來源:全景視覺)經濟觀察網 記者 任曉寧12月29日,針對路透社對於百度合併字節跳動的分析文章,百度公關負責人在朋友圈回應說:暫不考慮收購字節跳動。
  • 字節跳動入局雲計算 To B野心再加碼
    去年 3 月,知乎上一位標記為字節跳動tag的用戶發布一則招聘廣告《硬廣!——字節跳動雲計算崗位招募》,其中顯示,字節跳動正在招聘包括資源調度、容器內核、後端開發等方向的雲計算研發工程師和高級工程師。近期,在獵聘、拉勾等多個招聘平臺也紛紛上線了字節跳動有關雲計算的招聘需求,總計達到數十個崗位類別。
  • 求解微分方程,用seq2seq就夠了,性能遠超 Mathematica、Matlab
    這篇論文提出了一種新的基於seq2seq的方法來求解符號數學問題,例如函數積分、一階常微分方程、二階常微分方程等複雜問題。其結果表明,這種模型的性能要遠超現在常用的能進行符號運算的工具,例如Mathematica、Matlab、Maple等。
  • 字節跳動的野心,都藏在招聘啟事裡了
    直到TikTok事件受到全網熱議,人們才發現,這家誕生於移動網際網路時代的科技公司,相對於從PC端一路走來的前輩,崛起速度實在快了太多。 對內,字節跳動的人員規模擴張可謂兇猛。2019年底,成立第7年,字節跳動在全球擁有的員工數已經超過6萬人,與另一所大廠騰訊規模相當。而在今年,創始人兼CEO張一鳴更是宣布,2020年底字節跳動全球員工將達到10萬人。
  • 字節跳動在Spark SQL上的核心優化實踐
    本文作者是字節跳動數據倉庫架構負責人
  • 全球部署,萬人並發,字節跳動的企業大學該如何設計?
    與收音機、電視和PC相媲美的新型終端及其引發的媒體變革,產業核心技術和模式的顛覆性變化,發展速度遠遠超越摩爾定律的產業周期,縱向一體化的產業發展平臺和生態體系、全產業鏈條——服務、終端、流量的爆炸性增長等等。今天業界仍然看不到移動網際網路延伸的邊界、發展速度的極限以及未來發展的止境。同時我國4G普及,5G正在加速鋪設,國內移動網際網路正在利用各種客觀條件逐步佔領人們的剩餘時間。