最近在內部技術分享會上發(fā)現(xiàn)大家對Bert實踐中的問題比較感興趣瞄崇,疑問點主要集中在,Bert機器資源代價昂貴,如何用較小成本(金錢和時間)把Bert跑起來谣拣?因此,希望這篇文章能幫助你在實踐Bert的過程中少走一些彎路族展。
? ? ? ? 整個文章結構分成四部分森缠。
? ? ? ? ? 第一部分Bert代碼速讀,提示Bert代碼中容易忽略的關鍵點仪缸,目的是讓你快速的熟悉代碼并且跑起來
? ? ? ? ? 第二部分總結下我在服務化部署B(yǎng)ert中趟過的一些坑
? ? ? ? ? 第三部分參考資料(同樣有干貨)
? ? ? ? ? 第四部分總結性能和效果贵涵,給出實踐Bert最低成本路徑。
一、Bert代碼速讀
? ? ? ? 這一部分代碼來源是google research 在github上發(fā)布的官網(wǎng)鏈接:google-research/bert講講代碼中容易忽略但是很重要的點宾茂,幫助你在較短時間內實踐Bert瓷马,所要掌握的必要代碼。解析Google research官方發(fā)布的Bert源碼(給出連接)的主要結構跨晴,重點講run_classifier.py欧聘,run_squad.py,modeling.py中模型構建的核心代碼端盆。
? ? ? 1.Bert代碼結構
? 2.兩個微調模型run_classifier.py和run_squad.py的create _model 部分核心代碼怀骤。
3.預訓練模型層modeling.py 中的attention_layer代碼,包含原理圖和代碼解析焕妙。
attention layer原理圖
? ? ? ? 預訓練階段蒋伦,對機器和數(shù)據(jù)量要求高,所幸焚鹊,作者提供了主要語言英語和中文的預訓練模 型痕届,直接下載即可,中文預訓練模型末患。因此研叫,我們重點關注的是,如何構建和利用微調模型實現(xiàn)我們的目標璧针。重點講下作者在源碼中給出的兩個微調模型蓝撇。看完之后陈莽,你可以會驚呼微調模型竟然這么簡單渤昌。用run_classifier.py,整個50萬樣本量走搁,微調階段訓練時間約為半個小時独柑。
? ? ? ? 從代碼中可以看到,run_squad.py和run_classifier.py微調模型是一層簡單的全鏈接層私植,以此類推忌栅,如果你要實現(xiàn)命名實體識別等其他目標任務,可在預訓練的模型基礎上曲稼,加入少了全鏈接層索绪。
二、我趟過的一些坑
1.tensorflow服務化部署的坑贫悄。
? ? ? Tensorflow服務化部署有好幾套接口瑞驱,有版本歷史原因,導致相互之間不兼容窄坦,對用戶來說可謂非常不友好唤反。我這邊提供一個可用的接口方法供參考凳寺。 TensorFlow 模型如何對外提供服務。 微調模型跑出結果模型是checkpoint的文件格式彤侍,需轉化為.pt格式提供出來肠缨。
2.TPU改成GPU estimator
? ? ? 官網(wǎng)源碼中給出的是TPU estimator接口,改成普通estimator接口方案就能跑起來了盏阶。
https://www.tensorflow.org/guide/estimators?www.tensorflow.org
給個示例晒奕,run_classifier.py中關于TPU estimator的修改,直接上代碼吧
(1)main()函數(shù)中estimator定義部分的修改
源代碼中的定義
修改后的定義
(2) model_fn()部分代碼修改名斟,給個train部分的示例吴汪,eval部分同理可得。? ? ? ? ? ? ? ?
源碼
修改后
3.Out of Memory問題
? ? ? ? 官網(wǎng)源碼中Readme.md中有關于Out of Memory解決的方法蒸眠,如果你遇到類似問題,一定要先看這部分文檔杆融。文中意思大概是調節(jié)兩個參數(shù)max_seq_length和train_batch_size楞卡,觀察你GPU顯存的占用情況? 。我使用的GPU顯存28GB脾歇,如果你想把微調模型跑起來蒋腮,這個顯存基本夠了(train_batch_size=64,--max_seq_length=128 顯存占用22GB)
三、參考資料
1.Bert as Service? hanxiao/bert-as-service
圖優(yōu)化方法
? ? ? Bert預訓練模型較為完整的服務化部署方法藕各,預訓練模型可作為NLP基礎服務池摧。源碼中兩個亮點:一是提供了圖優(yōu)化的方法,提升效率和降低顯存消耗激况。Freezed圖凍結把tf.Variable變?yōu)閠f.Constant作彤,Pruned去掉訓練時多余的節(jié)點,Quantized降低浮點數(shù)維度乌逐,比如把int64改為int32竭讳。二是zeromq實現(xiàn)異步并發(fā)請求,設計了一套Bert服務化部署的軟件架構浙踢。
2.參考我的另一篇博文绢慢,關于Bert的原理章魚小丸子:NLP突破性成果 BERT 模型詳細解讀
四、總結
關于Bert的效果洛波,我未做定量分析胰舆,但從個人評估結果來看,其在公開數(shù)據(jù)集的泛化能力蹬挤,明顯優(yōu)于利用詞向量預訓練的QAnet等問答其他模型缚窿。
? ? ? 關于Bert的性能,對服務進行壓力測試焰扳,根據(jù)應用場景滨攻,我調節(jié)的max length=30够话,耗時均值在400ms左右,能滿足一般應用qps要求光绕。如果對運算速度要求更高的產(chǎn)品女嘲,需改為GPU分布式計算。
? ? ? 較低成本實踐Bert的路徑:
? ? ? 第一步:找一臺滿足GPU顯存要求的機器(一般是28GB左右诞帐,不同情況略有不同)
? ? ? 第二步:設置一個你能拿到數(shù)據(jù)集的微調任務欣尼,如分類、問答停蕉、實體標注等愕鼓。
? ? ? 第三步:修改微調代碼跑起來,驗證效果慧起。