赞
踩
LLMs之ChatGLM:ChatGLM Efficient Tuning(一款高效微调ChatGLM-6B/ChatGLM2-6B的工具【LoRA/P-Tuning V2/Freeze Tuning/全量微调】)的简介、安装、使用方法之详细攻略
目录
2、可支持的微调方法:LoRA、P-Tuning V2、Freeze Tuning、全量微调
https://yunyaniu.blog.csdn.net/article/details/131427931
https://yunyaniu.blog.csdn.net/article/details/132012771
2023年4月发布的ChatGLM Efficient Tuning项目,是基于PEFT库对ChatGLM-6B高效微调,当然,也可改进为实现对ChatGLM2-6B进行高效微调。同时,该项目已声明在2023年7月15日后不再维护,但是其中一些方法和策略是值得学习和借鉴的。
官方地址:https://github.com/hiyouga/ChatGLM-Efficient-Tuning
使用方法请参考 data/README.md 文件。
因为部分数据集的使用需要确认,我们推荐使用下述命令登录您的 Hugging Face 账户。
- pip install --upgrade huggingface_hub
- huggingface-cli login
LoRA:仅微调低秩适应器。
P-Tuning V2:仅微调前缀编码器。
Freeze Tuning:仅微调后几层的全连接层。
全量微调:微调模型所有参数。
Python依赖 | Python 3.8+, PyTorch 1.13.1 Transformers, Datasets, Accelerate, PEFT, TRL protobuf, cpm-kernels, sentencepiece jieba, rouge-chinese, nltk(用于评估) gradio, matplotlib(用于网页端交互) uvicorn, fastapi, sse-starlette(用于 API) |
微调方法 | 批处理大小 | 模式 | GPU显存 | 速度 |
---|---|---|---|---|
LoRA (r=8) | 16 | FP16 | 28GB | 8ex/s |
LoRA (r=8) | 8 | FP16 | 24GB | 8ex/s |
LoRA (r=8) | 4 | FP16 | 20GB | 8ex/s |
LoRA (r=8) | 4 | INT8 | 10GB | 8ex/s |
LoRA (r=8) | 4 | INT4 | 8GB | 8ex/s |
P-Tuning (p=16) | 4 | FP16 | 20GB | 8ex/s |
P-Tuning (p=16) | 4 | INT8 | 16GB | 8ex/s |
P-Tuning (p=16) | 4 | INT4 | 12GB | 8ex/s |
Freeze (l=3) | 4 | FP16 | 24GB | 8ex/s |
奖励模型训练方法 | 批处理大小 | 模式 | GPU显存 | 速度 |
---|---|---|---|---|
LoRA (r=8) + rm | 4 | FP16 | 22GB | - |
LoRA (r=8) + rm | 1 | INT8 | 11GB | - |
RLHF 训练方法 | 批处理大小 | 模式 | GPU显存 | 速度 |
---|---|---|---|---|
LoRA (r=8) + ppo | 4 | FP16 | 23GB | - |
LoRA (r=8) + ppo | 1 | INT8 | 12GB | - |
注:r
为LoRA 维数大小,p
为前缀词表大小,l
为微调层数,ex/s
为每秒训练的样本数。gradient_accumulation_steps
参数设置为 1
。上述结果均来自于单个 Tesla V100 GPU,仅供参考。
通用 | git lfs install 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 |
Windows平台+QLoRA | 如果要在 Windows 平台上开启量化 LoRA(QLoRA),需要安装预编译的 bitsandbytes 库, 支持 CUDA 11.1 到 12.1. pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl |
关于数据集文件的格式,请参考 data/example_dataset 文件夹的内容。构建自定义数据集时,既可以使用单个 .json 文件,也可以使用一个数据加载脚本和多个文件。
注意:使用自定义数据集时,请更新 data/dataset_info.json 文件,该文件的格式请参考 data/README.md。
源代码地址:
https://github.com/hiyouga/ChatGLM-Efficient-Tuning/blob/main/data/dataset_info.json
- # 定位到数据集文件目录(data/dataset_info.json )修改对应的配置信息
- {
- "dataset_DIY": {
- "file_name": "dataset_DIY.json",
- # "file_sha1": "607f94a7f581341e59685aef32f531095232cf23"
- },
内容来源:
https://github.com/hiyouga/ChatGLM-Efficient-Tuning/wiki/%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
hparams. Model Arguments | class glmtuner.hparams.ModelArguments <source> model_name_or_path (str, optional): 预训练模型的路径或 huggingface.co/models 的项目标识符。缺省值:THUDM/chatglm-6b config_name (str, optional): 预训练配置文件名称或路径,不指定则与 model_name 相同。缺省值:None tokenizer_name (str, optional): 预训练分词器名称或路径,不指定则与 model_name 相同。缺省值:None cache_dir (str, optional): 保存从 huggingface.co 下载内容的文件夹路径。缺省值:None use_fast_tokenizer (bool, optional): 是否使用快速分词器。缺省值:True model_revision (str, optional): 将要使用的预训练模型版本。缺省值:main use_auth_token (str, optional): 是否使用根据 huggingface-cli login 获取的认证密钥。缺省值:False quantization_bit (int, optional): 模型量化等级。缺省值:None quantization_type (str, optional): INT4 量化中使用的数据类型。缺省值:nf4 double_quantization (bool, optional): 是否在 INT4 量化中使用双重量化。缺省值:True checkpoint_dir (str, optional): 存放模型断点和配置文件的文件夹路径。缺省值:None reward_model (str, optional): 存放奖励模型断点的文件夹路径。缺省值:None resume_lora_training (bool, optional): 若是,则使用上次的 LoRA 权重继续训练;若否,则合并之前的 LoRA 权重并创建新的 LoRA 权重。缺省值:True plot_loss (bool, optional): 微调后是否绘制损失函数曲线。缺省值:False |
hparams. Data Arguments | class glmtuner.hparams.DataArguments <source> dataset (str, optional): 将要使用的数据集名称,使用英文逗号来分割多个数据集。缺省值:alpaca_zh dataset_dir (str, optional): 存放数据集文件的文件夹路径。缺省值:data split (str, optional): 在训练和评估时使用的数据集分支。缺省值:train overwrite_cache (bool, optional): 是否覆盖数据集缓存。缺省值:False preprocessing_num_workers (int, optional): 数据预处理时使用的进程数。缺省值:None max_source_length (int, optional): 分词后输入序列的最大长度。缺省值:512 max_target_length (int, optional): 分词后输出序列的最大长度。缺省值:512 max_samples (int, optional): 每个数据集保留的样本数,默认保留全部样本。缺省值:None eval_num_beams (int, optional): 评估时使用的 beam 数,该参数将会用于 model.generate。缺省值:None ignore_pad_token_for_loss (bool, optional): 在计算损失时是否忽略填充值。缺省值:True source_prefix (str, optional): 在训练和评估时向每个输入序列添加的前缀。缺省值:None dev_ratio (float, optional): 划分验证集时使用的数据量比例,应当处于 0 和 1 之间。缺省值:0 |
hparams. Finetuning Arguments | class glmtuner.hparams.FinetuningArguments <source> finetuning_type (str, optional): 训练时使用的微调方法。缺省值:lora num_layer_trainable (int, optional): Freeze 微调中可训练的层数。缺省值:3 name_module_trainable (str, optional): Freeze 微调中可训练的模块类型。缺省值:mlp pre_seq_len (int, optional): P-tuning v2 微调中的前缀序列长度。缺省值:64 prefix_projection (bool, optional): P-tuning v2 微调中是否添加前缀映射层。缺省值:False lora_rank (int, optional): LoRA 微调中的秩大小。缺省值:8 lora_alpha (float, optional): LoRA 微调中的缩放系数。缺省值:32.0 lora_dropout (float, optional): LoRA 微调中的 Dropout 系数。缺省值:0.1 lora_target (str, optional): 将要应用 LoRA 层的模块名称,使用英文逗号来分割多个模块。缺省值:query_key_value |
Seq2Seq Training Arguments | class transformers.Seq2SeqTrainingArguments <source> 我们仅列出部分关键参数,详细内容请查阅 HuggingFace Docs。 output_dir (str): 输出模型权重和日志的文件夹路径。 overwrite_output_dir (bool, optional): 是否覆盖输出文件夹。缺省值:False do_train (bool, optional): 是否执行训练。缺省值:False do_eval (bool, optional): 是否执行评估。缺省值:False do_predict (bool, optional):是否执行预测。缺省值:False per_device_train_batch_size (int, optional): 用于训练的批处理大小。缺省值:8 per_device_eval_batch_size (int, optional): 用于评估或预测的批处理大小。缺省值:8 gradient_accumulation_steps (int, optional): 梯度累加次数。缺省值:1 learning_rate (float, optional): AdamW 优化器的初始学习率。缺省值:5e-5 weight_decay (float, optional): AdamW 优化器除偏置和归一化层权重以外使用的权重衰减系数。缺省值:0.0 max_grad_norm (float, optional): 梯度裁剪中允许的最大梯度范数。缺省值:1.0 num_train_epochs (float, optional): 训练轮数(若非整数,则最后一轮只训练部分数据)。缺省值:3.0 logging_steps (int, optional): 日志输出间隔。缺省值:500 save_steps (int, optional): 断点保存间隔。缺省值:500 no_cuda (bool, optional): 是否关闭 CUDA。缺省值:False fp16 (bool, optional): 是否使用 fp16 半精度(混合精度)训练。缺省值:False predict_with_generate (bool, optional): 是否生成序列用于计算 ROUGE 或 BLEU 分数。缺省值:False |
浏览器一键微调/测试 | CUDA_VISIBLE_DEVICES=0 python src/train_web.py 目前网页 UI 仅支持单卡训练。 |
单 GPU 微调训练 | 单 GPU 微调训练 CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --stage sft \ --model_name_or_path path_to_your_chatglm_model \ --do_train \ --dataset alpaca_gpt4_zh \ --finetuning_type lora \ --output_dir path_to_sft_checkpoint \ --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 3.0 \ --plot_loss \ --fp16 参数解释:https://github.com/hiyouga/ChatGLM-Efficient-Tuning/wiki |
多 GPU 分布式微调 | 多 GPU 分布式微调 accelerate config # 首先配置分布式环境 accelerate launch src/train_bash.py # 参数同上 |
奖励模型训练 | 奖励模型训练 CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --stage rm \ --model_name_or_path path_to_your_chatglm_model \ --do_train \ --dataset comparison_gpt4_zh \ --finetuning_type lora \ --resume_lora_training False \ --checkpoint_dir path_to_sft_checkpoint \ --output_dir path_to_rm_checkpoint \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 1000 \ --learning_rate 1e-5 \ --num_train_epochs 1.0 \ --plot_loss \ --fp16 |
RLHF 训练 | RLHF 训练 CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --stage ppo \ --model_name_or_path path_to_your_chatglm_model \ --do_train \ --dataset alpaca_gpt4_zh \ --finetuning_type lora \ --resume_lora_training False \ --checkpoint_dir path_to_sft_checkpoint \ --reward_model path_to_rm_checkpoint \ --output_dir path_to_ppo_checkpoint \ --per_device_train_batch_size 2 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 1000 \ --learning_rate 1e-5 \ --num_train_epochs 1.0 \ --plot_loss |
指标评估 | 指标评估(BLEU分数和汉语ROUGE分数) CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --stage sft \ --model_name_or_path path_to_your_chatglm_model \ --do_eval \ --dataset alpaca_gpt4_zh \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint \ --output_dir path_to_eval_result \ --per_device_eval_batch_size 8 \ --max_samples 50 \ --predict_with_generate |
模型预测 | 模型预测 CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ --stage sft \ --model_name_or_path path_to_your_chatglm_model \ --do_predict \ --dataset alpaca_gpt4_zh \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint \ --output_dir path_to_predict_result \ --per_device_eval_batch_size 8 \ --max_samples 50 \ --predict_with_generate 注:如果需要预测的样本没有标签,请首先在 response 列中填入一些占位符,以免样本在预处理阶段被丢弃。 |
API 服务 | API 服务 python src/api_demo.py \ --model_name_or_path path_to_your_chatglm_model \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint 关于 API 文档请见 http://localhost:8000/docs。 |
命令行测试 | 命令行测试 python src/cli_demo.py \ --model_name_or_path path_to_your_chatglm_model \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint |
浏览器测试 | 浏览器测试 python src/web_demo.py \ --model_name_or_path path_to_your_chatglm_model \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint |
导出微调模型 | 导出微调模型 python src/export_model.py \ --model_name_or_path path_to_your_chatglm_model \ --finetuning_type lora \ --checkpoint_dir path_to_checkpoint \ --output_dir path_to_export |
更新中……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。