ChatGLM2-6B 的 Lora 微調(diào)教程
發(fā)布日期:2023/11/8 23:29:24 瀏覽量:
0. 背景
現(xiàn)在開始學(xué)習(xí)微調(diào),主要學(xué)習(xí) Lora 微調(diào)。
這次嘗試了修改 ChatGLM2-6B 自我認(rèn)知,文章中記錄了整個(gè)微調(diào)過程。
1. 部署微調(diào)項(xiàng)目
git clone https://github.com/hiyouga/ChatGLM-Efficient-Tuning.git conda create -n chatglm_etuning python=3.10 conda activate chatglm_etuning cd ChatGLM-Efficient-Tuning pip install -r requirements.txt
2. 數(shù)據(jù)集說明
我們使用 self_cognition 數(shù)據(jù)集,該數(shù)據(jù)集包含了 18 條關(guān)于模型自我認(rèn)知的數(shù)據(jù),我們的目標(biāo)是修改模型自身的知識(shí),使模型給出我們希望的答復(fù)。
首先,對(duì)數(shù)據(jù)做以下修改,
sed -i ’s/ChatGLM-6B/ChatGLM2-6B/g’ data/self_cognition.json # 提示:您可以將 [NAME] 換成您自己的名字,從而讓模型回答它的創(chuàng)造者是您。 sed -i ’s/\[NAME\]/AI小鎮(zhèn)/g’ data/self_cognition.json
其次,查看 data/self_cognition.json,這里我們列出兩條示例。
[
{
"instruction": "你身份是什么?",
"input": "",
"output": "我叫ChatGLM2-6B,是一個(gè)由AI小鎮(zhèn)于2023年獨(dú)立訓(xùn)練和開發(fā)的人工智能助手。我的主要目標(biāo)是協(xié)助用戶解決問題和滿足他們的需求。"
},
{
"instruction": "你的身份信息能告訴我嗎?",
"input": "",
"output": "當(dāng)然可以,我是ChatGLM2-6B,一個(gè)由AI小鎮(zhèn)創(chuàng)建的人工智能助手。我在2023年研發(fā)完成,旨在為用戶提供有針對(duì)性的回答和幫助。"
}
]
3. 模型監(jiān)督微調(diào)(Lora)
運(yùn)行以下命令在單個(gè) GPU 上進(jìn)行模型監(jiān)督微調(diào)。我們使用 self_cognition 數(shù)據(jù)集,采用 lora 微調(diào)方法,微調(diào)后的模型保存在 cognition 文件夾中。為了保證模型微調(diào)成功,我們采用 0.001 的學(xué)習(xí)率,在數(shù)據(jù)集上訓(xùn)練 10 個(gè) epoch。
CUDA_VISIBLE_DEVICES=0 python src/train_sft.py --do_train --use_v2 --dataset self_cognition --finetuning_type lora --lora_rank 32 --output_dir cognition --overwrite_cache --per_device_train_batch_size 2 --gradient_accumulation_steps 2 --lr_scheduler_type cosine --logging_steps 10 --save_steps 1000 --warmup_steps 0 --learning_rate 1e-3 --num_train_epochs 10.0 --fp16
運(yùn)行結(jié)果日志如下,
4. 模型效果測試
運(yùn)行以下命令在單個(gè) GPU 上測試模型效果,它會(huì)加載 cognition 文件夾內(nèi)保存的微調(diào)模型權(quán)重,并合并進(jìn)原版 ChatGLM2-6B 模型的參數(shù)權(quán)重中,同時(shí)啟動(dòng)流式交互窗口。
CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py --use_v2 --checkpoint_dir cognition
向微調(diào)后的 ChatGLM2-6B 模型問一些自我認(rèn)知問題,我們可以發(fā)現(xiàn)它能夠給出我們期望的回答。
同時(shí),我們還測試了兩個(gè)額外的問題,驗(yàn)證結(jié)果說明模型的原本知識(shí)并沒有被嚴(yán)重破壞。
5. 導(dǎo)出微調(diào)模型
如果要將微調(diào)后的模型部署在您的項(xiàng)目框架中,請(qǐng)使用 export_model.py 將微調(diào)后的權(quán)重合并到 ChatGLM2-6B 模型中并導(dǎo)出完整模型。(提示:output_dir 不要使用大寫字母)
python src/export_model.py --use_v2 --checkpoint_dir cognition --output_dir ./chatglm2_6b_lora
然后訪問 https://huggingface.co/THUDM/chatglm2-6b/tree/main,將 configuration_chatglm.py、modeling_chatglm.py、quantization.py、tokenization_chatglm.py 4個(gè)文件下載到 ./chatglm2_6b_lora 目錄下面。
然后執(zhí)行下面命令,修改幾個(gè)配置值。
sed -i ’s/THUDM\/chatglm2-6b--//g’ ./chatglm2_6b_lora/config.json sed -i ’s/THUDM\/chatglm2-6b/\.\.\/chatglm2_6b_lora/g’ ./chatglm2_6b_lora/config.json sed -i ’s/THUDM\/chatglm2-6b--//g’ ./chatglm2_6b_lora/tokenizer_config.json sed -i ’s/THUDM\/ChatGLM2-6B/\.\.\/chatglm2_6b_lora/g’ ./chatglm2_6b_lora/modeling_chatglm.py sed -i ’s/THUDM\/chatglm2-6b/\.\.\/chatglm2_6b_lora/g’ ./chatglm2_6b_lora/modeling_chatglm.py
6. 調(diào)用導(dǎo)出的模型
創(chuàng)建 chatglm2_6b_lora.py,
cat << EOF > chatglm2_6b_lora.py from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained(’./chatglm2_6b_lora’, trust_remote_code=True) model = AutoModel.from_pretrained(’./chatglm2_6b_lora’, trust_remote_code=True).half().cuda() response, history = model.chat(tokenizer, "你是誰?", history=[]) print(response) EOF
執(zhí)行 chatglm2_6b_lora.py,
python chatglm2_6b_lora.py
輸出結(jié)果如下,

完結(jié)!
馬上咨詢: 如果您有業(yè)務(wù)方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗(yàn)積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生