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