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

任务

本次任务与大模型微调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 的更详细介绍:

主要功能与特点:

  1. 微调预训练模型
    • LLaMA Factory 提供了简化的接口,方便用户使用预训练模型(如 LLaMA 系列)进行微调,适用于特定的数据集和任务。它支持包括 LoRA(Low-Rank Adaptation) 等轻量化微调方法,以降低计算资源需求,特别是在训练资源有限的情况下。
  2. 分布式训练支持
    • 该工具集成了 PyTorch DistributedDeepSpeed 等技术,能够高效地执行大规模分布式训练任务。LLaMA Factory 提供了对多 GPU 和多节点环境的支持,使得大模型的训练更加高效。
  3. 集成 DeepSpeed 和 FlashAttention
    • LLaMA Factory 使用 DeepSpeed 来优化训练的内存使用和加速训练过程。同时,它也可以集成 FlashAttention,用于加速 Transformer 模型中的自注意力机制,从而有效处理长序列输入。
  4. 支持多种微调方式
    • 除了常见的 全参数微调,LLaMA Factory 还支持 参数高效微调,如 LoRA 以及其他低秩适应方法,帮助减少模型训练和推理的显存占用。
  5. 预处理和定制数据加载器
    • LLaMA Factory 提供了灵活的数据预处理接口,可以根据不同任务自定义数据加载器。它的目标是简化训练前的数据准备,方便用户快速将数据集应用于微调。
  6. 易于扩展与集成
    • 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 格式:
请添加图片描述

我们的数据格式:

{
        "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",
        "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文件夹下:
请添加图片描述
请添加图片描述

参考文献

1、【pytorch记录】pytorch的分布式 torch.distributed.launch 命令在做什么呢-CSDN博客

2、怎么查看运行服务器的ip地址和端口号码_ip端口查询-CSDN博客

3、【大模型实战教程】Qwen2.5 PyTorch模型微调入门实战-CSDN博客

<think>嗯,用户想用LLaMA-FactoryQwen2-VL模型进行微调。首先,我需要回忆一下相关的引用内容。根据引用[1]、[2]和[3],LLaMA-Factory支持Qwen2系列的微调,包括Qwen2-VL。用户可能需要具体的步骤指导,比如环境配置、数据准备、参数设置等。 首先,用户的环境配置可能需要安装必要的库,比如modelscope和LLaMA-Factory,这部分在引用[2]里提到过安装步骤。然后是模型下载,Qwen2-VL可能在ModelScope上有,用户需要下载到本地路径,并在LLaMA-Factory的配置中指定路径,这点引用[2]里的步骤四有说明。 接下来是数据准备。引用[3]提到需要准备图像和文本的多模态数据集,格式可能是JSON,包含图片路径和指令对。用户需要确保数据集的结构符合要求,可能需要参考教程里的数据准备部分。 然后是启动LLaMA-Factory的UI界面,用户需要访问本地端口,配置模型路径,选择正确的模型类型,比如Qwen2-VL。在微调参数设置时,可能需要选择LoRA等高效微调方法,调整学习率、批次大小等参数。引用[2]中的步骤七有详细的操作实践,包括训练参数预览和开始训练。 用户可能还会遇到如何导出微调后的模型的问题,引用[2]提到模型合并导出,可能需要指导用户如何操作。此外,在微调多模态模型时,需要注意图像处理部分,确保模型能正确处理图像输入,可能需要参考引用[3]中的配置。 最后,常见问题比如CUDA内存不足,可能需要建议调整批次大小或使用梯度累积。用户的问题可能还涉及如何验证微调后的模型效果,引用[1]中的启动命令可以用来进行交互测试。 需要确保步骤清晰,分点说明,并引用相关的引用内容。可能还需要提醒用户注意版本兼容性,确保LLaMA-Factory支持Qwen2-VL,以及数据格式的正确性。如果有遗漏的步骤,比如环境配置的依赖安装,可能需要补充说明。</think>以下是使用LLaMA-Factory微调Qwen2-VL模型的详细步骤: ### 一、环境准备 1. 安装基础框架: ```bash pip install "modelscope[llm]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html ``` 2. 克隆LLaMA-Factory仓库: ```bash git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .[metrics] ``` ### 二、模型与数据准备 1. 下载Qwen2-VL模型: 通过ModelScope下载模型至本地路径(示例路径:`/path/to/qwen2_vl`)[^2] 2. 准备多模态数据集: ```json [ { "image": "images/dog.jpg", "conversations": [ {"from": "human", "value": "图片中有哪些物体?"}, {"from": "gpt", "value": "一只金毛犬在草地上奔跑"} ] } ] ``` 数据集应包含图像路径和指令对话对[^3] ### 三、配置微调参数 1. 启动Web UI: ```bash CUDA_VISIBLE_DEVICES=0 python src/train_web.py ``` 访问`http://localhost:7860`[^2] 2. 关键配置项: - 模型路径:`/path/to/qwen2_vl` - 微调方法:LoRA(低秩适配) - 学习率:3e-4 - 批处理大小:根据GPU显存调整(建议从2开始) - 训练轮次:3-5 ### 四、执行微调 1. 在Web界面完成配置后: - 点击"预览命令"验证参数 - 点击"开始训练"启动微调 2. 监控训练过程: ```text Loss下降曲线应平稳收敛 每个epoch约消耗2小时(A100 80G) ``` ### 五、模型推理 1. 加载微调后的模型: ```bash llamafactory-cli chat examples/inference/qwen2_vl.yaml ``` 2. 测试多模态能力: ```python 输入:"请描述这张图片的内容" 上传测试图像验证输出质量 ``` ### 常见问题解决 1. CUDA内存不足: - 减小`per_device_train_batch_size` - 启用梯度累积`gradient_accumulation_steps` 2. 多模态数据处理异常: - 验证图像路径是否正确 - 检查EXIF格式图片是否经过预处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值