渣渣兔 发表于 2024-9-3 02:22:02

【项目记录】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 "."
碰到包辩论时,可使用 pip install --no-deps -e . 解决。
使用ModelScope下载模型

设置环境变量:
export USE_MODELSCOPE_HUB=1 # Windows 使用 `set USE_MODELSCOPE_HUB=1`
更改yaml文件

↓这是github上的一段形貌,我们更改其中yaml的内容可以快速切换模型和参数。
https://i-blog.csdnimg.cn/direct/3c07ecb1aad94c5298a3289d8378450f.png
将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上搜索想要的模型。
https://i-blog.csdnimg.cn/direct/3312e9384c514cff8e478ac456c562df.png
template

最右边那一列找模型对应的template
https://i-blog.csdnimg.cn/direct/3f1295cdd8ef46fb83d136587c365e62.png
https://i-blog.csdnimg.cn/direct/5222f18d65914543971aba3f020f91d9.png
对于所有“基座”(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
https://i-blog.csdnimg.cn/direct/ebd03ca7c6ae4bb79aa9dd14985280ee.png
这里做的是:用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
https://i-blog.csdnimg.cn/direct/339f36e907034ed1ae22ada6a4a11398.png
也就是将数据写成这种情势:
[
{
    "instruction": "人类指令(必填)",
    "input": "人类输入(选填)",
    "output": "模型回答(必填)",
    "system": "系统提示词(选填)",
    "history": [
      ["第一轮指令(选填)", "第一轮回答(选填)"],
      ["第二轮指令(选填)", "第二轮回答(选填)"]
    ]
}
]
sharegpt格式

这是glaive_toolcall_zh_demo.json
https://i-blog.csdnimg.cn/direct/3167ca71eb004c81acab974c73525908.png
它支持更多的角色种类,留意其中 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,它可以进步分布式训练的效率和性能,优化显存使用。
画个大饼:之后有机会写一写源码分析、优化方法和大模型加快相关技能吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【项目记录】LLaMA-Factory + ModelScope 指令监督微调