大模型技術(shù)實(shí)踐(一)|ChatGLM2-6B基于UCloud UK8S的創(chuàng)新應(yīng)用
近半年來(lái),通過(guò)對(duì)多款主流大語(yǔ)言模型進(jìn)行了調(diào)研,我們針對(duì)其訓(xùn)練方法和模型特點(diǎn)進(jìn)行逐一分析,方便大家更加深入了解和使用大模型。本文將重點(diǎn)分享ChatGLM2-6B基于UCloud云平臺(tái)的UK8S實(shí)踐應(yīng)用。
01各模型結(jié)構(gòu)及特點(diǎn)
自從2017年6月谷歌推出Transformer以來(lái),它已經(jīng)成為自然語(yǔ)言處理領(lǐng)域的重要里程碑和核心模型之一。從2018年至今推出的主流模型GPT、BERT、T5、ChatGLM、LLaMA系列模型,都是以Transformer為基本架構(gòu)實(shí)現(xiàn)的。
BERT
使用了Transformer中Encoder編碼器。
特點(diǎn):
1. 雙向注意力,也就是說(shuō)每個(gè)時(shí)刻的Attention計(jì)算都能夠得到全部時(shí)刻的輸入,可同時(shí)感知上下文。
2. 適合文本理解,但不適合生成任務(wù)。
GPT
使用Transformer中Decoder解碼器。
特點(diǎn):
1. 單向注意力,無(wú)法利用下文信息。
2. 適合文本生成領(lǐng)域。
T5
采用Transformer的Encoder-Decoder結(jié)構(gòu)。
改動(dòng):
1. 移除了層歸一化的偏置項(xiàng)。
2. 將層歸一化放置在殘差路徑之外。
3. 使用了相對(duì)位置編碼,且是加在Encoder中第一個(gè)自注意力的Query和Key乘積之后。
特點(diǎn):
1. 編碼器的注意力是雙向的,解碼器的注意力是單向的,所以可以同時(shí)勝任理解和生成任務(wù)。
2. 參數(shù)量大。
LLaMA
使用Transformer中Decoder解碼器。
改動(dòng):
1. 預(yù)歸一化。對(duì)每個(gè)Transformer子層的輸入進(jìn)行規(guī)范化,而不是對(duì)輸出進(jìn)行規(guī)范化。
2. SwiGLU激活函數(shù)。采用SwiGLU激活函數(shù)替換了ReLU。
3. 旋轉(zhuǎn)嵌入。刪除了絕對(duì)位置嵌入,而在網(wǎng)絡(luò)的每一層增加了旋轉(zhuǎn)位置嵌入。
特點(diǎn):
1. LLaMA-13B比GPT-3(參數(shù)量為175B)小10倍,但在大多數(shù)基準(zhǔn)測(cè)試中都超過(guò)了GPT-3。
2. 沒(méi)有將中文語(yǔ)料加入預(yù)訓(xùn)練,LLaMA在中文上的效果很弱。
ChatGLM
ChatGLM是基于GLM-130B訓(xùn)練得到的對(duì)話(huà)機(jī)器人。GLM使用了一個(gè)單獨(dú)的Transformer。
改動(dòng):
1. 自定義Mask矩陣。
2. 重新排列了層歸一化和殘差連接的順序。
3. 對(duì)于輸出的預(yù)測(cè)標(biāo)記,使用了一個(gè)單獨(dú)的線(xiàn)性層。
4. 將ReLU激活函數(shù)替換為GeLU函數(shù)。
5. 二維位置編碼。
特點(diǎn):
通過(guò)Mask矩陣,GLM把BERT、GPT、T5這3個(gè)模型優(yōu)點(diǎn)結(jié)合起來(lái):
1. 當(dāng)整個(gè)的文本被Mask時(shí),空白填充任務(wù)等價(jià)于無(wú)條件語(yǔ)言生成任務(wù)。
2. 當(dāng)被掩碼的片段長(zhǎng)度為1時(shí),空白填充任務(wù)等價(jià)于掩碼語(yǔ)言建模任務(wù)。
3. 當(dāng)文本1和文本2拼接在一起時(shí),再將文本2掩碼掉,空白填充任務(wù)等價(jià)于有條件語(yǔ)言生成任務(wù)。
隨機(jī)從一個(gè)參數(shù)為3的泊松分布中采樣片段的長(zhǎng)度,直到至少遮蓋了原始Token的15%。然后在文本中隨機(jī)排布填空片段的位置,如Part B所示。另外,Position 1表示的是Mask后的文本中的位置,Position 2表示的是在Mask內(nèi)部的相對(duì)位置。
02訓(xùn)練方法及訓(xùn)練目標(biāo)
各大語(yǔ)言模型的訓(xùn)練基本都是基于大規(guī)模無(wú)標(biāo)簽語(yǔ)料來(lái)訓(xùn)練初始的語(yǔ)言模型,再利用下游任務(wù)的有標(biāo)簽訓(xùn)練語(yǔ)料,進(jìn)行微調(diào)訓(xùn)練。
BERT
BERT使用了Transformer的Encoder作為Block,既參考了ELMo模型的雙向編碼思想,參考了GPT用Transformer作為特征提取器的方法,又參考了 Word2Vec所使用的CBOW方法。
BERT的訓(xùn)練方法
分為兩個(gè)階段,分別是多任務(wù)訓(xùn)練目標(biāo)的預(yù)訓(xùn)練階段和基于有標(biāo)簽語(yǔ)料的微調(diào)階段。
BERT的預(yù)訓(xùn)練目標(biāo)
? 掩碼語(yǔ)言模型:Masked Language Model(MLM),目的是提高模型的語(yǔ)義理解能力,即對(duì)文本進(jìn)行隨機(jī)掩碼,然后預(yù)測(cè)被掩碼的詞。
? 下句預(yù)測(cè):Next Sentence Prediction(NSP),目的是訓(xùn)練句子之間的理解能力,即預(yù)測(cè)輸入語(yǔ)句對(duì)(A,B)中,句子B是否為句子A的下一句。
T5
T5模型采用Transformer的Encoder和Decoder,把各種NLP任務(wù)都視為T(mén)ext-to-Text任務(wù)。
T5的訓(xùn)練方法
同樣采用了預(yù)訓(xùn)練和微調(diào)的訓(xùn)練策略。
T5模型采用了兩個(gè)階段的訓(xùn)練:Encoder-Decoder Pretraining(編碼器-解碼器預(yù)訓(xùn)練)和 Denoising Autoencoder Pretraining(去噪自編碼器預(yù)訓(xùn)練)。
在Encoder-Decoder Pretraining階段,T5模型通過(guò)將輸入序列部分遮蓋(用特殊的占位符替換)然后讓模型預(yù)測(cè)被遮蓋掉的詞或片段。這可以幫助模型學(xué)習(xí)到上下文理解和生成的能力。
在Denoising Autoencoder Pretraining階段,T5模型通過(guò)將輸入序列部分加入噪聲或隨機(jī)置換,然后將模型訓(xùn)練為還原原始輸入序列。這可以增強(qiáng)模型對(duì)輸入的魯棒性和理解能力。
T5的預(yù)訓(xùn)練目標(biāo)
類(lèi)似BERT的MLM。T5中可Mask連續(xù)多個(gè)Token,讓模型預(yù)測(cè)出被Mask掉的Token到底有幾個(gè),并且是什么。
GPT
GPT采用兩階段式訓(xùn)練方法
第一階段:在沒(méi)有標(biāo)注的數(shù)據(jù)集中進(jìn)行預(yù)訓(xùn)練,得到預(yù)訓(xùn)練語(yǔ)言模型。
第二階段:在有標(biāo)注的下游任務(wù)上進(jìn)行微調(diào)。(有監(jiān)督任務(wù)上進(jìn)行了實(shí)驗(yàn),包括自然語(yǔ)言推理、問(wèn)答、語(yǔ)義相似度和文本分類(lèi)等。)
除了常規(guī)的有監(jiān)督微調(diào),引入RLHF(人類(lèi)反饋強(qiáng)化學(xué)習(xí))之后,還需要:
收集數(shù)據(jù)并訓(xùn)練獎(jiǎng)勵(lì)模型。
使用強(qiáng)化學(xué)習(xí)對(duì)語(yǔ)言模型進(jìn)行微調(diào)。
GPT的訓(xùn)練目標(biāo)
是從左到右的文本生成,無(wú)條件生成。
GPT2
在無(wú)Finetune的Zero-Shot場(chǎng)景下進(jìn)行,也就是“無(wú)監(jiān)督,多任務(wù)”。
在原始Input上加入任務(wù)相關(guān)Prompt,無(wú)需微調(diào)也可做任務(wù)。
GPT3
2020年5月模型參數(shù)規(guī)模增加到1750億,大力出奇跡,預(yù)訓(xùn)練后不需要微調(diào)。
提出了In-Context Learning。
2020年9月,GPT3引入RLHF。
2022年3月的OpenAI發(fā)布InstructGPT,也就是GPT3+Instruction Tuning+RLHF+PPO。
GPT4
2023年3月,GPT4支持圖片形式輸入。
LLaMA
訓(xùn)練一系列語(yǔ)言模型,使用的更多的Token進(jìn)行訓(xùn)練,在不同的推理預(yù)算下達(dá)到最佳的性能。
模型參數(shù)包括從7B到65B等多個(gè)版本:
LLaMA的訓(xùn)練方法
無(wú)監(jiān)督預(yù)訓(xùn)練。
有監(jiān)督微調(diào),訓(xùn)練獎(jiǎng)勵(lì)模型,根據(jù)人類(lèi)反饋進(jìn)行強(qiáng)化學(xué)習(xí)。
LLaMA的任務(wù)
零樣本和少樣本任務(wù),并在總共20個(gè)基準(zhǔn)測(cè)試上報(bào)告了結(jié)果:
零樣本。提供任務(wù)的文本描述和一個(gè)測(cè)試示例。模型要么通過(guò)開(kāi)放式生成提供答案,要么對(duì)提出的答案進(jìn)行排名。
少樣本。提供任務(wù)的幾個(gè)示例(1到64個(gè))和一個(gè)測(cè)試示例。模型將這個(gè)文本作為輸入,并生成答案或?qū)Σ煌x項(xiàng)進(jìn)行排名。
LlaMA2相比于LLaMA
1. 支持更長(zhǎng)的上下文,是LLaMA的2倍。
2. 提出Grouped-Query Attention,加速推理。
3. 提出Ghost Attention讓多回合對(duì)話(huà)前后一致。
ChatGLM
對(duì)話(huà)機(jī)器人ChatGLM是基于GLM-130B模型訓(xùn)練得到的。結(jié)合模型量化技術(shù),得到可在普通顯卡部署的ChatGLM-6B。
GLM的預(yù)訓(xùn)練目標(biāo)
文檔級(jí)別的目標(biāo):從原始本文長(zhǎng)度的50%到100%之間均勻分布的范圍中進(jìn)行抽樣,得到片段。該目標(biāo)旨在生成較長(zhǎng)的文本。
句子級(jí)別的目標(biāo):限制被Mask的片段必須是完整的句子。抽樣多個(gè)片段(句子)來(lái)覆蓋原始Tokens的15%。該目標(biāo)旨在用于Seq2seq任務(wù),其中預(yù)測(cè)通常是完整的句子或段落。
ChatGLM的訓(xùn)練方法
無(wú)標(biāo)簽預(yù)訓(xùn)練,有監(jiān)督微調(diào)、反饋?zhàn)灾?、人?lèi)反饋強(qiáng)化學(xué)習(xí)等技術(shù)。
大語(yǔ)言模型小結(jié)
大語(yǔ)言模型的訓(xùn)練方式基本是海量無(wú)標(biāo)簽數(shù)據(jù)預(yù)訓(xùn)練,下游再用有標(biāo)簽數(shù)據(jù)微調(diào)。從GPT3開(kāi)始,ChatGLM、LLaMA系列模型也都引入了基于人類(lèi)反饋的強(qiáng)化學(xué)習(xí),讓模型與人類(lèi)偏好對(duì)齊,這是一個(gè)很酷的想法。
03ChatGLM2-6B在K8S上的實(shí)踐
獲取項(xiàng)目代碼和模型文件,相關(guān)鏈接如下
(https://github.com/THUDM/ChatGLM2-6B/tree/main)。
基于UCloud云平臺(tái)的K8S實(shí)踐
可參照UCloud文檔中心(https://docs.ucloud.cn),登錄UCloud控制臺(tái)(https://console.ucloud.cn/uhost/uhost/create),創(chuàng)建UFS、創(chuàng)建UK8S。
創(chuàng)建文件存儲(chǔ)UFS
先創(chuàng)建文件系統(tǒng),將模型文件存儲(chǔ)到UFS中,之后記得添加掛載點(diǎn)。
這是可選項(xiàng),UFS優(yōu)點(diǎn)是可多節(jié)點(diǎn)掛載。如果不使用UFS,模型文件可放在其他位置,需要在后續(xù)的ufspod.yml文件中做相應(yīng)修改。
創(chuàng)建容器云UK8S
首選創(chuàng)建集群:
可自由選擇Node節(jié)點(diǎn)到配置:
創(chuàng)建好了之后,界面如下:
接下來(lái)可點(diǎn)擊右側(cè)的“詳情”按鈕,在跳轉(zhuǎn)到的新頁(yè)面左側(cè),點(diǎn)擊“外網(wǎng)憑證”對(duì)應(yīng)行的“查看”,可以看到如下圖所示:
根據(jù)提示,保存文本內(nèi)容到~/.kube/config文件中。
在UK8S中的Node節(jié)點(diǎn):
安裝Docker
安裝英偉達(dá)GPU驅(qū)動(dòng)
安裝NVIDIA Container Toolkit
在UK8S中使用UFS
根據(jù)在UK8S中使用UFS(https://docs.ucloud.cn/uk8s/volume/ufs?id=在uk8s中使用ufs)的文檔說(shuō)明,創(chuàng)建PV和PVC。
登錄UK8S的Node節(jié)點(diǎn)
首先參照文檔安裝及配置Kubectl(https://docs.ucloud.cn/uk8s/manageviakubectl/connectviakubectl?id=安裝及配置kubectl)。
1. 先放上配置文件Ufspod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myfrontend
spec:
selector:
matchLabels:
app: myfrontend
replicas: 1
template:
metadata:
labels:
app: myfrontend
spec:
containers:
- name: myfrontend
image: uhub.service.ucloud.cn/yaoxl/chatglm2-6b:y1
volumeMounts:
- mountPath: "/app/models"
name: mypd
ports:
- containerPort: 7861
volumes:
- name: mypd
persistentVolumeClaim:
claimName: ufsclaim
---
apiVersion: v1
kind: Service
metadata:
name: myufsservice
spec:
selector:
app: myfrontend
type: NodePort
ports:
- name: http
protocol: TCP
port: 7861
targetPort: 7861
nodePort: 30619
2. 執(zhí)行配置文件Ufspod.yml
kubectl apply -f ufspod.yml
3. 進(jìn)入Pod
首先通過(guò)命令得到Pod Name:
kubectl get po
#NAME READY STATUS RESTARTS AGE
#myfrontend-5488576cb-b2wqw 1/1 Running 0 83m
在Pod內(nèi)部啟動(dòng)一個(gè)Bash Shell:
kubectl exec -it <pod_name> -- /bin/bash
4. 打開(kāi)網(wǎng)頁(yè)版的Demo
執(zhí)行:
python3 web_demo.py
得到:
UCloud將持續(xù)關(guān)注大語(yǔ)言模型的發(fā)展,并在后續(xù)發(fā)布有關(guān)LlaMA2實(shí)踐、LangChain構(gòu)建云上推理環(huán)境等方面的文章。歡迎大家保持關(guān)注并與我們進(jìn)行更多交流探討!