引言
這是ChatGLM2-6B 部署的閱讀筆記,主要介紹了ChatGLM2-6B模型的部署和一些原理的簡單解釋。
ChatGLM-6B
它是單卡開源的對話模型。
-
充分的中英雙語預訓練
-
較低的部署門檻
- FP16半精度下,需要至少13G的顯存進行推理,甚至可以進一步降低到10G(INT8)和6G(INT4)
-
更長的序列長度 ChatGLM-6B 序列長度達2048;ChatGLM2-6B達8192;
-
人類意圖對齊訓練 使用了監(jiān)督微調、反饋自助、人類反饋強化學習等方式
ChatGLM-6B本地部署
1.克隆ChatGLM2-6B
git clone https://github.com/THUDM/ChatGLM2-6B
2.CD進去之后,安裝依賴包
pip install -r requirements.txt
它會安裝以下依賴:
protobuf
transformers==4.30.2
cpm_kernels
torch>=2.0
gradio
mdtex2html
sentencepiece
accelerate
sse-starlette
3.下載模型權重
有兩種方法,第一種就是利用transformers
包去加載:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
Downloading (…)enization_chatglm.py: 100%|████████████████████████████████████████████████████████████████████| 10.1k/10.1k [00:00<00:00, 1.61MB/s]
A new version of the following files was downloaded from https://huggingface.co/THUDM/chatglm2-6b:
- tokenization_chatglm.py
. Make sure to double-check they do not contain any added malicious code. To avoid downloading new versions of the code file, you can pin a revision.
Downloading tokenizer.model: 100%|████████████████████████████████████████████████████████████████████████████| 1.02M/1.02M [00:00<00:00, 2.22MB/s]
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True, device="cuda")
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:16<00:00, 2.41s/it]
由于博主已經下載過了,這里直接加載就好了,當然前提是你的顯存和內存足夠。
這樣模型就下載好了,下面我們來體驗以下:
model = model.eval()
# 傳入tokenizer, 消息 和 歷史
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
你好??!我是人工智能助手 ChatGLM2-6B,很高興見到你,歡迎問我任何問題。
response, history = model.chat(tokenizer, "如何學習大模型?", history)
print(response)
大模型學習通常需要大量的計算資源和數(shù)據(jù)集,以及高超的技術和經驗。以下是一些學習大模型的步驟:
1. 選擇合適的大模型:選擇適合你應用領域的大模型,例如自然語言處理 (NLP) 中的 BERT、RoBERTa 等。
2. 準備數(shù)據(jù)集:獲取大量高質量的訓練數(shù)據(jù)集,這些數(shù)據(jù)集通常包括文本數(shù)據(jù)、圖像數(shù)據(jù)等。
3. 選擇訓練方式:選擇合適的訓練方式,例如數(shù)據(jù)增強、遷移學習等。
4. 搭建訓練環(huán)境:搭建一個適合大模型的訓練環(huán)境,包括分布式計算、數(shù)據(jù)增強等。
5. 訓練模型:使用訓練工具對模型進行訓練,常見的訓練工具包括 PyTorch、TensorFlow 等。
6. 評估模型:使用評估工具對模型的性能進行評估,常見的評估指標包括 accuracy、召回率、F1-score 等。
7. 部署模型:將訓練好的模型部署到生產環(huán)境中,以實時處理數(shù)據(jù)。
大模型學習需要大量的計算資源和數(shù)據(jù)集,以及高超的技術和經驗。因此,建議在實踐中根據(jù)自己的需求和能力選擇適合自己的大模型,并逐步提高自己的技術水平。
如果這種方式下載模型很慢的話,還可以從云盤直接下載模型權重。
首先需要下載模型代碼實現(xiàn):
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm2-6b
然后叢云盤中下載模型權重文件,放到本地目錄,比如是chatglm2-6b
下。
接著將模型加載路徑替換成剛才這個本地目錄chatglm2-6b
:
tokenizer = AutoTokenizer.from_pretrained("chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("chatglm2-6b", trust_remote_code=True).cuda()
注意這里chatglm2-6b
是保持下載好的權重的路徑,可以放在項目的根目錄下。
如果你手頭上有一臺Mac,那么可以參照以下方式部署(未驗證):
對于搭載了 Apple Silicon 或者 AMD GPU 的 Mac,可以使用 MPS 后端來在 GPU 上運行 ChatGLM2-6B。需要參考 Apple 的 官方說明 安裝 PyTorch-Nightly(正確的版本號應該是2.x.x.dev2023xxxx,而不是 2.x.x)。
目前在 MacOS 上只支持從本地加載模型。將代碼中的模型加載改為從本地加載,并使用 mps 后端:
model = AutoModel.from_pretrained("your local path", trust_remote_code=True).to('mps')
加載半精度的 ChatGLM2-6B 模型需要大概 13GB 內存。內存較小的機器(比如 16GB 內存的 MacBook Pro),在空余內存不足的情況下會使用硬盤上的虛擬內存,導致推理速度嚴重變慢。 此時可以使用量化后的模型 chatglm2-6b-int4。因為 GPU 上量化的 kernel 是使用 CUDA 編寫的,因此無法在 MacOS 上使用,只能使用 CPU 進行推理。 為了充分使用 CPU 并行,還需要單獨安裝 OpenMP。
在 Mac 上進行推理也可以使用 ChatGLM.cpp
以上內容來自官方文檔。
本地Web-Demo
除了通過代碼的方式去和ChatGLM交流,還可以通過本地web-demo來進行。
在ChatGLM2-6B
目錄下,執(zhí)行:
python web_demo.py
右下角有三個參數(shù),分別是max length, top p和temperature。
- Max length 最大輸出長度
- Top P nucleus采樣閾值[0,1]之間,給定這個閾值,它會從解碼器中挑選一個累計概率大于閾值的最小單詞集合,然后把該集合中單詞的概率重新進行歸一化,然后從中采樣。推薦0.7。
- Temperature 采樣溫度[0,1]之間,越大回答多樣性越高,但如果想要結果一致性高一點,這個值要設小一點。它根據(jù) P ( x i ∣ x 1 : i ? 1 ) = exp ? ( u i / t ) ∑ j exp ? ( u j / t ) P(x_i|x_{1:i-1}) = \frac{\exp (u_i/t)}{\sum_j \exp(u_j/t)} P(xi?∣x1:i?1?)=∑j?exp(uj?/t)exp(ui?/t)?計算。
ChatGLM2-6B 量化部署
采用INT4量化,可以把顯存需求從13G降到了6G。
ChatGLM-6B 微調
利用新的數(shù)據(jù),對已經部署好的大模型進行繼續(xù)訓練就是微調。
首先我們看一下微調的好處
- 增強模型通用性以及和人類對齊的能力
- 使模型更加適用于專業(yè)化領域場景
大模型微調范式
第一種是Prompting,即輸入提示詞來引導模型適應下游任務。
這種方式的優(yōu)點是簡單,但缺點是成本高,難以達到最優(yōu)。可以從上圖看到,不同的提示詞得到的準確率相差較大,優(yōu)化效果不穩(wěn)定,需要不斷嘗試。
我們重點來看下更優(yōu)的方式??梢苑譃槿珔?shù)微調和高效參數(shù)微調。
假設全參數(shù)微調在13G顯存的參數(shù)上,模型本身就占用了13G顯存。此時在訓練時需要模型參數(shù)的四倍,加上原來的13G,因此大概需要60G內存或顯存。所以全量微調成本高,難以實現(xiàn)。
上圖右邊就是高效參數(shù)微調
- Adapter 引入一小部分參數(shù)(額外可訓練層),只需要調整新加入的參數(shù),但同時會引入額外的推理開銷。
- Prompt/Prefix tuning 效果更優(yōu),需要調參。
- LoRA 依靠權重的低秩分解特點,沒有額外推理開銷。
- 數(shù)據(jù)量少的話,全參數(shù)微調效果更好,不容易過擬合。
這里還沒有理解,需要進一步去了解。后續(xù)會繼續(xù)閱讀參考中的論文。
P-tuning V2原理
在輸入的向量序列前面拼上幾個不代表詞含義的向量,讓模型僅對前面這幾個向量進行優(yōu)化,凍結整個模型的其他60億(6B)參數(shù),這樣來實現(xiàn)高效參數(shù)的微調。
這種微調方式的成本只有全參數(shù)微調成本的0.1%-0.5%。
同時只需要保持和載入前面的PrefixEncoder,模型保持空間非常小。
下面我們來看如何進行這種高效微調, 在目錄ptuning
下有:
total 104K
drwxrwxrwx 2 root root 4.0K Sep 6 22:25 .
drwxrwxrwx 8 root root 4.0K Sep 6 23:04 ..
-rw-rw-rw- 1 root root 8.3K Sep 6 22:25 arguments.py
-rw-rw-rw- 1 root root 489 Sep 6 22:25 deepspeed.json
-rw-rw-rw- 1 root root 768 Sep 6 22:25 ds_train_finetune.sh
-rw-rw-rw- 1 root root 603 Sep 6 22:25 evaluate_finetune.sh
-rw-rw-rw- 1 root root 702 Sep 6 22:25 evaluate.sh
-rw-rw-rw- 1 root root 18K Sep 6 22:25 main.py
-rw-rw-rw- 1 root root 9.4K Sep 6 22:25 README.md
-rw-rw-rw- 1 root root 823 Sep 6 22:25 train_chat.sh
-rw-rw-rw- 1 root root 3.1K Sep 6 22:25 trainer.py
-rw-rw-rw- 1 root root 12K Sep 6 22:25 trainer_seq2seq.py
-rw-rw-rw- 1 root root 833 Sep 6 22:25 train.sh
-rw-rw-rw- 1 root root 5.9K Sep 6 22:25 web_demo.py
-rw-rw-rw- 1 root root 219 Sep 6 22:25 web_demo.sh
其中 train.sh
可以幫我們進行微調,而evaluate.sh
可以驗證微調效果。
我們來看下train.sh
的內容:
$ cat train.sh
PRE_SEQ_LEN=128
LR=2e-2
NUM_GPUS=1
torchrun --standalone --nnodes=1 --nproc-per-node=$NUM_GPUS main.py \
--do_train \
--train_file AdvertiseGen/train.json \ # 數(shù)據(jù)集位置
--validation_file AdvertiseGen/dev.json \ # 驗證集
--preprocessing_num_workers 10 \
--prompt_column content \
--response_column summary \
--overwrite_cache \
--model_name_or_path THUDM/chatglm2-6b \ # 可設為本地模型路徑
--output_dir output/adgen-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \ # 微調模型保存路徑
--overwrite_output_dir \
--max_source_length 64 \
--max_target_length 128 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 16 \
--predict_with_generate \
--max_steps 3000 \ # 總訓練步數(shù)
--logging_steps 10 \
--save_steps 1000 \
--learning_rate $LR \ # 學習率
--pre_seq_len $PRE_SEQ_LEN \ # Prompt長度,不設置時全參數(shù)微調
--quantization_bit 4
其中通過以下設置:
quantization_bit=4 per_device_train_batch_size=1 gradient_accumulation_steps=16
可以實現(xiàn)INT4
的模型參數(shù)被凍結,一次訓練迭代會以1的批處理大小進行16次累加的前后向傳播(就是計算了16次前向傳播后再進行反向傳播更新梯度,等同于16的批大小),此時最低只需要6.7G顯存。
全參數(shù)微調
如果你資源比較多,滿足
比如有4張A100顯卡。
那么可以通過ds_train_finetune.sh
腳本進行全參數(shù)微調,需要安裝deepspeed
進行多卡微調:
推理
推理通過運行腳本evaluate.sh
:
PRE_SEQ_LEN=128
CHECKPOINT=adgen-chatglm2-6b-pt-128-2e-2
STEP=3000
NUM_GPUS=1
torchrun --standalone --nnodes=1 --nproc-per-node=$NUM_GPUS main.py \
--do_predict \
--validation_file AdvertiseGen/dev.json \
--test_file AdvertiseGen/dev.json \
--overwrite_cache \
--prompt_column content \
--response_column summary \
--model_name_or_path THUDM/chatglm2-6b \
--ptuning_checkpoint ./output/$CHECKPOINT/checkpoint-$STEP \
--output_dir ./output/$CHECKPOINT \
--overwrite_output_dir \
--max_source_length 64 \
--max_target_length 64 \
--per_device_eval_batch_size 1 \
--predict_with_generate \
--pre_seq_len $PRE_SEQ_LEN \
--quantization_bit 4
微調結果
廣告生成
這是一個廣告文案生成的例子,我們輸入衣服的描述,微調前模型只是做了一些簡單的解釋,用summary
中的例子去訓練,使得模型學會偏廣告風格的描述。
多輪對話數(shù)據(jù)集
在微調多輪對話數(shù)據(jù)時,可以提供聊天歷史,在訓練命令中指定 –history_column
。文章來源:http://www.zghlxwxcb.cn/news/detail-698743.html
其實這里只給出了兩個微調實例的簡單說明,下篇文章我們來看下微調的完整過程是怎樣的。文章來源地址http://www.zghlxwxcb.cn/news/detail-698743.html
參考
- Prefix-Tuning: Optimizing Continuous Prompts for Generation
- P-Tuning: Prompt Tuning Can Be Comparable to Fine-tuning Across Scales and Tasks
到了這里,關于ChatGLM2-6B 部署的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!