LLaMA-Factory是大模型微调框架,内部集成了多种微调方法,可以直接调用。
具体做法可以从官方github上找到:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
安装依赖
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
遇到包冲突时,可使用 pip install --no-deps -e .
解决。
使用ModelScope下载模型
设置环境变量:
export USE_MODELSCOPE_HUB=1 # Windows 使用 `set USE_MODELSCOPE_HUB=1`
更改yaml文件
↓这是github上的一段描述,我们更改其中yaml的内容可以快速切换模型和参数。
将github中的examples/train_lora/llama3_lora_sft.yaml修改一下,得到qwen_14b_lora_sft.yaml
### model
model_name_or_path: qwen/Qwen1.5-14B-Chat # 指定了要使用的模型或模型路径
### method
stage: sft # 微调阶段,sft通常表示有监督微调
do_train: true # 指定是否进行训练
finetuning_type: lora # 微调类型,LoRA
lora_target: all # LoRA 的目标层,'all'表示应用于所有层
### dataset
dataset: novel_zh # 数据集名称,可以是逗号分隔的多个数据集
template: qwen # 模板名称,用于指定模型或预处理模板
cutoff_len: 1024 # 截断长度,通常用于限制序列的最大长度
max_samples: 1000 # 最大样本数量,指定要处理的样本的最大数量
overwrite_cache: true # 是否覆盖缓存,设为true表示每次运行都会重新处理数据
preprocessing_num_workers: 16 # 预处理的并行工作线程数,指定同时进行预处理的线程数量
### output
output_dir: saves/qwen1.5-14b-chat/lora/sft # 输出目录,保存微调后的模型和其他文件
logging_steps: 10 # 记录日志的步骤间隔
save_steps: 500 # 保存模型的步骤间隔
plot_loss: true # 是否绘制损失曲线
overwrite_output_dir: true # 是否覆盖输出目录
### train
per_device_train_batch_size: 1 # 每个设备上的训练批量大小
gradient_accumulation_steps: 8 # 梯度累积步骤数,梯度会在这些步骤后更新
learning_rate: 1.0e-4 # 学习率
num_train_epochs: 3.0 # 训练的总轮数
lr_scheduler_type: cosine # 学习率调度器类型,余弦退火
warmup_ratio: 0.1 # 预热比例
bf16: true # 是否使用 bfloat16 精度
ddp_timeout: 180000000 # DDP(Distributed Data Parallel)超时时间
### eval
val_size: 0.1 # 验证集的比例
per_device_eval_batch_size: 1 # 每个设备上的验证批量大小
eval_strategy: steps # 评估策略,这里选择在特定步骤进行评估
eval_steps: 500 # 每隔多少步骤进行一次评估
注意:YAML 不允许使用制表符作为缩进或在其他地方。确保所有缩进都使用空格,而不是制表符。
model_name_or_path
在modelscope上搜索想要的模型。
template
最右边那一列找模型对应的template
对于所有“基座”(Base)模型,template 参数可以是 default, alpaca, vicuna 等任意值。但“对话”(Instruct/Chat)模型请务必使用对应的模板。
请务必在训练和推理时采用完全一致的模板。
base/instruct/chat的区别是什么?
Base 模型:通用的基础语言模型,未经特定任务微调。
Instruct 模型:在基础模型上进一步微调,以便更好地理解和执行指令。训练数据集包含明确指令和任务描述。
Chat 模型:专门针对对话和聊天场景进行优化,能够生成自然的多轮对话。这类模型使用大量的对话数据进行训练,以增强其在多轮对话中的表现。
stage 和 finetuning_type
https://github.com/hiyouga/LLaMA-Factory/blob/main/examples/README_zh.md
这里做的是:用lora做指令监督微调
dataset
使用自定义数据集时,请更新 data/dataset_info.json 文件。
本地文件就在其中加入:
"identity": {
"file_name": "identity.json"
},
"alpaca_en_demo": {
"file_name": "alpaca_en_demo.json"
},
"novel_zh" : {
"file_name": "novel_zh.json"
},
仅支持 alpaca 格式和 sharegpt 格式的数据集。具体的设计方式详见https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md,这里只描述指令微调数据集的构建方式。
alpaca格式
这是alpaca_zh_demo.json
也就是将数据写成这种形式:
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"output": "模型回答(必填)",
"system": "系统提示词(选填)",
"history": [
["第一轮指令(选填)", "第一轮回答(选填)"],
["第二轮指令(选填)", "第二轮回答(选填)"]
]
}
]
sharegpt格式
这是glaive_toolcall_zh_demo.json
它支持更多的角色种类,注意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。
[
{
"conversations": [
{
"from": "human",
"value": "人类指令"
},
{
"from": "function_call",
"value": "工具参数"
},
{
"from": "observation",
"value": "工具结果"
},
{
"from": "gpt",
"value": "模型回答"
}
],
"system": "系统提示词(选填)",
"tools": "工具描述(选填)"
}
]
human和gpt的写法简单易懂,function_call和observation是什么,可以详见这篇博客:
https://www.cnblogs.com/zhiyong-ITNote/p/18093770
涉及到了api调用。
LoRA 微调 推理 合并
llamafactory-cli train examples/train_lora/qwen_14b_lora_sft.yaml
llamafactory-cli chat examples/inference/qwen_14b_lora_sft.yaml
llamafactory-cli export examples/merge_lora/qwen_14b_lora_sft.yaml
先做微调,微调后的模型保存在了LLaMA-Factory/saves/qwen1.5-14b-chat/lora/sft
中。
和之前一样的方式改动yaml文件,推理。
因为还会继续训练,暂时没有合并。
遇到的问题
无法下载模型我用下面这段代码先把模型下载下来,再运行微调指令
from modelscope import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("qwen/Qwen1.5-14B-Chat", device_map="auto", trust_remote_code=True).eval()
RuntimeError
RuntimeError: RuntimeError"triu_tril_cuda_template" not implemented for 'BFloat16'
: "triu_tril_cuda_template" not implemented for 'BFloat16
transformers版本不兼容
pip install transformers==4.41.2
24G显存跑不起来,只能换了更大的机器,不过之后有机会尝试deepspeed,它可以提高分布式训练的效率和性能,优化显存使用。
画个大饼:之后有机会写一写源码分析、优化方法和大模型加速相关技术吧!
总结
**LLaMA-Factory 框架总结**LLaMA-Factory 是一个强大的大模型微调框架,其中集成了多种微调方法,可直接调用进行数据适配和优化。以下是该框架安装、使用以及一些常见问题的总结:
### 安装与依赖
1. **克隆仓库**:通过 Git 克隆 LLaMA-Factory 的官方 GitHub 仓库。
2. **安装依赖**:使用 pip 安装必要的 Python 依赖,支持 Torch 和指标计算。在出现包冲突时,可采用 `pip install --no-deps -e .` 命令解决。
### 使用 ModelScope 下载模型
- 设置环境变量 `USE_MODELSCOPE_HUB=1`,以便从 ModelScope 下载模型。
### YAML 配置
通过修改 YAML 文件(例如 `qwen_14b_lora_sft.yaml`),可以快速配置模型的微调参数和设置,包括:
- **模型信息**(`model_name_or_path`): 指定要使用的模型或模型路径。
- **微调方法**(`finetuning_type`): 如 LoRA 等。
- **数据集**(`dataset`): 包括数据集名称和模板。
- **训练和评估参数**:如批量大小、学习率、训练轮数等。
### 具体操作
1. **微调**:通过 `llamafactory-cli train` 命令进行模型微调, output_dir 中保存微调后的模型。
2. **推理**:修改 YAML 后,通过 `llamafactory-cli chat` 命令进行模型推理。
3. **合并 LoRA(可选)**: 使用特定命令合并 LoRA 权重,但由于继续训练的需求,此步骤可灵活处理。
### 常见问题与解决
- **无法下载模型**:可以通过 `modelscope` 库直接下载模型。
- **运行时错误**:如 `RuntimeError` 可能是由于 CUDA 不支持 BFloat16 而引发,解决方式之一是更换 transformers 版本或检查 GPU 支持的数据类型。
- **显存不足**:推荐在更强大的机器上运行,或者考虑使用 deepspeed 进行分布式训练以优化显存使用。
### 未来展望
提到了可能的进一步优化方向,如源码分析、优化方法和大模型加速技术的探讨,这将为 LLaMA-Factory 的高级应用和未来扩展提供可能。
### 总结
LLaMA-Factory 作为一个功能全面的大模型微调框架,通过简单的 YAML 配置即可实现数据的微调和推理,具有较高的实用价值和灵活性,适合科研工作者和开发者进行快速的模型定制和优化。