ChatGLM2-6B 的 Lora 微調教程
發(fā)布日期:2023/11/8 23:29:24 瀏覽量:
0. 背景
現(xiàn)在開始學習微調,主要學習 Lora 微調。
這次嘗試了修改 ChatGLM2-6B 自我認知,文章中記錄了整個微調過程。
1. 部署微調項目
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 條關于模型自我認知的數(shù)據(jù),我們的目標是修改模型自身的知識,使模型給出我們希望的答復。
首先,對數(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,是一個由AI小鎮(zhèn)于2023年獨立訓練和開發(fā)的人工智能助手。我的主要目標是協(xié)助用戶解決問題和滿足他們的需求。"
},
{
"instruction": "你的身份信息能告訴我嗎?",
"input": "",
"output": "當然可以,我是ChatGLM2-6B,一個由AI小鎮(zhèn)創(chuàng)建的人工智能助手。我在2023年研發(fā)完成,旨在為用戶提供有針對性的回答和幫助。"
}
]
3. 模型監(jiān)督微調(Lora)
運行以下命令在單個 GPU 上進行模型監(jiān)督微調。我們使用 self_cognition 數(shù)據(jù)集,采用 lora 微調方法,微調后的模型保存在 cognition 文件夾中。為了保證模型微調成功,我們采用 0.001 的學習率,在數(shù)據(jù)集上訓練 10 個 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
運行結果日志如下,
4. 模型效果測試
運行以下命令在單個 GPU 上測試模型效果,它會加載 cognition 文件夾內保存的微調模型權重,并合并進原版 ChatGLM2-6B 模型的參數(shù)權重中,同時啟動流式交互窗口。
CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py --use_v2 --checkpoint_dir cognition
向微調后的 ChatGLM2-6B 模型問一些自我認知問題,我們可以發(fā)現(xiàn)它能夠給出我們期望的回答。
同時,我們還測試了兩個額外的問題,驗證結果說明模型的原本知識并沒有被嚴重破壞。
5. 導出微調模型
如果要將微調后的模型部署在您的項目框架中,請使用 export_model.py 將微調后的權重合并到 ChatGLM2-6B 模型中并導出完整模型。(提示: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個文件下載到 ./chatglm2_6b_lora 目錄下面。
然后執(zhí)行下面命令,修改幾個配置值。
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. 調用導出的模型
創(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
輸出結果如下,

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