共计 4533 个字符,预计需要花费 12 分钟才能阅读完成。
解锁 ChatGLM-6B 的后劲:优化大语言模型训练,冲破工作艰难与答案解析难题
LLM(Large Language Model)通常领有大量的先验常识,使得其在许多自然语言解决工作上都有着不错的性能。
但,想要间接利用 LLM 实现一些工作会存在一些答案解析上的艰难,如规范化输入格局,严格遵从输出信息等。
因而,在这个我的项目下咱们参考 ChatGLM-Tuning 的代码,尝试对大模型 ChatGLM-6B 进行 Finetune,使其可能更好的对齐咱们所须要的输入格局。
1. 环境装置
因为 ChatGLM 须要的环境和该我的项目中其余试验中的环境有所不同,因而咱们强烈建议您创立一个新的虚拟环境来执行该目录下的全副代码。
上面,咱们将以 Anaconda
为例,展现如何疾速搭建一个环境:
- 创立一个虚拟环境,您能够把
llm_env
批改为任意你想要新建的环境名称:
conda create -n llm_env python=3.8
- 激活新建虚拟环境并装置响应的依赖包:
conda activate llm_env
pip install -r requirements.txt
- 装置对应版本的
peft
:
cd peft-chatglm
python setup.py install
2. 数据集筹备
在该试验中,咱们将尝试应用 信息抽取
+ 文本分类
工作的混合数据集喂给模型做 finetune,数据集在 data/mixed_train_dataset.jsonl
。
每一条数据都分为 context
和 target
两局部:
context
局部是承受用户的输出。target
局部用于指定模型的输入。
在 context
中又包含 2 个局部:
- Instruction:用于告知模型的具体指令,当须要一个模型同时解决多个工作时能够设定不同的 Instruction 来帮忙模型判断以后该当做什么工作。
- Input:以后用户的输出。
- 信息抽取数据示例
Instruction 局部通知模型当初须要做「浏览了解」工作,Input 局部告知模型要抽取的句子以及输入的格局。
{
"context": "Instruction: 你当初是一个很厉害的浏览了解器,严格依照人类指令进行答复。\nInput: 找到句子中的三元组信息并输入成 json 给我:\n\n 九玄珠是在纵横中文网连载的一部小说,作者是龙马。\nAnswer:",
"target": "```json\n[{\"predicate\": \" 连载网站 \", \"object_type\": \" 网站 \", \"subject_type\": \" 网络小说 \", \"object\": \" 纵横中文网 \", \"subject\": \" 九玄珠 \"}, {\"predicate\": \" 作者 \", \"object_type\": \" 人物 \", \"subject_type\": \" 图书作品 \", \"object\": \" 龙马 \", \"subject\": \" 九玄珠 \"}]\n```"
}
- 文本分类数据示例
Instruction 局部通知模型当初须要做「浏览了解」工作,Input 局部告知模型要抽取的句子以及输入的格局。
{
"context": "Instruction: 你当初是一个很厉害的浏览了解器,严格依照人类指令进行答复。\nInput: 上面句子可能是一条对于什么的评论,用列表模式答复:\n\n 很不错,很陈腐,快递小哥服务很好,水果也挺甜挺脆的 \nAnswer:",
"target": "[\" 水果 \"]"
}
3. 模型训练
3.1 单卡训练
试验中反对应用 LoRA Finetune 和 P-Tuning 两种微调形式。
运行 train.sh
文件,依据本人 GPU 的显存调节 batch_size
, max_source_seq_len
, max_target_seq_len
参数:
# 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
胜利运行程序后,会看到如下界面:
...
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
下会看到训练 loss 的曲线图:
3.2 多卡训练
运行 train_multi_gpu.sh
文件,通过 CUDA_VISIBLE_DEVICES
指定可用显卡,num_processes
指定应用显卡数:
# 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)"
雷同数据集下,单卡应用工夫:
Used 00:27:18.
多卡(2 并行)应用工夫:
Used 00:13:05.
4. 模型预测
批改训练模型的寄存门路,运行 python inference.py
以测试训练好模型的成果:
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 来进行模型成果测试:
streamlit run playground_local.py --server.port 8001
在浏览器中关上对应的 机器 ip:8001
即可拜访。
5. 标注平台
如果您须要标注本人的数据,也能够在 Playground 中实现。
streamlit run playground_local.py --server.port 8001
在浏览器中关上对应的 机器 ip:8001
即可拜访。
我的项目链接:https://github.com/HarderThenHarder/transformers_tasks/blob/main/LLM/chatglm_finetune/readme.md
更多优质内容请关注公号:汀丶人工智能;会提供一些相干的资源和优质文章,收费获取浏览。