ChatGLM2-6B微调
微调东西
本次咱们运用ChatGLM-Efficient-Tuning,根据 PEFT 的高效 ChatGLM-6B 微调东西
现在实现了针对以下高效微调办法的支撑:
- LoRA
- 仅微调低秩适应器。
- P-Tuning V2
- 仅微调前缀编码器。
- Freeze Tuning
- 仅微调后几层的全连接层。
- 全量微调
- 微调模型所有参数。
本次咱们运用LoRA微调办法。
微调步骤
下载代码
git clone https://github.com/hiyouga/ChatGLM-Efficient-Tuning.git
装置依靠
cd ChatGLM-Efficient-Tuning
# 创立conda环境
conda create -n chatglm2 python=3.9
conda activate chatglm2
# 装置pytorch,假如已装置能够忽略
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia
# 装置项目依靠
pip install -r requirements.txt
下载模型
下载地址: huggingface.co/THUDM/chatg…
注意有必要要将整个项目git clone下来
这里主张现已下载过模型的从头将项目中的几个py文件从头下载一次,否则会报错
git lfs install
git clone https://huggingface.co/THUDM/chatglm2-6b
编辑数据集
数据集按照如下格式即可
[
{
"question": "人们为何常常感到冤枉", //输入
"instruction": "问答", //指令 如 翻译/问答
"output": "人常会不自觉地记下对自己有利的部分,这是构成冤枉的重要原因。" //输出
}
]
在src/data/data_info.json
中新增数据集并编辑字段映射
"zhangyiming": {
"file_name": "/gemini/data-1/zhangyiming.json",
"columns": { //对应数据集的字段名
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
运行微调指令
这里是单机单cpu,所以只需要用device0就行
CUDA_VISIBLE_DEVICES=0 python src/train_sft.py --model_name_or_path /gemini/code/model --use_v2 --plot_loss --do_train --dataset zhangyiming --finetuning_type lora --output_dir /gemini/code/output --per_device_train_batch_size 4 --gradient_accumulation_steps 4 --lr_scheduler_type cosine --logging_steps 10 --save_steps 1000 --learning_rate 5e-5 --num_train_epochs 100 --fp16
部分参数解释:
名称 | 阐明 |
---|---|
use_v2 | 是否微调的是ChatGLM2 |
model_name_or_path | 模型途径 |
finetuning_type | 微调类型: lora p-tuning freeze |
dataset | 数据集名称 |
output_dir | 输出微调模型的途径 |
num_train_epochs | 练习次序 |
其他参数见项目wiki
其间各微调类型介绍:
- Freeze: 即参数冻住,对原始模型部分参数进行冻住操作,仅练习部分参数,以到达在单卡或不进行TP或PP操作,就能够对大模型进行练习。
- P-Tuning: 在输入的embedding层前,将prompt转换为可学习的额定一层embedding层.(这里我也没有太懂=)
- LoRA: 在大型言语模型上对指定参数(权重矩阵)并行添加额定的低秩矩阵,并在模型练习过程中,仅练习额定添加的并行低秩矩阵的参数,冻住其他参数。 当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量也就很小。在下游任务tuning时,仅须练习很小的参数,但能获取较好的体现成果。
现在我在24G显存(用的趋动云,不知道具体的GPU类型)情况下,LoRA微调100个epoch大概7分钟就跑完了,微调成果会保存到装备的output目录.我准备了58条练习数据,大概在500个epoch左右loss开端不再下降。
其间,adapter_config.json
和adapter_model.bin
就是微调后的模型
测验
Cli测验
CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py \
--checkpoint_dir /gemini/code/output --model_name_or_path /gemini/code/model --use_v2
代码测验
from transformers import AutoModel, AutoTokenizer
from peft import PeftModel
model_path = '/gemini/code/model/'
peft_model_path = '/gemini/code/output/'
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
model = PeftModel.from_pretrained(model, peft_model_path, is_trainable=True)
input_text = '人们为何常常感到冤枉?'
response, history = model.chat(tokenizer=tokenizer, query=input_text)
print(response)