文心ERNIE 3.0 Tiny新升級!端側壓縮部署“小” “快” “靈”!

語言: CN / TW / HK

大家好,今天帶來的是有關文心ERNIE 3.0 Tiny新升級內容的文章。

近年來,隨著深度學習技術的迅速發展,大規模預訓練正規化通過一次又一次重新整理各種評測基線證明了其卓越的學習與遷移能力。在這個過程中,研究者們發現通過不斷地擴大模型引數便能持續提升深度學習模型的威力。然而,引數的指數級增長意味著模型體積增大、所需計算資源增多、計算耗時更長,而這無論出於業務線上響應效率的要求還是機器資源預算問題,都給大模型落地帶來了極大的挑戰。讓我們一起看看文心ERNIE 3.0 Tiny如何來解決這些問題的吧!

圖:模型上線時精度、時延、內視訊記憶體佔用等多重需求示意

如何在保證效果的前提下壓縮模型?如何適配 CPU、GPU 等多硬體的加速?如何在端側場景下落地大模型?如何讓加速工具觸手可及?這是行業內亟待解決的課題。2022年6月,文心大模型中的輕量化技術加持的多個文心ERNIE 3.0 Tiny輕量級模型(下文簡稱文心ERNIE 3.0 Tiny v1)開源至飛槳自然語言處理模型庫PaddleNLP中,該模型重新整理了中文小模型的SOTA成績,配套模型動態裁剪和量化推理方案,被學術與工業界廣泛使用。

近期,文心ERNIE 3.0 Tiny升級版–––文心ERNIE 3.0 Tiny v2也開源了!相較於v1,文心ERNIE 3.0 Tiny v2在Out-domain(域外資料)、Low-resource(小樣本資料)的下游任務上精度顯著提升,並且v2還開源了3L128H結構,5.99M引數量的小模型,更適用於端側等低資源場景。

同時,PaddleNLP依託PaddleSlim、Paddle Lite、FastDeploy開源了一整套端上語義理解壓縮和部署方案。通過模型裁剪、量化感知訓練、Embedding量化等壓縮方案,在保持模型精度不降的情況下,推理加速2.1倍,記憶體佔用降低62.18%(降低2.6倍),體積縮小92.2%(縮小12.8倍)僅5.4M。再結合高效能NLP處理庫FastTokenizer對分詞階段進行加速,使端到端推理效能顯著提升,從而將文心ERNIE 3.0 Tiny v2模型成功部署至端側。由於端側部署對記憶體佔用的要求比服務端更高,因此該方案也同樣適用於服務端部署。

圖:端側裝置示意

文心 ERNIE 3.0 Tiny v2開源

百度文心大模型團隊在2021年底釋出了百億級別大模型文心ERNIE 3.0和千億級別的大模型文心ERNIE 3.0 Titan。為了讓大模型的能力能夠真正在一線業務發揮威力,文心大模型團隊推出多個輕量級模型,即文心ERNIE 3.0 Tiny系列,重新整理了中文小模型的成績。除了在GPU上,這些模型也能在CPU上輕鬆呼叫,極大拓展了大模型的使用場景。本次開源的文心ERNIE 3.0 Tiny v2,使教師模型預先注入下游知識並參與多工訓練,大大提高了小模型在下游任務上的效果。

多工學習提升泛化性

文心ERNIE 3.0 Tiny v1直接通過線上蒸餾技術將預訓練大模型壓縮成預訓練小模型。在此基礎上,文心ERNIE 3.0 Tiny v2 首先在多個下游任務中微調教師模型,讓教師模型學習到下游任務相關知識,並將這些知識通過蒸餾的方式傳導給學生模型。儘管學生模型完全沒有見過下游資料,也能夠蒸餾獲取到下游任務的相關知識,進而使下游任務的效果得到提升。由於教師模型是在多工上進行微調的,多工學習帶來的強泛化性也能傳遞給學生模型,從而提升小模型的泛化性,最終獲得的學生模型相比文心ERNIE 3.0 Tiny v1在Out-domain和Low-resource資料集上獲得大幅提升。 圖:文心ERNIE 3.0 Tiny v2示意

文心ERNIE 3.0 Tiny v2 包含一系列不同尺寸的中文預訓練模型,方便不同效能需求的應用場景使用:

  • 文心ERNIE 3.0 Tiny-Base-v2 (12-layer, 768-hidden, 12-heads)
  • 文心ERNIE 3.0 Tiny-Medium-v2 (6-layer, 768-hidden, 12-heads)
  • 文心ERNIE 3.0 Tiny-Mini-v2 (6-layer, 384-hidden, 12-heads)
  • 文心ERNIE 3.0 Tiny-Micro-v2 (4-layer, 384-hidden, 12-heads)
  • 文心ERNIE 3.0 Tiny-Nano-v2 (4-layer, 312-hidden, 12-heads)
  • 文心ERNIE 3.0 Tiny-Pico-v2 (3-layer, 128-hidden, 2-heads)

除以上中文模型外,本次還發布了英文版文心ERNIE 3.0 Tiny-Mini-v2,適用於各類英文任務。多工學習的能力加持下,在文字分類、文字推理、實體抽取、問答等各種 NLU 任務上,文心ERNIE 3.0 Tiny v2相比文心ERNIE 3.0 Tiny v1在Out-domain、Low-resource資料上均獲得顯著的效果提升,在In-domain上也有一定提升

文心ERNIE 3.0 Tiny v2 多工學習、線上蒸餾方案效果顯著,重新整理了中文小模型的SOTA成績。具體對比資料見如下模型精度-時延圖,橫座標表示在 ARM CPU(高通865晶片)上,基於ARMv8 arch測試(batch_size=1, seq_len=32)的推理時延(Latency,單位毫秒),縱座標是 CLUE 10 個任務上的平均精度(包含文字分類、文字匹配、自然語言推理、代詞消歧、閱讀理解等任務),其中CMRC2018閱讀理解任務的評價指標是Exact Match(EM),其它任務的評價指標均是Accuracy。模型名下方標註了模型的引數量。

圖中越靠左上方的模型,精度和效能水平越高。可以看到文心ERNIE 3.0 Tiny v2在同等規模的開源模型中,綜合實力領先其他同類型輕量級模型,這波開源厲害了!與UER/RoBERTa-Base相比,12L768H的文心ERNIE 3.0 Base平均精度提升了4.5個點;6L768H的文心ERNIE 3.0 Medium相比12L768H的UER/Chinese-RoBERTa高2.4,並且節省一倍運算時間;另外值得一提的是,這些小模型能夠直接部署在CPU上,簡直是CPU開發者的希望之光!

PaddleNLP中,可一鍵載入以上模型。

from paddlenlp.transformers import *
tokenizer = AutoTokenizer.from_pretrained("ernie-3.0-tiny-medium-v2-zh")
# 用於分類任務(本專案中的意圖識別任務)
seq_cls_model = AutoModelForSequenceClassification.from_pretrained("ernie-3.0-tiny-medium-v2-zh")
# 用於序列標註任務(本專案中的槽位填充任務)
token_cls_model = AutoModelForTokenClassification.from_pretrained("ernie-3.0-tiny-medium-v2-zh")
# 用於閱讀理解任務
qa_model = AutoModelForQuestionAnswering.from_pretrained("ernie-3.0-tiny-medium-v2-zh")

此外,PaddleNLP還提供了CLUE Benchmark的一鍵評測指令碼,並提供了大量中文預訓練模型在CLUE上的效果。PaddleNLP接入了Grid Search策略,支援在超參列表範圍內自動搜尋超參,保留最佳結果和對應的超引數,方便一鍵復現模型效果,且打通了CLUE各個任務資料處理、訓練、預測、結果提交的流程,方便使用者快速提交CLUE榜單。

以上模型均已開源,如有幫助,歡迎star支援。

  • 模型地址

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/ernie-tiny

端上語義理解壓縮、部署方案

由文心大模型蒸餾得到的文心ERNIE 3.0 Tiny v2可以直接在下游任務上微調應用,如果想要將模型部署在移動端、邊緣端,或者想要進一步壓縮模型體積,降低推理時延,可使用PaddleNLP開源的端上語義理解壓縮方案。以邊緣端業務上線場景為例,模型經過壓縮後,精度基本無損,端到端推理速度達到原來的2.13倍,記憶體佔用減小了62.18%,體積減小了92.2%

結合飛槳模型壓縮工具PaddleSlim,PaddleNLP釋出了端上語義理解壓縮方案,包含裁剪、量化級聯壓縮,如下圖所示:

基於PaddleNLP提供的的模型壓縮API,可大幅降低開發成本。壓縮API支援對ERNIE、BERT等ransformer類下游任務微調模型進行裁剪和量化。只需要簡單地呼叫compress()即可一鍵啟動裁剪量化流程,並自動儲存壓縮後的模型。

from paddlenlp.trainer import PdArgumentParser, CompressionArguments

# Step1: 使用 PdArgumentParser 解析從命令列傳入的超引數,以獲取壓縮引數 compression_args;
parser = PdArgumentParser(CompressionArguments)
compression_args = parser.parse_args_into_dataclasses()

# Step2: 例項化 Trainer 並呼叫 compress()
trainer = Trainer(
    model=model,
    args=compression_args,
    data_collator=data_collator,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    criterion=criterion)

trainer.compress()

PaddleNLP模型裁剪、量化使用示例

下面會對壓縮方案中的詞表裁剪、模型寬度裁剪、量化感知訓練、詞表量化進行介紹。

詞表裁剪

端側部署對記憶體佔用的要求較高,而文心ERNIE 3.0 Tiny預訓練模型的詞表引數量在總引數量中佔比很大,因此在下游任務微調之前,可以按照詞頻對詞表進行裁剪,去除出現頻次較低的詞,這樣能夠減少分詞後[UNK]的出現,使精度得到最大限度保持。例如,某資料集4w大小的詞表,高頻出現的詞不到1w個,此時通過詞表裁剪可以節省不少記憶體。

模型寬度裁剪

基於DynaBERT寬度自適應裁剪策略,通過知識蒸餾的方法,在下游任務中將文心ERNIE 3.0 Tiny的知識遷移到寬度更窄的學生網路中,最後得到效果與教師模型接近的學生模型。一般來說,對於4到6層的NLU模型,寬度裁剪1/4可基本保證精度無損。DynaBERT寬度自適應裁剪策略主要分為以下3個步驟:

Step1

根據Attention Head和FFN中神經元的重要性對神經元進行重新排序,將新模型作為待壓縮的模型,這樣可以保證之後對神經元的裁剪可以更大程度地保留更重要的神經元。

Step2

用教師模型同時蒸餾按不同比例壓縮寬度的多個模型。

Step3

在蒸餾後得到的不同寬度的學生模型中,選擇大小和精度符合要求的模型並匯出。

量化感知訓練

模型量化是一種通過將訓練好的模型引數、啟用值從FP32浮點數轉換成INT8整數來減小儲存、加快計算速度、降低功耗的模型壓縮方法。目前主要有兩種量化方法:

  • 靜態離線量化:使用少量校準資料計算量化資訊,可快速得到量化模型;
  • 量化感知訓練:在模型中插入量化、反量化運算元並進行訓練,使模型在訓練中學習到量化資訊 。

圖:量化感知訓練 vs 離線量化

在對文心ERNIE 3.0 Tiny的壓縮中,更推薦使用量化感知訓練的方式。通常情況下,使用量化感知訓練的方法能夠比使用靜態離線量化取得更高的精度。這是因為在量化感知訓練之前,壓縮API在模型的矩陣乘運算元前插入量化、反量化運算元,使量化帶來的誤差可以在訓練過程中被建模和優化,能夠使模型被量化後精度基本無損。

Embedding 量化

端側部署對視訊記憶體的要求比較高,為了能進一步節省記憶體佔用,可對模型的 Embedding 權重進行INT8量化,並將精度的損失保持在0.5%之內。Embedding 量化主要分兩步:

Step1

離線統計權重在log域上的分佈並進行分桶,根據分桶結果將FP32權重量化成INT8權重。如圖所示,量化運算元會統計權重在log域上量化後的數值分佈,取出現次數top k的FP32數值,記錄在對應的x軸上,作為buckets的value,其中key為 [-128,127] 範圍內的整數。

Step2

構造INT8推理模型:將權重設定為量化後的INT8權重,並在Embedding對應的運算元後,插入反量化運算元,反量化運算元根據buckets將INT8數值型別的輸入 [5, 3, 6] 反量化為 [1.51, 0.75, 2.50],實現方式為查表。

部署

模型壓縮後,精度基本無損,體積減小了92.2%,僅有5.4MB。到此,演算法側的工作基本完成。為了進一步降低部署難度,可以使用飛槳FastDeploy對模型進行部署。FastDeploy是一款全場景、易用靈活、極致高效的AI推理部署工具,提供開箱即用的部署體驗。

FastDeploy為NLP任務提供了一整套完整的部署Pipeline,提供文心ERNIE 3.0 Tiny模型從文字預處理、推理引擎Runtime以及後處理三個階段所需要的介面模組,開發者可以基於這些介面模組在雲、邊、端上部署各類常見的NLP任務,如文字分類、序列標註、資訊抽取等。

FastDeploy中的Paddle Lite後端基於運算元融合和常量摺疊對深度模型進行優化,無縫銜接了Paddle Lite的FP16和INT8的推理能力,可使模型推理速度大幅提升。其整合的高效能NLP處理庫FastTokenizer(視覺領域集成了高效能AI處理庫FlyCV),能夠對分詞階段進行加速,適配GPU、CPU等多硬體。例如在麒麟985晶片上測試,單條文字的分詞時延低於0.1毫秒

在端到端部署方面,FastDeploy在Android端目前支援CV和NLP中的7+場景,35+模型的開箱即用,以及簡單一致的API,讓Android開發者快速完成AI落地,並且獲得考慮前後處理在內端到端高效能的部署體驗。

綜上,基於FastDeploy部署工具,可完成文心ERNIE 3.0 Tiny端側和服務端的高效部署。以下動圖展示了基於文心ERNIE 3.0 Tiny v2的意圖識別、槽位填充聯合模型,使用FastDeploy部署在Android APP上進行推理的效果展示:

  • GitHub地址

https://github.com/PaddlePaddle/FastDeploy

總結來說,以上各類壓縮策略以及對應的推理功能如果從零實現非常複雜,飛槳模型壓縮工具庫PaddleSlim和飛槳高效能深度學習端側推理引擎Paddle Lite提供了一系列壓縮、推理工具鏈。飛槳AI推理部署工具FastDeploy對其進一步封裝,使開發者可以通過更簡單的API去實現模型壓縮、推理部署流程,適配多領域模型,併兼容多硬體。PaddleNLP依託以上工具,提供NLP模型資料處理、訓練、壓縮、部署全流程的最佳實踐。

文心大模型

隨著資料井噴、演算法進步和算力突破,效果好、泛化能力強、通用性強的預訓練大模型(以下簡稱“大模型”),成為人工智慧發展的關鍵方向與人工智慧產業應用的基礎底座。

文心大模型源於產業、服務於產業,是產業級知識增強大模型,涵蓋基礎大模型、任務大模型、行業大模型,大模型總量達36個,並構建了業界規模最大的產業大模型體系。文心大模型配套了豐富的工具與平臺層,包括大模型開發套件、API以及內建文心大模型能力的EasyDL和BML開發平臺。 百度通過大模型與國產深度學習框架融合發展,打造了自主創新的AI底座,大幅降低了AI開發和應用的門檻,滿足真實場景中的應用需求,真正發揮大模型驅動AI規模化應用的產業價值。

  • 文心大模型官網地址

https://wenxin.baidu.com/

相關專案地址

  • 官網地址

https://www.paddlepaddle.org.cn

https://github.com/PaddlePaddle/PaddleNLP

  • FastDeploy

https://github.com/PaddlePaddle/FastDeploy

https://github.com/PaddlePaddle/PaddleSlim

https://github.com/PaddlePaddle/Paddle-Lite

參考文獻

[1] Liu W, Chen X, Liu J, et al. ERNIE 3.0 Tiny: Frustratingly Simple Method to Improve Task-Agnostic Distillation Generalization[J]. arXiv preprint arXiv:2301.03416, 2023.

[2] Su W, Chen X, Feng S, et al. ERNIE-Tiny: A Progressive Distillation Framework for Pretrained Transformer Compression[J]. arXiv preprint arXiv:2106.02241, 2021.

[3] Wang S, Sun Y, Xiang Y, et al. ERNIE 3.0 Titan: Exploring Larger-scale Knowledge Enhanced Pre-training for Language Understanding and Generation[J]. arXiv preprint arXiv:2112.12731, 2021.

[4] Sun Y, Wang S, Feng S, et al. ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation[J]. arXiv preprint arXiv:2107.02137, 2021.

[5] Hou L, Huang Z, Shang L, Jiang X, Chen X and Liu Q. DynaBERT: Dynamic BERT with Adaptive Width and Depth[J]. arXiv preprint arXiv:2004.04037, 2020.[6] Wu H, Judd P, Zhang X, Isaev M and Micikevicius P. Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation[J]. arXiv preprint arXiv:2004.09602v1, 2020.