当前位置:AIGC资讯 > AIGC > 正文

【项目记录】LLaMA-Factory + ModelScope 指令监督微调

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 配置即可实现数据的微调和推理,具有较高的实用价值和灵活性,适合科研工作者和开发者进行快速的模型定制和优化。

更新时间 2024-08-10