解鎖ChatGLM-6B的潛力:優(yōu)化大語言模型訓(xùn)練,突破任務(wù)困難與答案解析難題
LLM(Large Language Model)通常擁有大量的先驗(yàn)知識(shí),使得其在許多自然語言處理任務(wù)上都有著不錯(cuò)的性能。
但,想要直接利用 LLM 完成一些任務(wù)會(huì)存在一些答案解析上的困難,如規(guī)范化輸出格式,嚴(yán)格服從輸入信息等。
因此,在這個(gè)項(xiàng)目下我們參考 ChatGLM-Tuning 的代碼,嘗試對(duì)大模型 ChatGLM-6B 進(jìn)行 Finetune,使其能夠更好的對(duì)齊我們所需要的輸出格式。
1. 環(huán)境安裝
由于 ChatGLM 需要的環(huán)境和該項(xiàng)目中其他實(shí)驗(yàn)中的環(huán)境有所不同,因此我們強(qiáng)烈建議您創(chuàng)建一個(gè)新的虛擬環(huán)境來執(zhí)行該目錄下的全部代碼。
下面,我們將以 Anaconda
為例,展示如何快速搭建一個(gè)環(huán)境:
- 創(chuàng)建一個(gè)虛擬環(huán)境,您可以把
llm_env
修改為任意你想要新建的環(huán)境名稱:
conda create -n llm_env python=3.8
- 激活新建虛擬環(huán)境并安裝響應(yīng)的依賴包:
conda activate llm_env
pip install -r requirements.txt
- 安裝對(duì)應(yīng)版本的
peft
:
cd peft-chatglm
python setup.py install
2. 數(shù)據(jù)集準(zhǔn)備
在該實(shí)驗(yàn)中,我們將嘗試使用 信息抽取
+ 文本分類
任務(wù)的混合數(shù)據(jù)集喂給模型做 finetune,數(shù)據(jù)集在 data/mixed_train_dataset.jsonl
。
每一條數(shù)據(jù)都分為 context
和 target
兩部分:
-
context
部分是接受用戶的輸入。 -
target
部分用于指定模型的輸出。
在 context
中又包括 2 個(gè)部分:
-
Instruction:用于告知模型的具體指令,當(dāng)需要一個(gè)模型同時(shí)解決多個(gè)任務(wù)時(shí)可以設(shè)定不同的 Instruction 來幫助模型判別當(dāng)前應(yīng)當(dāng)做什么任務(wù)。
-
Input:當(dāng)前用戶的輸入。
- 信息抽取數(shù)據(jù)示例
Instruction 部分告訴模型現(xiàn)在需要做「閱讀理解」任務(wù),Input 部分告知模型要抽取的句子以及輸出的格式。
{
"context": "Instruction: 你現(xiàn)在是一個(gè)很厲害的閱讀理解器,嚴(yán)格按照人類指令進(jìn)行回答。\nInput: 找到句子中的三元組信息并輸出成json給我:\n\n九玄珠是在縱橫中文網(wǎng)連載的一部小說,作者是龍馬。\nAnswer: ",
"target": "```json\n[{\"predicate\": \"連載網(wǎng)站\", \"object_type\": \"網(wǎng)站\", \"subject_type\": \"網(wǎng)絡(luò)小說\", \"object\": \"縱橫中文網(wǎng)\", \"subject\": \"九玄珠\"}, {\"predicate\": \"作者\(yùn)", \"object_type\": \"人物\", \"subject_type\": \"圖書作品\", \"object\": \"龍馬\", \"subject\": \"九玄珠\"}]\n```"
}
- 文本分類數(shù)據(jù)示例
Instruction 部分告訴模型現(xiàn)在需要做「閱讀理解」任務(wù),Input 部分告知模型要抽取的句子以及輸出的格式。
{
"context": "Instruction: 你現(xiàn)在是一個(gè)很厲害的閱讀理解器,嚴(yán)格按照人類指令進(jìn)行回答。\nInput: 下面句子可能是一條關(guān)于什么的評(píng)論,用列表形式回答:\n\n很不錯(cuò),很新鮮,快遞小哥服務(wù)很好,水果也挺甜挺脆的\nAnswer: ",
"target": "[\"水果\"]"
}
3. 模型訓(xùn)練
3.1 單卡訓(xùn)練
實(shí)驗(yàn)中支持使用 LoRA Finetune 和 P-Tuning 兩種微調(diào)方式。
運(yùn)行 train.sh
文件,根據(jù)自己 GPU 的顯存調(diào)節(jié) batch_size
, max_source_seq_len
, max_target_seq_len
參數(shù):
# LoRA Finetune
python train.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_lora True \
--lora_rank 8 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 1000 \
--learning_rate 3e-5 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints/finetune \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM Fine-Tune" \
--device cuda:0
# P-Tuning
python train.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_ptuning True \
--pre_seq_len 128 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 200 \
--learning_rate 2e-4 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints/ptuning \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM P-Tuning" \
--device cuda:0
成功運(yùn)行程序后,會(huì)看到如下界面:
...
global step 900 ( 49.89% ) , epoch: 1, loss: 0.78065, speed: 1.25 step/s, ETA: 00:12:05
global step 1000 ( 55.43% ) , epoch: 2, loss: 0.71768, speed: 1.25 step/s, ETA: 00:10:44
Model has saved at checkpoints/model_1000.
Evaluation Loss: 0.17297
Min eval loss has been updated: 0.26805 --> 0.17297
Best model has saved at checkpoints/model_best.
global step 1100 ( 60.98% ) , epoch: 2, loss: 0.66633, speed: 1.24 step/s, ETA: 00:09:26
global step 1200 ( 66.52% ) , epoch: 2, loss: 0.62207, speed: 1.24 step/s, ETA: 00:08:06
...
在 log/finetune_log
下會(huì)看到訓(xùn)練 loss 的曲線圖:
3.2 多卡訓(xùn)練
運(yùn)行 train_multi_gpu.sh
文件,通過 CUDA_VISIBLE_DEVICES
指定可用顯卡,num_processes
指定使用顯卡數(shù):
# LoRA Finetune
CUDA_VISIBLE_DEVICES=0,1 accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 train_multi_gpu.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_lora True \
--lora_rank 8 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 500 \
--learning_rate 3e-5 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints_parrallel/finetune \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM Fine-Tune(parallel)"
# P-Tuning
CUDA_VISIBLE_DEVICES=0,1 accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 train_multi_gpu.py \
--train_path data/mixed_train_dataset.jsonl \
--dev_path data/mixed_dev_dataset.jsonl \
--use_ptuning True \
--pre_seq_len 128 \
--batch_size 1 \
--num_train_epochs 2 \
--save_freq 500 \
--learning_rate 2e-4 \
--logging_steps 100 \
--max_source_seq_len 400 \
--max_target_seq_len 300 \
--save_dir checkpoints_parrallel/ptuning \
--img_log_dir "log/fintune_log" \
--img_log_name "ChatGLM P-Tuning(parallel)"
相同數(shù)據(jù)集下,單卡使用時(shí)間:
Used 00:27:18.
多卡(2并行)使用時(shí)間:
Used 00:13:05.
4. 模型預(yù)測
修改訓(xùn)練模型的存放路徑,運(yùn)行 python inference.py
以測試訓(xùn)練好模型的效果:
device = 'cuda:0'
max_new_tokens = 300
model_path = "checkpoints/model_1000" # 模型存放路徑
tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True
)
model = AutoModel.from_pretrained(
model_path,
trust_remote_code=True
).half().to(device)
...
您也可以使用我們提供的 Playground 來進(jìn)行模型效果測試:
streamlit run playground_local.py --server.port 8001
在瀏覽器中打開對(duì)應(yīng)的 機(jī)器ip:8001
即可訪問。文章來源:http://www.zghlxwxcb.cn/news/detail-679143.html
5. 標(biāo)注平臺(tái)
如果您需要標(biāo)注自己的數(shù)據(jù),也可以在 Playground 中完成。
streamlit run playground_local.py --server.port 8001
在瀏覽器中打開對(duì)應(yīng)的 機(jī)器ip:8001
即可訪問。
項(xiàng)目鏈接:https://github.com/HarderThenHarder/transformers_tasks/blob/main/LLM/chatglm_finetune/readme.md文章來源地址http://www.zghlxwxcb.cn/news/detail-679143.html
到了這里,關(guān)于解鎖ChatGLM-6B的潛力:優(yōu)化大語言模型訓(xùn)練,突破任務(wù)困難與答案解析難題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!