隨著ChatGPT的迅速出圈,加速了大模型時代的變革。對于以Transformer、MOE結(jié)構(gòu)為代表的大模型來說,傳統(tǒng)的單機(jī)單卡訓(xùn)練模式肯定不能滿足上千(萬)億級參數(shù)的模型訓(xùn)練,這時候我們就需要解決內(nèi)存墻和通信墻等一系列問題,在單機(jī)多卡或者多機(jī)多卡進(jìn)行模型訓(xùn)練。
最近一段時間,我也在探索大模型相關(guān)的一些技術(shù),下面做一個簡單的總結(jié)。
大模型實(shí)踐文章
下面是最近大模型實(shí)踐過程中的一些文章,配套代碼放置在GitHub:llm-action
LLM訓(xùn)練:
| LLM | 預(yù)訓(xùn)練/微調(diào)/RLHF... | 參數(shù) | 教程 | 代碼 |
|---|---|---|---|---|
| Alpaca | full fine-turning | 7B | 從0到1復(fù)現(xiàn)斯坦福羊駝(Stanford Alpaca 7B) | N/A |
| Alpaca | lora | 7B | 1. 足夠驚艷,使用Alpaca-Lora基于LLaMA(7B)二十分鐘完成微調(diào),效果比肩斯坦福羊駝 2. 使用 LoRA 技術(shù)對 LLaMA 65B 大模型進(jìn)行微調(diào)及推理 |
配套代碼 |
| BELLE(LLaMA-7B/Bloomz-7B1-mt) | full fine-turning | 7B | 1. 基于LLaMA-7B/Bloomz-7B1-mt復(fù)現(xiàn)開源中文對話大模型BELLE及GPTQ量化 2. BELLE(LLaMA-7B/Bloomz-7B1-mt)大模型使用GPTQ量化后推理性能測試 |
N/A |
| ChatGLM | lora | 6B | 從0到1基于ChatGLM-6B使用LoRA進(jìn)行參數(shù)高效微調(diào) | N/A |
| ChatGLM | full fine-turning/P-Tuning v2 | 6B | 使用DeepSpeed/P-Tuning v2對ChatGLM-6B進(jìn)行微調(diào) | N/A |
| Vicuna | full fine-turning | 7B | 大模型也內(nèi)卷,Vicuna訓(xùn)練及推理指南,效果碾壓斯坦福羊駝 | N/A |
| OPT | RLHF | N/A | 1. 一鍵式 RLHF 訓(xùn)練 DeepSpeed Chat(一):理論篇 2. 一鍵式 RLHF 訓(xùn)練 DeepSpeed Chat(二):實(shí)踐篇 |
N/A |
| MiniGPT-4 | full fine-turning | 7B | 大殺器,多模態(tài)大模型MiniGPT-4入坑指南 | N/A |
| Chinese-LLaMA-Alpaca | lora(預(yù)訓(xùn)練+微調(diào)) | 7B | 使用 LoRA 技術(shù)對 LLaMA 65B 大模型進(jìn)行微調(diào)及推理 | 配套代碼 |
LLM推理:
- 大模型的好伙伴,淺析推理加速引擎FasterTransformer
- 模型推理服務(wù)化框架Triton保姆式教程(一):快速入門
- 模型推理服務(wù)化框架Triton保姆式教程(二):架構(gòu)解析
- 模型推理服務(wù)化框架Triton保姆式教程(三):開發(fā)實(shí)踐
LLM微調(diào)技術(shù):
對于普通大眾來說,進(jìn)行大模型的預(yù)訓(xùn)練或者全量微調(diào)遙不可及。由此,催生了各種參數(shù)高效微調(diào)技術(shù),讓科研人員或者普通開發(fā)者有機(jī)會嘗試微調(diào)大模型。
因此,該技術(shù)值得我們進(jìn)行深入分析其背后的機(jī)理,本系列大體分七篇文章進(jìn)行講解。
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(一)-背景、參數(shù)高效微調(diào)簡介
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(二)-BitFit、Prefix Tuning、Prompt Tuning
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(三)-P-Tuning、P-Tuning v2
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(四)-Adapter Tuning及其變體
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(五)-LoRA、AdaLoRA、QLoRA
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(六)-MAM Adapter、UniPELT
- 大模型參數(shù)高效微調(diào)技術(shù)原理綜述(七)-最佳實(shí)踐、總結(jié)
GPU集群
由于目前只有3臺A800 GPU服務(wù)器(共24卡)?;谀壳艾F(xiàn)有的一些AI框架和大模型,無法充分利用3臺服務(wù)器。比如:OPT-66B一共有64層Transformer,當(dāng)使用Alpa進(jìn)行流水線并行時,通過流水線并行對模型進(jìn)行切分,要么使用16卡,要么使用8卡,沒法直接使用24卡,因此,GPU服務(wù)器最好是購買偶數(shù)臺(如:2臺、4臺、8臺)。
具體的硬件配置如下:
- CPUs: 每個節(jié)點(diǎn)具有 1TB 內(nèi)存的 Intel CPU,物理CPU個數(shù)為64,每顆CPU核數(shù)為16。
- GPUs: 24 卡 A800 80GB GPUs ,每個節(jié)點(diǎn) 8 個 GPU(3 個節(jié)點(diǎn))。
目前使用Huggingface Transformers和DeepSpeed進(jìn)行通過數(shù)據(jù)并行進(jìn)行訓(xùn)練(pretrain),單卡可以跑三百億參數(shù)(啟用ZeRO-2或ZeRO-3),如OPT-30B,具體訓(xùn)練教程參考官方樣例。
使用Alpa進(jìn)行流水線并行和數(shù)據(jù)并行進(jìn)行訓(xùn)練(fine tuning)時,使用了3臺共24卡(PP:12,DP:2)進(jìn)行訓(xùn)練OPT-30B,具體訓(xùn)練教程參考官方樣例。但是進(jìn)行模型訓(xùn)練之前需要先進(jìn)行模型格式轉(zhuǎn)換,將HF格式轉(zhuǎn)換為Alpa格式的模型文件,具體請參考官方代碼。如果不想轉(zhuǎn)換,官網(wǎng)也提供了轉(zhuǎn)換好的模型格式,具體請參考文檔:Serving OPT-175B, BLOOM-176B and CodeGen-16B using Alpa。
[圖片上傳失敗...(image-f17581-1686831126733)]
大模型算法
模型結(jié)構(gòu):
目前主流的大模型都是Transformer、MOE結(jié)構(gòu)為基礎(chǔ)進(jìn)行構(gòu)建,如果說Transformer結(jié)構(gòu)使得模型突破到上億參數(shù)量,MoE 稀疏混合專家結(jié)構(gòu)使模型參數(shù)量產(chǎn)生進(jìn)一步突破,達(dá)到數(shù)萬億規(guī)模。
大模型算法:
下圖詳細(xì)展示了AI大模型的發(fā)展歷程:
[圖片上傳失敗...(image-3b8688-1686831126734)]
可以說,Transformer 開創(chuàng)了繼 MLP 、CNN和 RNN之后的第四大類模型。而基于Transformer結(jié)構(gòu)的模型又可以分為Encoder-only、Decoder-only、Encoder-Decoder這三類。
- 僅編碼器架構(gòu)(Encoder-only):自編碼模型(破壞一個句子,然后讓模型去預(yù)測或填補(bǔ)),更擅長理解類的任務(wù),例如:文本分類、實(shí)體識別、關(guān)鍵信息抽取等。典型代表有:Bert、RoBERTa等。
- 僅解碼器架構(gòu)(Decoder-only):自回歸模型(將解碼器自己當(dāng)前步的輸出加入下一步的輸入,解碼器融合所有已經(jīng)輸入的向量來輸出下一個向量,所以越往后的輸出考慮了更多輸入),更擅長生成類的任務(wù),例如:文本生成。典型代表有:GPT系列、LLaMA、OPT、Bloom等。
- 編碼器-解碼器架構(gòu)(Encoder-Decoder):序列到序列模型(編碼器的輸出作為解碼器的輸入),主要用于基于條件的生成任務(wù),例如:翻譯,概要等。典型代表有:T5、BART、GLM等。
大語言模型
目前業(yè)界可以下載到的一些大語言模型:
- ChatGLM-6B :中英雙語的對話語言模型。
- GLM-10B/130B :雙語(中文和英文)雙向稠密模型。
- OPT-2.7B/13B/30B/66B :Meta開源的預(yù)訓(xùn)練語言模型。
- LLaMA-7B/13B/30B/65B :Meta開源的基礎(chǔ)大語言模型。
- Alpaca(LLaMA-7B):斯坦福提出的一個強(qiáng)大的可復(fù)現(xiàn)的指令跟隨模型,種子任務(wù)都是英語,收集的數(shù)據(jù)也都是英文,因此訓(xùn)練出來的模型未對中文優(yōu)化。
- BELLE(BLOOMZ-7B/LLaMA-7B/LLaMA-13B):本項(xiàng)目基于 Stanford Alpaca,針對中文做了優(yōu)化,模型調(diào)優(yōu)僅使用由ChatGPT生產(chǎn)的數(shù)據(jù)(不包含任何其他數(shù)據(jù))。
- Bloom-7B/13B/176B:可以處理46 種語言,包括法語、漢語、越南語、印度尼西亞語、加泰羅尼亞語、13 種印度語言(如印地語)和 20 種非洲語言。其中,Bloomz系列模型是基于 xP3 數(shù)據(jù)集微調(diào)。 推薦用于英語的提示(prompting);Bloomz-mt系列模型是基于 xP3mt 數(shù)據(jù)集微調(diào)。推薦用于非英語的提示(prompting)。
- Vicuna(7B/13B):由UC Berkeley、CMU、Stanford和 UC San Diego的研究人員創(chuàng)建的 Vicuna-13B,通過在 ShareGPT 收集的用戶共享對話數(shù)據(jù)中微調(diào) LLaMA 獲得。其中,使用 GPT-4 進(jìn)行評估,發(fā)現(xiàn) Vicuna-13B 的性能在超過90%的情況下實(shí)現(xiàn)了與ChatGPT和Bard相匹敵的能力;同時,在 90% 情況下都優(yōu)于 LLaMA 和 Alpaca 等其他模型。而訓(xùn)練 Vicuna-13B 的費(fèi)用約為 300 美元。不僅如此,它還提供了一個用于訓(xùn)練、服務(wù)和評估基于大語言模型的聊天機(jī)器人的開放平臺:FastChat。
- Baize:白澤是在LLaMA上訓(xùn)練的。目前包括四種英語模型:白澤-7B、13B 、 30B(通用對話模型)以及一個垂直領(lǐng)域的白澤-醫(yī)療模型,供研究 / 非商業(yè)用途使用,并計(jì)劃在未來發(fā)布中文的白澤模型。白澤的數(shù)據(jù)處理、訓(xùn)練模型、Demo 等全部代碼已經(jīng)開源。
-
LLMZoo:來自香港中文大學(xué)和深圳市大數(shù)據(jù)研究院團(tuán)隊(duì)推出的一系列大模型,如:Phoenix(鳳凰) 和 Chimera等。
-MOSS:由復(fù)旦 NLP 團(tuán)隊(duì)推出的 MOSS 大語言模型。
20230325(當(dāng)時官方還未開源訓(xùn)練代碼,目前直接基于官方的訓(xùn)練代碼即可):
前兩天測試了BELLE,對中文的效果感覺還不錯。具體的模型訓(xùn)練(預(yù)訓(xùn)練)方法可參考Hugingface Transformers的樣例,SFT(指令精調(diào))方法可參考Alpaca的訓(xùn)練代碼。
從上面可以看到,開源的大語言模型主要有三大類:GLM衍生的大模型(wenda、ChatSQL等)、LLaMA衍生的大模型(Alpaca、Vicuna、BELLE、Phoenix、Chimera等)、Bloom衍生的大模型(Bloomz、BELLE、Phoenix等)。
| 模型 | 訓(xùn)練數(shù)據(jù)量 | 模型參數(shù) | 訓(xùn)練數(shù)據(jù)范圍 | 詞表大小 |
|---|---|---|---|---|
| LLaMA | 1T~1.4T tokens(其中,7B/13B使用1T,33B/65B使用1.4T) | 7B~65B | 以英語為主要語言的拉丁語系 | 32000 |
| ChatGLM-6B | 約 1T tokens | 6B | 中文、英語 | 130528 |
| Bloom | 1.6TB預(yù)處理文本,轉(zhuǎn)換為 350B 唯一 tokens | 300M~176B | 46種自然語言,13種編程語言 | 250680 |
從表格中可以看到,對于像ChatGLM-6B、LLaMA、Bloom這類大模型,要保證基座模型有比較好的效果,至少需要保證上千億、萬億級的Token量。
目前來看,LLaMA無疑是其中最閃亮的星。但是國內(nèi)關(guān)于LLaMA比較大的一個爭論就是LLaMA是以英語為主要語言的拉丁語系上進(jìn)行訓(xùn)練的,LLaMA詞表中的中文token比較少(只有幾百個),需不需要擴(kuò)充詞表?如果不擴(kuò)充詞表,中文效果會不會比較差?
- 如果不擴(kuò)充詞表,對于中文效果怎么樣?根據(jù)Vicuna官方的報告,經(jīng)過Instruction Turing的Vicuna-13B已經(jīng)有非常好的中文能力。
- LLaMA需不需要擴(kuò)充詞表?根據(jù)Chinese-LLaMA-Alpaca和BELLE的報告,擴(kuò)充中文詞表,可以提升中文編解碼效率以及模型的性能。但是擴(kuò)詞表,相當(dāng)于從頭初始化開始訓(xùn)練這些參數(shù)。如果想達(dá)到比較好的性能,需要比較大的算力和數(shù)據(jù)量。同時,Chinese-LLaMA-Alpaca也指出在進(jìn)行第一階段預(yù)訓(xùn)練(凍結(jié)transformer參數(shù),僅訓(xùn)練embedding,在盡量不干擾原模型的情況下適配新增的中文詞向量)時,模型收斂速度較慢。如果不是有特別充裕的時間和計(jì)算資源,建議跳過該階段。因此,雖然擴(kuò)詞表看起來很誘人,但是實(shí)際操作起來,還是很有難度的。
下面是BELLE針對是否擴(kuò)充詞表,數(shù)據(jù)質(zhì)量、數(shù)據(jù)語言分布、數(shù)據(jù)規(guī)模對于模型性能的對比:
[圖片上傳失敗...(image-814abe-1686831126734)]
其中,BELLE-0.5M-CLEAN是從230萬指令數(shù)據(jù)中清洗得到0.5M數(shù)據(jù)(包含單輪和多輪對話數(shù)據(jù))。LLaMA-7B-EXT是針對LLaMA做了中文詞表擴(kuò)充的預(yù)訓(xùn)練模型。
下面是Chinese-LLaMA-Alpaca針對中文Alpaca-13B、中文Alpaca-Plus-7B、中文Alpaca-Plus-13B的效果對比:
[圖片上傳失敗...(image-6602ff-1686831126734)]
其中,Plus系列Alpaca是在原版LLaMA的基礎(chǔ)上擴(kuò)充了中文詞表,使用了120G中文通用純文本數(shù)據(jù)進(jìn)行二次預(yù)訓(xùn)練。
因此,如果既想要中文詞表,又沒有很大的算力,那建議直接使用ChatGLM-6B或者使用BELLE和Chinese-LLaMA-Alpaca進(jìn)行中文詞表擴(kuò)充后訓(xùn)練好的模型作為Base模型。
多模態(tài)大模型
目前業(yè)界可以下載到的一些多模態(tài)大模型:
- MiniGPT-4:沙特阿拉伯阿卜杜拉國王科技大學(xué)的研究團(tuán)隊(duì)開源。
- LLaVA:由威斯康星大學(xué)麥迪遜分校,微軟研究院和哥倫比亞大學(xué)共同出品。
- VisualGLM-6B:開源的,支持圖像、中文和英文的多模態(tài)對話語言模型,語言模型基于 ChatGLM-6B,具有 62 億參數(shù);圖像部分通過訓(xùn)練 BLIP2-Qformer 構(gòu)建起視覺模型與語言模型的橋梁,整體模型共78億參數(shù)。
分布式并行及顯存優(yōu)化技術(shù)
并行技術(shù):
- 數(shù)據(jù)并行(如:PyTorch DDP)
- 模型/張量并行(如:Megatron-LM(1D)、Colossal-AI(2D、2.5D、3D))
- 流水線并行(如:GPipe、PipeDream、PipeDream-2BW、PipeDream Flush(1F1B))
- 多維混合并行(如:3D并行(數(shù)據(jù)并行、模型并行、流水線并行))
- 自動并行(如:Alpa(自動算子內(nèi)/算子間并行))
- 優(yōu)化器相關(guān)的并行(如:ZeRO(零冗余優(yōu)化器,在執(zhí)行的邏輯上是數(shù)據(jù)并行,但可以達(dá)到模型并行的顯存優(yōu)化效果)、PyTorch FSDP)
顯存優(yōu)化技術(shù):
- 重計(jì)算(Recomputation):Activation checkpointing(Gradient checkpointing),本質(zhì)上是一種用時間換空間的策略。
- 卸載(Offload)技術(shù):一種用通信換顯存的方法,簡單來說就是讓模型參數(shù)、激活值等在CPU內(nèi)存和GPU顯存之間左右橫跳。如:ZeRO-Offload、ZeRO-Infinity等。
- 混合精度(BF16/FP16):降低訓(xùn)練顯存的消耗,還能將訓(xùn)練速度提升2-4倍。
- BF16 計(jì)算時可避免計(jì)算溢出,出現(xiàn)Inf case。
- FP16 在輸入數(shù)據(jù)超過65506 時,計(jì)算結(jié)果溢出,出現(xiàn)Inf case。
分布式訓(xùn)練框架
如何選擇一款分布式訓(xùn)練框架?
- 訓(xùn)練成本:不同的訓(xùn)練工具,訓(xùn)練同樣的大模型,成本是不一樣的。對于大模型,訓(xùn)練一次動輒上百萬/千萬美元的費(fèi)用。合適的成本始終是正確的選擇。
- 訓(xùn)練類型:是否支持?jǐn)?shù)據(jù)并行、張量并行、流水線并行、多維混合并行、自動并行等
- 效率:將普通模型訓(xùn)練代碼變?yōu)榉植际接?xùn)練所需編寫代碼的行數(shù),我們希望越少越好。
- 靈活性:你選擇的框架是否可以跨不同平臺使用?
常見的分布式訓(xùn)練框架:
- 第一類:深度學(xué)習(xí)框架自帶的分布式訓(xùn)練功能。如:TensorFlow、PyTorch、MindSpore、Oneflow、PaddlePaddle等。
- 第二類:基于現(xiàn)有的深度學(xué)習(xí)框架(如:PyTorch、Flax)進(jìn)行擴(kuò)展和優(yōu)化,從而進(jìn)行分布式訓(xùn)練。如:Megatron-LM(張量并行)、DeepSpeed(Zero-DP)、Colossal-AI(高維模型并行,如2D、2.5D、3D)、Alpa(自動并行)等
目前訓(xùn)練超大規(guī)模語言模型主要有兩條技術(shù)路線:
- TPU + XLA + TensorFlow/JAX :由Google主導(dǎo),由于TPU和自家云平臺GCP深度綁定
- GPU + PyTorch + Megatron-LM + DeepSpeed :由NVIDIA、Meta、MicroSoft大廠加持,社區(qū)氛圍活躍,也更受到大家歡迎。
參數(shù)高效微調(diào)(PEFT)技術(shù)
在面對特定的下游任務(wù)時,如果進(jìn)行Full FineTuning(即對預(yù)訓(xùn)練模型中的所有參數(shù)都進(jìn)行微調(diào)),太過低效;而如果采用固定預(yù)訓(xùn)練模型的某些層,只微調(diào)接近下游任務(wù)的那幾層參數(shù),又難以達(dá)到較好的效果。
PEFT技術(shù)旨在通過最小化微調(diào)參數(shù)的數(shù)量和計(jì)算復(fù)雜度,來提高預(yù)訓(xùn)練模型在新任務(wù)上的性能,從而緩解大型預(yù)訓(xùn)練模型的訓(xùn)練成本。這樣一來,即使計(jì)算資源受限,也可以利用預(yù)訓(xùn)練模型的知識來迅速適應(yīng)新任務(wù),實(shí)現(xiàn)高效的遷移學(xué)習(xí)。因此,PEFT技術(shù)可以在提高模型效果的同時,大大縮短模型訓(xùn)練時間和計(jì)算成本,讓更多人能夠參與到深度學(xué)習(xí)研究中來。
-
Prefix Tuning:與full fine-tuning更新所有參數(shù)的方式不同,該方法是在輸入token之前構(gòu)造一段任務(wù)相關(guān)的virtual tokens作為Prefix,然后訓(xùn)練的時候只更新Prefix部分的參數(shù),而Transformer中的其他部分參數(shù)固定。該方法其實(shí)和構(gòu)造Prompt類似,只是Prompt是人為構(gòu)造的“顯式”的提示,并且無法更新參數(shù),而Prefix則是可以學(xué)習(xí)的“隱式”的提示。
同時,為了防止直接更新Prefix的參數(shù)導(dǎo)致訓(xùn)練不穩(wěn)定的情況,他們在Prefix層前面加了MLP結(jié)構(gòu)(相當(dāng)于將Prefix分解為更小維度的Input與MLP的組合后輸出的結(jié)果),訓(xùn)練完成后,只保留Prefix的參數(shù)。 - Prompt Tuning:該方法可以看作是Prefix Tuning的簡化版本,只在輸入層加入prompt tokens,并不需要加入MLP進(jìn)行調(diào)整來解決難訓(xùn)練的問題。隨著預(yù)訓(xùn)練模型參數(shù)量的增加,Prompt Tuning的方法會逼近fine-tuning的結(jié)果。
- P-Tuning:該方法的提出主要是為了解決這樣一個問題:大模型的Prompt構(gòu)造方式嚴(yán)重影響下游任務(wù)的效果。P-Tuning將Prompt轉(zhuǎn)換為可以學(xué)習(xí)的Embedding層,并用MLP+LSTM的方式來對prompt embedding進(jìn)行一層處理。
-
P-Tuning v2:讓Prompt Tuning能夠在不同參數(shù)規(guī)模的預(yù)訓(xùn)練模型、針對不同下游任務(wù)的結(jié)果上都達(dá)到匹敵Fine-tuning的結(jié)果。相比Prompt Tuning和P-tuning的方法,P-Tuning v2方法在多層加入了Prompts tokens作為輸入,帶來兩個方面的好處:
- 帶來更多可學(xué)習(xí)的參數(shù)(從P-tuning和Prompt Tuning的0.1%增加到0.1%-3%),同時也足夠參數(shù)高效。
- 加入到更深層結(jié)構(gòu)中的Prompt能給模型預(yù)測帶來更直接的影響。
- Adapter Tuning:該方法設(shè)計(jì)了Adapter結(jié)構(gòu)(首先是一個down-project層將高維度特征映射到低維特征,然后過一個非線形層之后,再用一個up-project結(jié)構(gòu)將低維特征映射回原來的高維特征;同時也設(shè)計(jì)了skip-connection結(jié)構(gòu),確保了在最差的情況下能夠退化為identity),并將其嵌入Transformer的結(jié)構(gòu)里面,在訓(xùn)練時,固定住原來預(yù)訓(xùn)練模型的參數(shù)不變,只對新增的Adapter結(jié)構(gòu)進(jìn)行微調(diào)。同時為了保證訓(xùn)練的高效性(也就是盡可能少的引入更多參數(shù))。
- LoRA:在涉及到矩陣相乘的模塊,引入A、B這樣兩個低秩矩陣模塊去模擬full fine-tuning的過程,相當(dāng)于只對語言模型中起關(guān)鍵作用的低秩本質(zhì)維度進(jìn)行更新。
典型應(yīng)用:
- ChatGLM-Tuning :一種平價的chatgpt實(shí)現(xiàn)方案,基于清華的 ChatGLM-6B + LoRA 進(jìn)行finetune。
- Alpaca-Lora:使用低秩自適應(yīng)(LoRA)復(fù)現(xiàn)斯坦福羊駝的結(jié)果。Stanford Alpaca 是在 LLaMA 整個模型上微調(diào),而 Alpaca-Lora 則是利用 Lora 技術(shù),在凍結(jié)原模型 LLaMA 參數(shù)的情況下,通過往模型中加入額外的網(wǎng)絡(luò)層,并只訓(xùn)練這些新增的網(wǎng)絡(luò)層參數(shù)。由于這些新增參數(shù)數(shù)量較少,這樣不僅微調(diào)的成本顯著下降,還能獲得和全模型微調(diào)類似的效果。
- BLOOM-LORA:由于LLaMA的限制,我們嘗試使用Alpaca-Lora重新實(shí)現(xiàn)BLOOM-LoRA。
PEFT實(shí)現(xiàn):
- PEFT:Huggingface推出的PEFT庫。
- unify-parameter-efficient-tuning:一個參數(shù)高效遷移學(xué)習(xí)的統(tǒng)一框架。
高效微調(diào)技術(shù)目前存在的兩個問題:
相比全參數(shù)微調(diào),高效微調(diào)技術(shù)目前存在的兩個問題:
- 推理速度會變慢
- 模型精度會變差
影響大模型性能的主要因素
OpenAI的論文Scaling Laws for Neural Language Models中列舉了影響模型性能最大的三個因素:計(jì)算量、數(shù)據(jù)集大小、模型參數(shù)量。也就是說,當(dāng)其他因素不成為瓶頸時,計(jì)算量、數(shù)據(jù)集大小、模型參數(shù)量這3個因素中的單個因素指數(shù)增加時,loss會線性的下降。
除了以上的因素之外,還有一個比較大的影響因素就是數(shù)據(jù)質(zhì)量。在微軟的論文Instruction Tuning with GPT-4中指出,同樣基于LLaMA模型,使用GPT3和GPT4產(chǎn)生的數(shù)據(jù),對模型進(jìn)行Instruction Turing,可以看到GPT4的數(shù)據(jù)微調(diào)過的模型效果遠(yuǎn)遠(yuǎn)好于GPT3數(shù)據(jù)微調(diào)的模型,可見數(shù)據(jù)質(zhì)量帶來的影響。同樣的,Vicuna(7B/13B)的Instruction Turing中,也對shareGPT的數(shù)據(jù)做了很細(xì)致的清洗工作。
衡量大模型水平
要評估一個大型語言模型的水平,可以從以下幾個維度提出具有代表性的問題。
- 理解能力:提出一些需要深入理解文本的問題,看模型是否能準(zhǔn)確回答。
- 語言生成能力:讓模型生成一段有關(guān)特定主題的文章或故事,評估其生成的文本在結(jié)構(gòu)、邏輯和語法等方面的質(zhì)量。
- 知識面廣度:請模型回答關(guān)于不同主題的問題,以測試其對不同領(lǐng)域的知識掌握程度。這可以是關(guān)于科學(xué)、歷史、文學(xué)、體育或其他領(lǐng)域的問題。一個優(yōu)秀的大語言模型應(yīng)該可以回答各種領(lǐng)域的問題,并且準(zhǔn)確性和深度都很高。
- 適應(yīng)性:讓模型處理各種不同類型的任務(wù),例如:寫作、翻譯、編程等,看它是否能靈活應(yīng)對。
- 長文本理解:提出一些需要處理長文本的問題,例如:提供一篇文章,讓模型總結(jié)出文章的要點(diǎn),或者請模型創(chuàng)作一個故事或一篇文章,讓其有一個完整的情節(jié),并且不要出現(xiàn)明顯的邏輯矛盾或故事結(jié)構(gòu)上的錯誤。一個好的大語言模型應(yīng)該能夠以一個連貫的方式講述一個故事,讓讀者沉浸其中。
- 長文本生成:請模型創(chuàng)作一個故事或一篇文章,讓其有一個完整的情節(jié),并且不要出現(xiàn)明顯的邏輯矛盾或故事結(jié)構(gòu)上的錯誤。一個好的大語言模型應(yīng)該能夠以一個連貫的方式講述一個故事,讓讀者沉浸其中。
- 多樣性:提出一個問題,讓模型給出多個不同的答案或解決方案,測試模型的創(chuàng)造力和多樣性。
- 情感分析和推斷:提供一段對話或文本,讓模型分析其中的情感和態(tài)度,或者推斷角色間的關(guān)系。
- 情感表達(dá):請模型生成帶有情感色彩的文本,如描述某個場景或事件的情感、描述一個人物的情感狀態(tài)等。一個優(yōu)秀的大語言模型應(yīng)該能夠準(zhǔn)確地捕捉情感,將其表達(dá)出來。
- 邏輯推理能力:請模型回答需要進(jìn)行推理或邏輯分析的問題,如概率或邏輯推理等。這可以幫助判斷模型對推理和邏輯思考的能力,以及其在處理邏輯問題方面的準(zhǔn)確性。例如:“所有的動物都會呼吸。狗是一種動物。那么狗會呼吸嗎?”
- 問題解決能力:提出實(shí)際問題,例如:數(shù)學(xué)題、編程問題等,看模型是否能給出正確的解答。
- 道德和倫理:測試模型在處理有關(guān)道德和倫理問題時的表現(xiàn),例如:“在什么情況下撒謊是可以接受的?”
- 對話和聊天:請模型進(jìn)行對話,以測試其對自然語言處理的掌握程度和能力。一個優(yōu)秀的大語言模型應(yīng)該能夠準(zhǔn)確地回答問題,并且能夠理解人類的語言表達(dá)方式。
大模型評估方法:
- 人工評估:LIMA、Phoenix
- 使用 GPT-4 的反饋進(jìn)行自動評估:Vicuna、Phoenix、Chimera、BELLE
- 指標(biāo)評估(BLEU-4、ROUGE分?jǐn)?shù)):ChatGLM-6B;對于像ROUGE-L分?jǐn)?shù)的指標(biāo)評估,有些地方稱其為非自然指令評估(Unnatural Instruction Evaluation)。
大模型評估工具:
大模型推理加速
模型推理作為模型投產(chǎn)的最后一公里,需要確保模型精度的同時追求極致的推理性能。相比傳統(tǒng)模型來說,大模型面臨著更多的挑戰(zhàn)。
當(dāng)前優(yōu)化模型最主要技術(shù)手段概括來說有以下三個層面:
- 算法層面:蒸餾、量化
- 軟件層面:計(jì)算圖優(yōu)化、模型編譯
- 硬件層面:FP8(NVIDIA H系列GPU開始支持FP8,兼有fp16的穩(wěn)定性和int8的速度)
推理加速框架:
-
FasterTransformer:英偉達(dá)推出的FasterTransformer不修改模型架構(gòu)而是在計(jì)算加速層面優(yōu)化 Transformer 的 encoder 和 decoder 模塊。具體包括如下:
- 盡可能多地融合除了 GEMM 以外的操作
- 支持 FP16、INT8、FP8
- 移除 encoder 輸入中無用的 padding 來減少計(jì)算開銷
-
TurboTransformers:騰訊推出的 TurboTransformers 由 computation runtime 及 serving framework 組成。加速推理框架適用于 CPU 和 GPU,最重要的是,它可以無需預(yù)處理便可處理變長的輸入序列。具體包括如下:
- 與 FasterTransformer 類似,它融合了除 GEMM 之外的操作以減少計(jì)算量
- smart batching,對于一個 batch 內(nèi)不同長度的序列,它也最小化了 zero-padding 開銷
- 對 LayerNorm 和 Softmax 進(jìn)行批處理,使它們更適合并行計(jì)算
- 引入了模型感知分配器,以確保在可變長度請求服務(wù)期間內(nèi)存占用較小
經(jīng)驗(yàn)與教訓(xùn)
經(jīng)驗(yàn):
- 對于同一模型,選擇不同的訓(xùn)練框架,對于資源的消耗情況可能存在顯著差異(比如使用Huggingface Transformers和DeepSpeed訓(xùn)練OPT-30相對于使用Alpa對于資源的消耗會低不少)。
- 進(jìn)行大模型模型訓(xùn)練時,先使用小規(guī)模模型(如:OPT-125m/2.7b)進(jìn)行嘗試,然后再進(jìn)行大規(guī)模模型(如:OPT-13b/30b...)的嘗試,便于出現(xiàn)問題時進(jìn)行排查。目前來看,業(yè)界也是基于相對較小規(guī)模參數(shù)的模型(6B/7B/13B)進(jìn)行的優(yōu)化,同時,13B模型經(jīng)過指令精調(diào)之后的模型效果已經(jīng)能夠到達(dá)GPT4的90%的效果。
教訓(xùn):
- 針對已有的環(huán)境進(jìn)行分布式訓(xùn)練環(huán)境搭建時,一定要注意之前環(huán)境的python、pip、virtualenv、setuptools的版本。不然創(chuàng)建的虛擬環(huán)境即使指定對了Python版本,也可能會遇到很多安裝依賴庫的問題(GPU服務(wù)器能夠訪問外網(wǎng)的情況下,建議使用Docker相對來說更方便)。
- 遇到需要升級GLIBC等底層庫需要升級的提示時,一定要慎重,不要輕易升級,否則,可能會造成系統(tǒng)宕機(jī)或很多命令無法操作等情況。
結(jié)語
實(shí)踐出真知,以上是這段時間進(jìn)行大模型實(shí)踐的一點(diǎn)點(diǎn)總結(jié),寫的有一些主觀和片面,后續(xù)會持續(xù)更新自己研究大模型獲得的一些認(rèn)知和實(shí)踐經(jīng)驗(yàn)。