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

打印 上一主题 下一主题

主题 1847|帖子 1847|积分 5541

任务

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

LLaMA-Factory简介

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


  • 微调预训练模子

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

  • 分布式训练支持

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

  • 集成 DeepSpeed 和 FlashAttention

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

  • 支持多种微调方式

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

  • 预处理惩罚和定制数据加载器

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

  • 易于扩展与集成

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

LLaMA-Factory安装

详情可参考LLaMA-Factory官方文档,没有科学上网可能git失败

数据准备

关于数据集文件的格式,请参考 data/README_zh.md 的内容。现在LLaMA Factory支持 alpaca 格式和 sharegpt 格式的数据集。 alpaca 格式和 sharegpt 格式详情可参考大模子微调——训练数据集的格式Alpaca 和 ShareGPT-CSDN博客。
对于有监督微调数据集,从上一篇《大模子微调1》可以看出我们格式化后的数据集即为alpaca格式。
LLaMA Factory支持 alpaca 格式:

我们的数据格式:
  1. {
  2.         "instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下:\n\n### 题目:\n假设您需要构建一个二叉搜索树,其中每个节点或者是一个空的节点(称为"空节点"),或者是一个包含一个整数值和两个子树的节点(称为"数值节点")。以下是构建这棵树的规则:\n\n1. 树中不存在重复的元素。\n2. 对于每个数值节点,其左子树的所有值都小于该节点的值,其右子树的所有值都大于该节点的值。\n3. 插入一个新值到一个"空节点"时,该"空节点"会被一个包含新值的新的数值节点取代。\n4. 插入一个已存在的数值将不会改变树。\n\n请基于以上规则,回答以下选择题:\n\n### 问题:\n选择题 1:\n给定一个空的二叉搜索树,插入下列数字: [5, 9, 2, 10, 11, 3],下面哪个选项正确描述了结果树的结构?\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",
  3.         "input": "",
  4.         "output": "B"
  5.     },
复制代码
注意需要在项目data/dataset_info.json 中添加本身数据集的说明:
  1. "tuili": {     # 数据集名称
  2.   "file_name": "mydata/an_train.json",  # 数据集路径
  3.   "columns": {
  4.     "prompt": "instruction",
  5.     "query": "input",
  6.     "response": "output"
  7.     }
  8.   },
复制代码
开始训练

qwen官方文档给的是指令执行,其实也可以通过设置yaml文件执行,后者可以参考【大模子实战教程】Qwen2.5 PyTorch模子微调入门实战。
表明下官方给的多种参数含义:
  1. DISTRIBUTED_ARGS="
  2.     --nproc_per_node $NPROC_PER_NODE \ # 指定每个节点上启动多少个进程。通常这个值对应于该节点上的 GPU 数量。
  3.     --nnodes $NNODES \  # 指定训练中有多少个节点(机器)。
  4.     --node_rank $NODE_RANK \  # 指定当前节点(机器)的排名(从 0 开始)。在分布式训练中,每个节点都需要有唯一的编号,以确保正确的通信和同步。
  5.     --master_addr $MASTER_ADDR \  # 指定主节点(节点 0)的 IP 地址。
  6.     --master_port $MASTER_PORT  # 指定主节点的端口号。
  7.   "
  8. torchrun $DISTRIBUTED_ARGS src/train.py \
  9.     --deepspeed $DS_CONFIG_PATH \  # 启用 DeepSpeed 并指定配置文件路径。DeepSpeed 是一个优化框架,可以加速大规模模型的训练,并减少内存消耗。
  10.     --stage sft \  # 训练阶段的标识,通常用于区分不同的训练阶段。例如,sft 表示“Supervised Fine-Tuning”(监督微调)。
  11.     --do_train \  # 表示执行训练任务。
  12.     --use_fast_tokenizer \  # 启用快速分词器,通常会加速数据的预处理,尤其是在处理大规模文本时。
  13.     --flash_attn \  # 启用 FlashAttention,这是一种优化的自注意力计算方式,用于加速 Transformer 模型中的注意力机制,特别是处理长序列时。
  14.     --model_name_or_path $MODEL_PATH \  # 指定预训练模型的路径(或模型名称)
  15.     --dataset your_dataset \  # 指定训练的数据集,可以是本地数据集或一个公开的名称。
  16.     --template qwen \  # 指定任务的模板,这里可能是特定于模型任务的模板类型
  17.     --finetuning_type lora \  # 指定微调方法为 LoRA
  18.     --lora_target q_proj,v_proj\  # 指定 LoRA 进行微调的目标层
  19.     --output_dir $OUTPUT_PATH \  # 指定模型训练输出的路径,保存训练后的模型和日志等。
  20.     --overwrite_cache \  # 表示在处理数据时,覆盖之前的缓存。
  21.     --overwrite_output_dir \  # 表示覆盖之前的输出目录,防止意外保留旧的训练结果。
  22.     --warmup_steps 100 \  # 指定学习率预热的步数,通常用于训练开始时逐渐增大学习率,避免模型不稳定。
  23.     --weight_decay 0.1 \  # 指定权重衰减系数,用于正则化,防止过拟合。
  24.     --per_device_train_batch_size 4 \  # 每个设备(GPU)上的训练批量大小为 4。
  25.     --gradient_accumulation_steps 4 \  # 每个设备(GPU)上的训练批量大小为 4。
  26.     --ddp_timeout 9000 \  # 设置分布式数据并行(DDP)的超时时间,防止由于通信问题导致的训练崩溃。
  27.     --learning_rate 5e-6 \  
  28.     --lr_scheduler_type cosine \
  29.     --logging_steps 1 \
  30.     --cutoff_len 4096 \  # 截断输入序列的长度为 4096,通常用于限制序列长度以减少计算开销。
  31.     --save_steps 1000 \  # 每 1000 步保存一次模型检查点,确保训练过程中保存中间结果。
  32.     --plot_loss \  # 启用损失值的绘图功能,可能在训练完成后生成损失曲线。
  33.     --num_train_epochs 3 \
  34.     --bf16
复制代码
由于我当前服务器只有一张显卡,因此不用设置分布式训练参数利用下令如下:
  1. torchrun --nproc_per_node=1 ...
复制代码
  1. torchrun src/train.py \
  2.     --stage sft \
  3.     --do_train \
  4.     --model_name_or_path Qwen2-1___5B-Instruct \
  5.     --dataset tuili \
  6.     --template qwen \
  7.     --finetuning_type lora \
  8.     --lora_target q_proj,v_proj\
  9.     --output_dir Output \
  10.     --overwrite_cache \
  11.     --overwrite_output_dir \
  12.     --warmup_steps 100 \
  13.     --weight_decay 0.1 \
  14.     --per_device_train_batch_size 4 \
  15.     --gradient_accumulation_steps 4 \
  16.     --ddp_timeout 9000 \
  17.     --learning_rate 5e-6 \
  18.     --lr_scheduler_type cosine \
  19.     --logging_steps 1 \
  20.     --cutoff_len 4096 \
  21.     --save_steps 1000 \
  22.     --plot_loss \
  23.     --num_train_epochs 3 \
  24.     --bf16
复制代码
运行完后可以检察训练的结果,很多记录都在输出保存的Output文件夹下:


参考文献

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表