新四季網

bert模型最簡單的例子(加速BERT模型有多少種方法)

2023-05-17 23:24:19 4

原文作者:Grigory Sapunov

翻譯:Camel

原文標題:Speeding up BERT

原文連結:https://blog.inten.to/speeding-up-bert-5528e18bb4ea

雷鋒網AI科技評論按:BERT 在 NLP 領域的地位正如 ResNet 在 CV 領域的地位一樣,屬於裡程碑的進展。目前,BERT 已經成為 NLP 深度學習管道中的重要組成部分。

沉重的BERT

但 BERT 並不是完美無瑕的,它最大的問題就是:太大。

BERT-base 模型能夠包含一億個參數,較大的 BERT-large 甚至包含 3.4 億個參數。顯然,很難將這種規模的模型部署到資源有限的環境(例如行動裝置或嵌入式系統)當中。

模型太大是其一,BERT 的訓練和推理時間也太長了!

在基於 Pod 配置的 4 個 Cloud TPUs(總共 16 個 TPU 晶片)上對 BERT-base 進行訓練,或者在 16 個 Cloud TPU(總共 64 個 TPU 晶片)上對 BERT-large 進行訓練,每次預訓練都需要至少 4 天的時間才能完成。

當然對於最終的用戶而言,訓練時間通常似乎並不是什麼大問題,因為反正只需要訓練一次就夠了(實際上往往會訓練多次,因為你可能要多次重新訓練模型,才能獲得滿意的結果)。不過如果能夠加速,當然也是好的,因為迭代越快,你就能越早地解決你的問題。

BERT 的推理時間可能取決於你用的是什麼設備(什麼型號、多少個),在許多情況下,它會極大地限制你要處理數據的數量、速度以及成本。對於某些實時的應用程式來講,用 BERT 簡直是讓人望而卻步。

對以上的問題,能夠想到的最直接的方法就是優化神經網絡。這在神經網絡中並不陌生,其他領域(例如計算機視覺)以前也有相同的問題,並且已經開發了幾種壓縮和加速神經網絡模型的方法。大致可以分為幾類:

架構改進:將原有的架構改進為更快的架構,例如,將 RNN 替換為 Transformer 或 CNN;使用需要較少計算的層等。當然也可以採用其他優化,例如從學習率和策略、預熱步數,較大的批處理大小等;

模型壓縮:通常使用量化和修剪來完成,從而能夠在架構不變(或者大部分架構不變)的情況下減少計算總量;

模型蒸餾:訓練一個較小的模型,該模型能夠複製原始模型的行為。

我們來看下 BERT 在這些策略上可以做什麼。雷鋒網

1、架構和優化改進

大規模分布式訓練

加速 BERT 訓練能夠想到的第一件事(甚至是第零件事)是將其分發到更大的集群當中。雖然最初的 BERT 已經使用了多臺機器進行訓練,但還有更多針對 BERT 分布式訓練的優化解決方案,例如阿里巴巴 [1] 和英偉達 [2] 的一些工作。

英偉達最近使用 NVIDIA DGX SuperPOD(具有 92 個 DGX-2H 節點,共有 1472 個 V100 GPU,理論上可以提供 190PFLOPS)刷新了 BERT 訓練的記錄,在 53 分鐘內訓練出了 BERT-large 模型 [3]。當然,這個訓練也是非常昂貴的,除了英偉達,其他公司和個人很難去做這樣的事情。

還有另外一種更為巧妙優化方案,這是一種被稱為 LAMB 的新的分層自適應大批量優化技術 [4],這種技術可以將 TPUv3 Pod 上的 BERT 訓練時間從 3 天降低到 76 分鐘(1024 個 TPUv3 晶片,可以提供超過 100PFLOPS),顯然,訓練這個模型也不會便宜。

架構

現在考慮更加架構性的以及更少硬體的解決方案。

有一種基於對自注意層行為的觀察來訓練 BERT 的漸進式堆疊方法 [5],該方法的分布局部地集中在其位置和 start-of-sentence token 周圍,且在淺層模型中的注意力分布與深層模型相似。為此,作者提出了將知識從淺層模型轉移到深層模型的堆疊算法,並逐步應用堆棧來加快 BERT 訓練的速度。憑藉這種方式,作者獲得模型的訓練時間相比原始 BERT 的訓練時間縮短了約 25%,歸其原因則在於對於相同數量的步驟,訓練一個小的模型需要的計算也相對較少。

還有一種方法是注意力矩陣的稀疏分解(也稱 Sparse Transformer,這項研究是由 OpenAI 完成的)[6] 和 block attention[7],它們都屬於能夠減少內存和計算總量的體系結構改進。

ALBERT

最後不得不提的是,已經提交給 ICLR 2020 的一個 BERT 的後代,被稱為 ALBERT(A Lite BERT)[8]。

ALBERT 結合了兩種參數降低的技術。

第一種是分解式嵌入參數化,將隱藏層的大小與詞嵌入的大小分開。這種分隔使得在不顯著增加詞彙表嵌入參數大小的情況下能夠更容易增加隱藏層的大小。

第二種是跨層參數共享。這種技術可以防止參數隨著網絡深度的增加而增大。

這兩種技術可以顯著降低 BERT 的參數數量,而不會嚴重影響性能,從而提高參數效率。

與 BERT-large 具有相似配置的 ALBERT,其參數能夠降低 18 倍,訓練速度提高了月 1.7 倍。

相比嚴格調校的 RoBERTa,ALBERT 則同樣更勝一籌 [9]。

2、量化和修剪

量化 會降低模型權重的數值精度。通常情況下,使用 FP32(32 位浮點)來訓練模型,然後可以將其量化為 FP16(16 位浮點),INT8(8 位整數),甚至將其量化為 INT4 或 INT1。於是模型尺寸將隨之減小 2 倍、4 倍、8 倍或 32 倍。這稱為 post-training quantization。

另一個選項是量化感知訓練(也是較為困難和較為不成熟的)。這種方法的 FP16 訓練現在已成為一種普遍的方法。而在 ICLR 2020 提交的論文中有一個比較有趣的工作 [10],它使用 ResNet、GNMT、Transformer 的 8 位浮點表示獲得了最先進的訓練結果。

修剪即從模型中刪除一些不重要或不太重要的權重(有時會是神經元),從而產生稀疏的權重矩陣(或較小的圖層)。甚至還有一些研究直接去除掉與 Transformer 的注意力頭相對應的整個矩陣。

量化,可以使用 TensorFlow Lite(用於設備上推斷的 TensorFlow 的部分)[11] 來執行。TensorFlow Lite 提供了在行動裝置、嵌入式設備和 IoT 設備上轉換和運行 TensorFlow 模型的工具,它支持訓練後量化和量化感知訓練。

另一個選擇是使用英偉達的 TensorRT 框架 [12]。英偉達 TensorRT 是用於高性能深度學習推理的平臺,它包括深度學習推理優化器,並且在運行時能夠為深度學習推理應用程式提供低延遲和高吞吐量。

英偉達最近發布了具有最新優化功能的 TensorRT 6[13],它可以在 T4 GPU 上僅用 5.8 毫秒對 BERT-large 進行推理,而在 V100 上甚至只需要 4.2 毫秒,對於 Titan RTX,速度可能會更快。

當批處理數為 1 時,對於 340M 個參數的 BERT-large 模型,僅需 5.84 毫秒;對於 110M 參數的 BERT-Base 模型,則只需 2.07 毫秒。若將批處理數設為 128,你在使用 BERT-large 時甚至可以達到 250 個句子/秒的處理速度。

更多的數據我們這裡就不再一一列舉了。

PyTorch 最近也宣布了在其 1.3 版本 [14] 中支持量化。儘管目前它還處於實驗階段,但我們已經可以使用它了,因為在其教程中提到他們已經能夠將動態量化應用於將模型權重轉換為 INT8 的 LSTM 語言模型 [15]。

此外,還有一個眾所周知的 BERT 量化,稱為 Q-BERT。這項工作來源於「Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT」[16]。在這個研究中,作者甚至降低到 2-bit 的超低精度量化,但其性能相比於基線卻沒有顯著下降(僅下降 2.3%),而對應的模型參數壓縮率最高可以達 13 倍,嵌入表壓縮率和激活的最高都為 4 倍。

3、蒸餾

另一個有趣的模型壓縮方法是蒸餾,這是一種將大型「teacher」網絡的知識轉移到較小的「student」網絡的技術,訓練學生網絡來模仿教師網絡的行為。

Rich Caruana 及其合作者率先採用了這種策略。在他們先驅性的論文 [17] 中,他們提供了令人信服的證明:大型集成模型所獲得的知識可以轉移到單個小型的模型中。

Geoffrey Hinton 等人在他們的「Distilling the Knowledge in a Neural Network」{18} 論文中證明了這種技術可以應用於神經網絡模型。

DistilBERT

從 Hinton 開始,蒸餾的方法逐漸被應用到了不同的神經網絡中,當然你可能也聽過 HuggingFace 提出的 DistilBERT,這是一種對 BERT 的蒸餾。這項工作出自論文「DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter」[19],目前已經提交到 NeurIPS 2019。

DistilBERT 是一種較小的語言模型,受 BERT 的監督而訓練。在該模型中,作者刪除了令牌類型嵌入和合併器(用於下一個句子分類任務),並保持體系架構其餘部分不變,同時將層數減少了兩倍。

您可以在 HuggingFace(以前叫做 pytorch-transformers 和 pytorch-pretrained-bert)的 translators python 軟體包的幫助下,使用現成的 DistilBERT。該軟體包的 2.0.0 版本支持 TensorFlow 2.0 / PyTorch 互操作。

DistilBERT 的作者還使用了最新 RoBERTa 論文中的一些訓練技巧,這些技巧表明 BERT 的訓練方式對其最終性能至關重要。

DistilBERT 與 BERT 相比具有出人意料的結果:作者保留了 95%以上的性能,但參數卻減少了 40%。

比較 GLUE 基準測試的開發集

在推斷時間方面,DistilBERT 比 BERT 快了 60%以上,比 ELMo BiLSTM 快 120%。

推理速度

TinyBERT

就在幾天前,出現了一種新的 BERT 蒸餾方法,來自華為諾亞方舟實驗室的劉群團隊提出了 TinyBERT[20]。

為了構建一個具有競爭力的 TinyBERT,作者首先提出了一種新的 Transformer 蒸餾方法,來蒸餾嵌入 BERT 的知識。

具體來說就是,他們設計了幾個損失函數來適合 BERT 層的不同表示形式:

1、嵌入層的輸出;

2、Transformer 層派生的隱藏狀態和注意力矩陣;

3、預測層輸出的 logits 輸出。

論文中基於注意力的擬合則得益於最近的發現,即 BERT 學習的注意力權重可以捕獲大量的語言知識,這意味著語言知識可以很好地從教師 BERT 轉移到學生 TinyBERT。而在 BERT 的現有知識蒸餾的方法(如 Distilled BiLSTM_SOFT,BERT-PKD 和 DistilBERT)中卻忽略了這一點。

在這項工作中,作者還提出了一種新穎的兩階段學習框架,包括通用蒸餾和特定任務蒸餾。在通用蒸餾階段,未經微調的原始 BERT 充當教師模型,學生 TinyBERT 通過在通用領域對大型語料庫執行通常的 Transformer 蒸餾來學習模仿教師的行為。他們獲得了可以對各種下遊任務進行微調的通用 TinyBERT。在特定任務蒸餾階段,他們將數據進行擴充,來提供更多與任務相關的材料供教師-學生學習,然後在增強的數據上重新執行 Tranformer 蒸餾。

這個兩階段方法對於提升 TinyBERT 的性能和泛化能力是必不可少的。

TinyBERY 在實驗上取得了非常的成績,相對於 GLUE 數據集的 BERT-base,其性能並沒有下降多少,而推理參數小了 7.5 倍,推理時間快了 9.4 倍。

TinyBERT 與其他基準的比較

我們期待他們能夠將這種方法應用到 BERT-large 和 XLNet 等大型模型中,同樣也期待他們開放源碼。

其他蒸餾方法

除了 DistilBERT 和 TinyBERT 外,還有其他一些為大家所熟知的蒸餾方法。

(2019/03)「Distilling Task-Specific Knowledge from BERT into Simple Neural Networks」[21]

這篇論文將 BERT 蒸餾到單層 BiLSTM 中,取得了與 ELMo 可比的結果,同時使用的參數減少了大約 100 倍,推理時間減少了 15 倍。

BiLSTM_SOF 是 TBiLSTM 的蒸餾,後者是在 soft logit 目標上訓練出來的。

(2019/08)「Patient Knowledge Distillation for BERT Model Compression」[22]

這篇論文提出了一種耐心知識蒸餾的方法,這是首次嘗試使用教師的隱藏狀態,而不僅僅是最後一層的輸出。他們的學生模型從教師模型的多個中間層「耐心」地學習來獲得更多知識。在他們的耐心蒸餾知識框架中,只訓練學生模仿中間層的 [CLS] 令牌的表示形式。代碼已公開 [23]。

(2019/09)「Extreme Language Model Compression with Optimal Subwords and Shared Projections」

這是最近提交到 ICLR 2020 的一篇論文,這篇論文專注於一種用於訓練詞彙量顯著較小、嵌入和隱藏狀態維度較低的學生模型的知識蒸餾技術。作者採用了雙重訓練機制,可以同時訓練教師和學生模型,從而能夠獲得針對學生詞彙的最佳詞嵌入。該方法能夠將 BERT-base 模型壓縮 60 倍以上,而下遊任務指標只有很小的下降,從而使得語言模型佔用的空間只有不到 7MB。

TinyBERT 的結果似乎更好,但一個 7MB 的類 BERT 模型簡直爽的不能再爽!

需要強調,以上所介紹的方法並不互相衝突,所以我們期待能夠將這些方法協同起來使用來加速 BERT 模型(或其他相似模型)。

參考資料

[1] https://www.alibabacloud.com/blog/perseus-bert-industry-leading-bert-training-solution-optimized-for-performance_594717

[2] https://github.com/NVIDIA/Megatron-LM

[3] https://devblogs.nvidia.com/training-bert-with-gpus/

[4] https://arxiv.org/abs/1904.00962

[5] http://proceedings.mlr.press/v97/gong19a/gong19a.pdf

[6] https://arxiv.org/abs/1904.10509

[7] https://arxiv.org/abs/1804.00857

[8] https://openreview.net/pdf?id=H1eA7AEtvS

[9] https://blog.inten.to/papers-roberta-a-robustly-optimized-bert-pretraining-approach-7449bc5423e7

[10] https://openreview.net/forum?id=HJe88xBKPr

[11] https://www.tensorflow.org/lite

[12] https://developer.nvidia.com/tensorrt

[13] https://news.developer.nvidia.com/tensorrt6-breaks-bert-record/

[14] https://pytorch.org/blog/pytorch-1-dot-3-adds-mobile-privacy-quantization-and-named-tensors/

[15]https://pytorch.org/tutorials/advanced/dynamic_quantization_tutorial.html

[16] https://arxiv.org/abs/1909.05840

[17] https://www.cs.cornell.edu/~caruana/compression.kdd06.pdf

[18] https://arxiv.org/abs/1503.02531

[19] https://arxiv.org/abs/1910.01108

[20] https://arxiv.org/abs/1909.10351

[21] https://arxiv.org/abs/1903.12136

[22] https://arxiv.org/abs/1908.09355

[23] https://github.com/intersun/PKD-for-BERT-Model-Compression

[24] https://arxiv.org/abs/1909.11687

雷鋒網報導。

,
同类文章
昆明小吃特色小店(介紹15款昆明百姓小吃)

昆明小吃特色小店(介紹15款昆明百姓小吃)

來雲南旅遊的外省朋友下飛機到昆明,或者其它地方到昆明玩的,或者在昆明打拼的,給大家推薦幾個百姓小吃。 本人最鍾愛的就是路邊攤,拋開衛生不衛生的問題,好吃才是最重要的 找到那些「隱於世」的美味小吃 找到了下面這些國寶級的小吃店 到昆明想吃到正宗實惠的百姓小吃,那麼這家一定
這4種美食一定要少吃(也別碰這4種美食)

這4種美食一定要少吃(也別碰這4種美食)

在看臉的時代,除了要有顏值外,身材好也越來越重要。物質的極大豐盛,讓我們每天都可以吃到很多以前沒有吃過的東西。我們都知道,胖是吃出來的,有些我們平常常吃的食物,看似沒什麼油,吃了應該會很健康,不長肉,但恰恰不是這樣的。以下4種美食,看似含油少,其實是很容易長肉的,來看看下面這4種是不是你常吃的。
正宗烤魚做法烤箱竅門(烤魚只要方法正宗)

正宗烤魚做法烤箱竅門(烤魚只要方法正宗)

炙烤鱸魚 愛情容易讓人痴狂,殊不知美食也是如此,尤其還是如此鮮美的鱸魚。 食材準備 400克鱸魚,40克大蔥段,薑片少許 1臺烤箱,1張錫紙,1把刷子,2克鹽 5毫升料酒,食用油適量烹飪步驟 1 洗淨的鱸魚兩邊切上一字花刀。 2 取一盤,放入鱸魚,往鱸魚身上撒
沒有糯米粉怎麼做湯圓詳細步驟(一碗糯米粉一把芝麻)

沒有糯米粉怎麼做湯圓詳細步驟(一碗糯米粉一把芝麻)

一碗糯米粉一把芝麻,教你在家做湯圓,香甜又軟嫩,比買的還好吃 元宵節是中國人十分重要的節日,所以民間有「元宵大如年」的說法。每到傳統節日元宵節,到處張燈結彩,不管南方北方,都有吃湯圓(也叫元宵)的習俗,不僅開胃可口,也是為新一年討個好彩頭。 其實湯圓的做法很簡單,一碗糯米粉加上一把芝
又滑又嫩又脆的基圍蝦怎麼做(基圍蝦這樣做太好吃了)

又滑又嫩又脆的基圍蝦怎麼做(基圍蝦這樣做太好吃了)

還有幾天就要過年了,大夥這幾天應該都挺忙的吧!家鄉的父母正在忙著辦年貨,而在外工作的你,或許正在忙著買車票吧,您啥時回家過年呢?小時候覺得一年時間好慢,但是長大以後就覺得時間太快了,一轉眼就到了,如果是上班的話領12次工資就完了,做生意的話估計這幾天正在忙著收帳了吧,反正每個人都有自己的苦衷,長大
熟綠豆怎麼樣做綠豆餅(綠豆別再煮湯了)

熟綠豆怎麼樣做綠豆餅(綠豆別再煮湯了)

綠豆別再煮湯了,教你自製綠豆餅,皮薄餡大酥掉渣,餡料綿密細膩 最近綠豆餅似乎又火起來了,看到別人都在吃,我也忍不住買了兩盒,味道確實不錯,外面的皮很薄,並且比較酥,裡面包裹著的綠豆餡也香得很,不算特別甜,並且綿密細膩,一口咬下去冰涼爽口。 立夏將至,天也熱了,家裡的綠豆除了煮湯之外,不
北京哪裡烤魚最好吃(北京最美味的烤魚店TOP10)

北京哪裡烤魚最好吃(北京最美味的烤魚店TOP10)

推薦閱讀發送「推薦」提取文章 2015北京必吃100家餐館 北京適合請爸媽吃飯的館子 北京南城、東城、西城、北城美食地圖 北京古代天黑沒電,他們幹啥 京城那些排長隊的餐館 江邊城外烤全魚 人均:67元 地址:東直門內大街15-2號 推薦理由:分
汗蒸房為什麼要一直開著(幹蒸房很多人也理解為汗蒸房是否對)

汗蒸房為什麼要一直開著(幹蒸房很多人也理解為汗蒸房是否對)

最近有在網上接待了不少客戶朋友的小編,聽到了客戶朋友會問到,有沒有幹蒸房,最後經過細細了解才發現,幹蒸房和汗蒸房存在分不清的情況,這裡給大家普及一下吧。 首先我們都知道土豆,只要一說土豆就知道它是可以吃的,什麼土豆燒肉,乾鍋土豆片什麼來的,但是有些地方就喜歡叫馬鈴薯,如果當地有一個人想要網上尋
相府油潑魚(浙江臨海各派出所大廚曬廚藝)

相府油潑魚(浙江臨海各派出所大廚曬廚藝)

錢江晚報·小時新聞記者 陳棟 通訊員 馮佳麗 不少人很好奇,那些威武神勇、無所不能的警察,平日裡都吃的啥,一日三餐又是誰在打理? 近日,浙江臨海市公安局就別出心裁,舉辦以「我為祖國獻道菜」為主題的廚藝大賽,將臥虎藏龍在各派出所背後的大廚們請了出來,大家切磋廚藝,拿出一道各自的拿手好菜,並邀
肉絲麵如何做好吃(炒出來的肉絲麵的做法)

肉絲麵如何做好吃(炒出來的肉絲麵的做法)

想吃炒麵,但是家裡只有普通的白麵條,於是這道午餐就誕生了。。。。 製作方法和炒麵非常相似,因為這種白麵條比較嫩,所以不適合炒太長的時間,我是把所有的蔬菜和肉都炒熟之後再放入麵條,這樣既能保持麵條的完整性,而且吃起來也別有一番風味 圖片中我準備的蔬菜比較多,是兩個人的分量,而且我自己也喜歡吃多