name_en: GLM-130B: AN OPEN BILINGUAL PRE-TRAINED
name_ch: Glm-130B:開(kāi)放雙語(yǔ)預(yù)訓(xùn)練模型
paper_addr: https://arxiv.org/abs/2210.02414
doi: 10.48550/arXiv.2210.02414
date_read: 2023-03-23
date_publish: 2023-01-01
tags: ['深度學(xué)習(xí)','自然語(yǔ)言處理']
author: Aohan Zeng
code: https://github.com/THUDM/GLM-130B/
citation: 4
讀后感
2022年11月寺酪,斯坦福大學(xué)大模型中心對(duì)全球30個(gè)主流大模型進(jìn)行了全方位的評(píng)測(cè)2秉剑,GLM-130B 是亞洲唯一入選的大模型。 GLM-130B 在準(zhǔn)確性和惡意性指標(biāo)上與 GPT-3 175B (davinci) 接近或持平杭隙。
ChatGLM最大的優(yōu)點(diǎn)是開(kāi)源廊敌,并針對(duì)中文進(jìn)行了優(yōu)化铜跑,尤其是可以在自己的機(jī)器上搭建其簡(jiǎn)版的int4服務(wù),實(shí)測(cè)回答一般性問(wèn)題效果還不錯(cuò)骡澈,文后附環(huán)境搭建方法锅纺。
摘要
ChatGLM是使用中英雙語(yǔ)預(yù)訓(xùn)練的大語(yǔ)言模型,具有130B參數(shù)(1300億)肋殴,使用400B token訓(xùn)練囤锉。
在模型結(jié)構(gòu)上結(jié)合了GPT和BERT。在英文方面疼电,效果優(yōu)于GPT-3嚼锄;在中文方面,優(yōu)于260B參數(shù)的ERNIE TITAN 3.0蔽豺∏螅可在4×RTX 3090 (24G) 或 8×RTX 2080 Ti (11G) GPUs 環(huán)境下運(yùn)行。
介紹
論文提出:通用語(yǔ)言模型General Language Model (GLM) 修陡,主要使用的技術(shù)是:雙向注意力和自回歸空白填充目標(biāo)沧侥。嵌入梯度收縮策略可以顯著提升GLM - 130B的訓(xùn)練穩(wěn)定性。
方法
結(jié)構(gòu)
GLM架構(gòu)
與GPT魄鸦,PaLM等模型使用Transformer的解碼器方式不同宴杀,GLM-130B使用了一種雙向通用語(yǔ)言模型(GLM)作為其Backbone。模型結(jié)構(gòu)詳見(jiàn)論文:Glm: General language model pretraining with autoregressive blank infilling (2022).
GLM是一種基于Transformer的語(yǔ)言模型拾因,它以自回歸空白填充為訓(xùn)練目標(biāo)旺罢。簡(jiǎn)而言之,對(duì)于一個(gè)文本序列x=[x1, · · · ,xn]
绢记,從其中采樣文本span{s1扁达,· · ·,sm}
蠢熄,其中每個(gè)si表示連續(xù)令牌的跨度跪解,并用單個(gè)掩碼替換si,要求模型對(duì)它們進(jìn)行自回歸恢復(fù)签孔。與GPT類模型不同的是叉讥,它在不Mask的位置使用雙向注意力窘行,因此它混合了兩種Mask,以支持理解和生成:
[MASK]:句子中的短空白图仓,長(zhǎng)度加總到輸入的某一部分
[gMASK]:隨機(jī)長(zhǎng)度的長(zhǎng)空白罐盔,加在提供前綴上下文的句子末尾
理論上,雙向注意力的空白填充目標(biāo)比GPT風(fēng)格的模型能夠更有效地理解語(yǔ)境:當(dāng)使用 MASK 時(shí)透绩,GLM- 130B表現(xiàn)類似BERT和T5翘骂;當(dāng)使用 gMASK 時(shí)壁熄,GLM - 130B表現(xiàn)出與 PrefixLM 相似的性質(zhì)帚豪。
GLM - 130B在零樣本LAMBADA上取得了80.2 %的高準(zhǔn)確率,優(yōu)于圖2中的GPT - 3和PaLM 540B草丧。
歸一化方法
歸一化有助于提升模型訓(xùn)練的穩(wěn)定性狸臣,文中使用了2022年提出的DeepNorm方法(詳見(jiàn)論文 :Deepnet: Scaling transformers to 1,000 layers),其公式為:
其中N為層數(shù)昌执。此方法有效地提升了訓(xùn)練穩(wěn)定性烛亦。
位置編碼和前饋網(wǎng)絡(luò)
對(duì)于GLM - 130B中的位置編碼采用旋轉(zhuǎn)位置編碼(RoPE),并選擇GeLU激活函數(shù)以優(yōu)化FFN懂拾。
訓(xùn)練設(shè)置
GLM - 130B預(yù)訓(xùn)練目標(biāo)不僅包括自監(jiān)督的GLM自回歸空白填充煤禽,還包括對(duì)小部分token的多任務(wù)學(xué)習(xí),以提升其下游zero-shot任務(wù)的性能岖赋。
自監(jiān)督空白填充(95%)
同時(shí)使用了 MASK 和 gMASK檬果,每個(gè)序列使用其中一種。具體來(lái)說(shuō)唐断,MASK用于在30 %的訓(xùn)練序列中掩蓋連續(xù)的Token以進(jìn)行空白填充选脊。對(duì)于其他70%的序列,保留每個(gè)序列的前綴作為上下文脸甘,并使用gMASK來(lái)掩蓋其余序列訓(xùn)練恳啥。
預(yù)訓(xùn)練數(shù)據(jù)包括1.2 T英語(yǔ)、1.0 T的中文悟道語(yǔ)料庫(kù)丹诀,以及從網(wǎng)絡(luò)爬取的250G中文語(yǔ)料庫(kù)(包括在線論壇钝的、百科全書(shū)和QA),形成了平衡的英漢內(nèi)容構(gòu)成铆遭。
多任務(wù)指導(dǎo)預(yù)訓(xùn)練(MIP硝桩,5%)
預(yù)訓(xùn)練中加入包括語(yǔ)言理解、生成和信息提取在內(nèi)的多種指令提示數(shù)據(jù)集訓(xùn)練模型疚脐。
并行訓(xùn)練和模型配置
在96個(gè)DGX - A100 GPU ( 8 × 40G )服務(wù)器集群上進(jìn)行了60天的訓(xùn)練亿柑。將pipline模型并行與其他兩種策略結(jié)合形成了3D并行策略。
模型訓(xùn)練的穩(wěn)定性
需要在精度和穩(wěn)定間保持平衡棍弄,低精度的FP格式提高了計(jì)算效率望薄,但容易出現(xiàn)溢出錯(cuò)誤疟游,導(dǎo)致訓(xùn)練崩潰。
混合精度
FP16用于前向和后向痕支,F(xiàn)P32用于優(yōu)化器狀態(tài)和主權(quán)重颁虐,以減少GPU內(nèi)存使用,提高訓(xùn)練效率卧须。
嵌入層梯度收縮
實(shí)驗(yàn)表明另绩,梯度范數(shù)可以作為訓(xùn)練崩潰的信息指標(biāo)。具體來(lái)說(shuō)花嘶,訓(xùn)練崩潰通常滯后于梯度范數(shù)中的"尖峰"幾個(gè)訓(xùn)練步笋籽。發(fā)現(xiàn)嵌入層的梯度收縮可以克服損失尖峰,從而穩(wěn)定GLM - 130B的訓(xùn)練椭员。
在 Rtx 2080 TI 上使用模型推理
在保持FP16激活精度的同時(shí)车海,重點(diǎn)關(guān)注模型權(quán)重的量化。量化后的模型在運(yùn)行時(shí)動(dòng)態(tài)轉(zhuǎn)換為FP16精度隘击,引入了較小的計(jì)算開(kāi)銷侍芝,大大降低了存儲(chǔ)模型權(quán)重的GPU內(nèi)存使用量。文中成功地實(shí)現(xiàn)了GLM - 130B的INT4權(quán)重量化埋同,目前模型已發(fā)布州叠,可下載使用。
實(shí)驗(yàn)
與英文模型比較:
與中文模型比較:
實(shí)戰(zhàn)——環(huán)境搭建
ChatGLM-6B 是一個(gè)具有62億參數(shù)的中英雙語(yǔ)語(yǔ)言模型凶赁,由大模型量化后得到咧栗,代碼+模型一共只有幾個(gè)G大小。
下載代碼和模型
由于我家機(jī)器性能有限哟冬,就下載了int4模型楼熄,約占空間5G左右,運(yùn)行時(shí)占GPU內(nèi)存5G左右浩峡。
$ git clone https://github.com/THUDM/ChatGLM-6B
$ git clone https://huggingface.co/THUDM/chatglm-6b-int4/
在網(wǎng)站 https://huggingface.co/THUDM/chatglm-6b-int4/tree/main 中下載:
ice_text.model 和 pytorch_model.bin 兩個(gè)大文件可岂,替換git中的文件。
下載運(yùn)行環(huán)境鏡像
如果使用docker啟動(dòng)翰灾,推薦鏡像:
$ docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime
啟動(dòng)鏡像
$ nvidia-docker run -e "LC_ALL=zh_CN.UTF-8" -e "LANGUAGE=zh_CN.UTF-8" -e "LANG=zh_CN.UTF-8" -p 7860:7860 --rm -v /exports:/workspace/exports -it pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime bash
調(diào)整代碼
修改web_demo.py
- 修改模型名為指定目錄:
tokenizer = AutoTokenizer.from_pretrained("../chatglm-6b-int4/", trust_remote_code=True)
model = AutoModel.from_pretrained("../chatglm-6b-int4/", trust_remote_code=True).half().cuda()
- 設(shè)置server_name為0.0.0.0缕粹,以便服務(wù)在docker外部調(diào)用
demo.queue().launch(share=False, inbrowser=True, server_name="0.0.0.0")
運(yùn)行服務(wù)
在鏡像內(nèi)部運(yùn)行
$ cd ChatGLM-6B/
$ pip install -r requirements.txt
$ python web_demo.py
啟動(dòng)服務(wù)后,就可以在宿主機(jī)瀏覽器中通過(guò)端口7860訪問(wèn)纸淮,效果如下:
個(gè)人覺(jué)得速度還挺快的平斩,回答效果也還行。