勿忘初心做自己 发表于 2025-3-31 08:54:14

大模子微调2——利用LLaMA-Factory微调qwen模子优化推理效果

任务

本次任务与大模子微调1——利用LoRA微调qwen模子优化推理效果相同:利用LoRA微调技能微调qwen大模子,优化大模子在逻辑推理上的答复效果。任务详情可参考第二届天下科学智能大赛逻辑推理赛道:复杂推理本领评估。
上篇《大模子微调1》本身搭建的LoRA微调框架微调qwen大模子,Qwen2.5开始,qwen官方文档已经开始说明有监督微调利用LLaMA-Factory开源工具了,本问即尝试利用LLaMA-Factory微调大模子。
https://i-blog.csdnimg.cn/direct/897113d0113c4a7a8c0ca5e3226db69a.png
LLaMA-Factory简介

LLaMA Factory 是一个用于管理和训练大语言模子(Large Language Model, LLM)的工具或框架。它可以基于现有的预训练模子(例如 Meta 的 LLaMA 模子)进行微调和优化,以适应特定的卑鄙任务。它主要关注模子的高效部署、微调以及在差别任务中的应用。以下是对 LLaMA Factory 的更详细先容:
主要功能与特点:


[*]微调预训练模子:

[*]LLaMA Factory 提供了简化的接口,方便用户利用预训练模子(如 LLaMA 系列)进行微调,实用于特定的数据集和任务。它支持包括 LoRA(Low-Rank Adaptation) 等轻量化微调方法,以低落盘算资源需求,特别是在训练资源有限的情况下。

[*]分布式训练支持:

[*]该工具集成了 PyTorch Distributed 和 DeepSpeed 等技能,能够高效地执行大规模分布式训练任务。LLaMA Factory 提供了对多 GPU 和多节点环境的支持,使得大模子的训练更加高效。

[*]集成 DeepSpeed 和 FlashAttention:

[*]LLaMA Factory 利用 DeepSpeed 来优化训练的内存利用和加速训练过程。同时,它也可以集成 FlashAttention,用于加速 Transformer 模子中的自注意力机制,从而有效处理惩罚长序列输入。

[*]支持多种微调方式:

[*]除了常见的 全参数微调,LLaMA Factory 还支持 参数高效微调,如 LoRA 以及其他低秩适应方法,资助减少模子训练和推理的显存占用。

[*]预处理惩罚和定制数据加载器:

[*]LLaMA Factory 提供了机动的数据预处理惩罚接口,可以根据差别任务自界说数据加载器。它的目标是简化训练前的数据准备,方便用户快速将数据集应用于微调。

[*]易于扩展与集成:

[*]LLaMA Factory 的代码结构易于扩展,用户可以方便地集成其他的 Transformer 模子大概自界说的模子结构。这对于研究人员和开辟人员来说非常友爱,可以根据本身的需要进行定制化修改。

LLaMA-Factory安装

详情可参考LLaMA-Factory官方文档,没有科学上网可能git失败
https://i-blog.csdnimg.cn/direct/035ee5d0dced492092774cc6bcfae810.png
数据准备

关于数据集文件的格式,请参考 data/README_zh.md 的内容。现在LLaMA Factory支持 alpaca 格式和 sharegpt 格式的数据集。 alpaca 格式和 sharegpt 格式详情可参考大模子微调——训练数据集的格式Alpaca 和 ShareGPT-CSDN博客。
对于有监督微调数据集,从上一篇《大模子微调1》可以看出我们格式化后的数据集即为alpaca格式。
LLaMA Factory支持 alpaca 格式:
https://i-blog.csdnimg.cn/direct/b4bf0a66aa734f44b43955d8017a69ba.png
我们的数据格式:
{
      "instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为\"答案是:A\"。题目如下:\n\n### 题目:\n假设您需要构建一个二叉搜索树,其中每个节点或者是一个空的节点(称为\"空节点\"),或者是一个包含一个整数值和两个子树的节点(称为\"数值节点\")。以下是构建这棵树的规则:\n\n1. 树中不存在重复的元素。\n2. 对于每个数值节点,其左子树的所有值都小于该节点的值,其右子树的所有值都大于该节点的值。\n3. 插入一个新值到一个\"空节点\"时,该\"空节点\"会被一个包含新值的新的数值节点取代。\n4. 插入一个已存在的数值将不会改变树。\n\n请基于以上规则,回答以下选择题:\n\n### 问题:\n选择题 1:\n给定一个空的二叉搜索树,插入下列数字: ,下面哪个选项正确描述了结果树的结构?\nA. tree(5, tree(2, tree(3, nil, nil), nil), tree(9, tree(10, nil, nil), tree(11, nil, nil)))\nB. tree(5, tree(2, nil, tree(3, nil, nil)), tree(9, nil, tree(10, nil, tree(11, nil, nil))))\nC. tree(5, tree(3, tree(2, nil, nil), nil), tree(9, nil, tree(10, tree(11, nil, nil), nil)))\nD. tree(5, nil, tree(2, nil, tree(3, nil, nil)), tree(9, tree(11, nil, nil), tree(10, nil, nil)))\n",
      "input": "",
      "output": "B"
    },
注意需要在项目data/dataset_info.json 中添加本身数据集的说明:
"tuili": {   # 数据集名称
"file_name": "mydata/an_train.json",# 数据集路径
"columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output"
    }
},
开始训练

qwen官方文档给的是指令执行,其实也可以通过设置yaml文件执行,后者可以参考【大模子实战教程】Qwen2.5 PyTorch模子微调入门实战。
表明下官方给的多种参数含义:
DISTRIBUTED_ARGS="
    --nproc_per_node $NPROC_PER_NODE \ # 指定每个节点上启动多少个进程。通常这个值对应于该节点上的 GPU 数量。
    --nnodes $NNODES \# 指定训练中有多少个节点(机器)。
    --node_rank $NODE_RANK \# 指定当前节点(机器)的排名(从 0 开始)。在分布式训练中,每个节点都需要有唯一的编号,以确保正确的通信和同步。
    --master_addr $MASTER_ADDR \# 指定主节点(节点 0)的 IP 地址。
    --master_port $MASTER_PORT# 指定主节点的端口号。
"

torchrun $DISTRIBUTED_ARGS src/train.py \
    --deepspeed $DS_CONFIG_PATH \# 启用 DeepSpeed 并指定配置文件路径。DeepSpeed 是一个优化框架,可以加速大规模模型的训练,并减少内存消耗。
    --stage sft \# 训练阶段的标识,通常用于区分不同的训练阶段。例如,sft 表示“Supervised Fine-Tuning”(监督微调)。
    --do_train \# 表示执行训练任务。
    --use_fast_tokenizer \# 启用快速分词器,通常会加速数据的预处理,尤其是在处理大规模文本时。
    --flash_attn \# 启用 FlashAttention,这是一种优化的自注意力计算方式,用于加速 Transformer 模型中的注意力机制,特别是处理长序列时。
    --model_name_or_path $MODEL_PATH \# 指定预训练模型的路径(或模型名称)
    --dataset your_dataset \# 指定训练的数据集,可以是本地数据集或一个公开的名称。
    --template qwen \# 指定任务的模板,这里可能是特定于模型任务的模板类型
    --finetuning_type lora \# 指定微调方法为 LoRA
    --lora_target q_proj,v_proj\# 指定 LoRA 进行微调的目标层
    --output_dir $OUTPUT_PATH \# 指定模型训练输出的路径,保存训练后的模型和日志等。
    --overwrite_cache \# 表示在处理数据时,覆盖之前的缓存。
    --overwrite_output_dir \# 表示覆盖之前的输出目录,防止意外保留旧的训练结果。
    --warmup_steps 100 \# 指定学习率预热的步数,通常用于训练开始时逐渐增大学习率,避免模型不稳定。
    --weight_decay 0.1 \# 指定权重衰减系数,用于正则化,防止过拟合。
    --per_device_train_batch_size 4 \# 每个设备(GPU)上的训练批量大小为 4。
    --gradient_accumulation_steps 4 \# 每个设备(GPU)上的训练批量大小为 4。
    --ddp_timeout 9000 \# 设置分布式数据并行(DDP)的超时时间,防止由于通信问题导致的训练崩溃。
    --learning_rate 5e-6 \
    --lr_scheduler_type cosine \
    --logging_steps 1 \
    --cutoff_len 4096 \# 截断输入序列的长度为 4096,通常用于限制序列长度以减少计算开销。
    --save_steps 1000 \# 每 1000 步保存一次模型检查点,确保训练过程中保存中间结果。
    --plot_loss \# 启用损失值的绘图功能,可能在训练完成后生成损失曲线。
    --num_train_epochs 3 \
    --bf16
由于我当前服务器只有一张显卡,因此不用设置分布式训练参数利用下令如下:
torchrun --nproc_per_node=1 ...
torchrun src/train.py \
    --stage sft \
    --do_train \
    --model_name_or_path Qwen2-1___5B-Instruct \
    --dataset tuili \
    --template qwen \
    --finetuning_type lora \
    --lora_target q_proj,v_proj\
    --output_dir Output \
    --overwrite_cache \
    --overwrite_output_dir \
    --warmup_steps 100 \
    --weight_decay 0.1 \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --ddp_timeout 9000 \
    --learning_rate 5e-6 \
    --lr_scheduler_type cosine \
    --logging_steps 1 \
    --cutoff_len 4096 \
    --save_steps 1000 \
    --plot_loss \
    --num_train_epochs 3 \
    --bf16
运行完后可以检察训练的结果,很多记录都在输出保存的Output文件夹下:
https://i-blog.csdnimg.cn/direct/9b937128b7f94a90a49187a46c11d4d3.png
https://i-blog.csdnimg.cn/direct/bd12715e572f4a358f8322a62f2227a5.png
参考文献

1、【pytorch记录】pytorch的分布式 torch.distributed.launch 下令在做什么呢-CSDN博客
2、怎么检察运行服务器的ip地点和端口号码_ip端口查询-CSDN博客
3、【大模子实战教程】Qwen2.5 PyTorch模子微调入门实战-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 大模子微调2——利用LLaMA-Factory微调qwen模子优化推理效果