llamafactory微调qwen3-vl详细流程

llamafactory微调qwen3-vl详细流程

llamafactory微调qwen3-vl详细流程

目标:本文讲详细介绍多模态大模型使用llama-factory进行多模态模型微调(sft)的全部流程,以及微调后合并和工业落地部署方案。具体包括:

  1. 环境安装部署
  2. 数据集准备
  3. 启动微调
  4. 模型合并
  5. 模型部署和请求方式(vllm部署)

示例模型:
qwen2.5-vl-instruct qwen3-vl-instruct

环境安装

llama-factory环境准备

方式1 git直接下载

git clone --depth https://github.com/hiyouga/LLaMA-Factory.git 

方式2 下载项目压缩包再解压

在这里插入图片描述

python环境安装

  1. python虚拟环境创建
    • conda create --name llama_env python=3.12 (默认已安装好anaconda或者minianaconda)
    • conda activate llama_env # 进入虚拟环境
  2. 安装依赖包
    • cd LLaMA-Factory-main # 进入项目目录
    • pip install -e “.[torch,metrics]” --no-build-isolation -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
在这里插入图片描述
在这里插入图片描述

下载模型

从modelscope或者huggingface下载模型到指定目录。比如qwen3-vl。

  1. 在当前项目目录打开cmd
  2. 输入modelscope download --model Qwen/Qwen3-VL-2B-Instruct --local_dir ./qwen3_vl_model 将模型下载到models目录下。

在这里插入图片描述

启动训练(命令行)

在linux系统上,一般直接使用命令行进行训练、合并、部署。

lora微调步骤-sft任务

先使用默认数据集测试微调流程

​ 在LLaMA-Factory-main目录下:

执行 CUDA_VISIBLE_DEVICES=6 llamafactory-cli train examples/train_lora/qwen2_5vl_lora_sft.yaml开始训练画面:

在这里插入图片描述

vim examples/train_lora/qwen2_5vl_lora_sft.yaml

### model model_name_or_path: /data/hcb/LLaMA-Factory-main/qwen3_vl_model # 模型路径 image_max_pixels: 262144 video_max_pixels: 16384 trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_rank: 8 lora_target: all ### dataset dataset: mllm_demo,identity,alpaca_en_demo # video: mllm_video_demo 默认数据集,项目自带 template: qwen3_vl # 这里要改 cutoff_len: 2048 max_samples: 1000 overwrite_cache: true preprocessing_num_workers: 16 dataloader_num_workers: 4### output output_dir: saves/qwen3vl-2b/lora/sft # lora文件保存路径 logging_steps: 10 save_steps: 500 plot_loss: true overwrite_output_dir: true save_only_model: false report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 1.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000 resume_from_checkpoint: null ### eval# val_size: 0.1# per_device_eval_batch_size: 1# eval_strategy: steps# eval_steps: 500

​ 训练完成后lora模型存储在配置的目录中:

在这里插入图片描述

合并lora模型

微调完成后,需要合并原模型和lora模型。

  1. 执行合并脚本:llamafactory-cli export examples/merge_lora/qwen2_5vl_lora_sft.yaml

编辑合并脚本:vim examples/merge_lora/llama3_lora_sft.yaml

### Note: DO NOT use quantized model or quantization_bit when merging lora adapters### model model_name_or_path: /data/hcb/LLaMA-Factory-main/qwen3_vl_model # 原模型路径 adapter_name_or_path: saves/qwen3vl-2b/lora/sft # lora路径 template: qwen3_vl # 模型格式 trust_remote_code: true### export export_dir: output/qwen3vl_lora_sft export_size: 5 export_device: cpu # choices: [cpu, auto] export_legacy_format: false

​ 合并后的模型保存在配置的存储路径中。

在这里插入图片描述

训练完成。

私有训练数据准备(重要)

目前使用llama-factoy整个流程基本固化,主要就是构造不同的数据集。前面我们使用了官方提供的数据集进行了训练。现在我们构造自己的私有数据集,还是以文本类sft任务为例。

了解data目录和dataset_info.json文件

制作训练数据集,要先认识data目录以及dataset_info.json文件。LLaMA-Factory-main主目录下有一个data目录用来存放数据集文件以及数据集配置文件(dataset_info.json)。

对于我们前面使用的训练数据dataset: mllm_demo,我们可以在dataset_info.json中找到注册记录,如下图:

在这里插入图片描述

其对应的具体文件就是file_name指向的文件名,即data目录下的mllm_demo.json文件。其格式如下:

在这里插入图片描述

我们可以仿照这个格式构造自己的sft任务的数据集。

详细构造自己的sft数据集

LLama-Factoy支持的多种任务的数据集格式都在:https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README.md

多模态-图像 构造sharegpt格式参考:

在这里插入图片描述
在这里插入图片描述
  1. 将改造好的训练集文件tab_reg_samples.json文件放到LLaMA-Factory-main/data目录下

在dataset_info.json文件中注册tab_reg_samples.json数据集。具体如下:

在这里插入图片描述

LLaMA-Factory-main/data新建图片存放目录table_reg(与数据集中images下的路径一致)。将数据集中用到的图片上传到table_reg目录下。

在这里插入图片描述

我们需要把自己的数据使用脚本改造成上面的json格式。构造了一个根据图片识别其中表格的数据集。提示词中需要添加图像的占位符 然后在images列表中添加图片的具体路径。(可以添加多个图片。)

在这里插入图片描述

开始训练

数据集配置完成后,在examples/train_lora/qwen2_5vl_lora_sft.yaml训练脚本中直接引入数据集。只修改dataset:部分。

项目主目录下执行 vim examples/train_lora/qwen2_5vl_lora_sft.yaml

### model model_name_or_path: /data/hcb/LLaMA-Factory-main/qwen3_vl_model # 模型路径 image_max_pixels: 262144 video_max_pixels: 16384 trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_rank: 8 lora_target: all ### dataset dataset: table_reg # 注册的数据集名称 template: qwen3_vl cutoff_len: 2048 max_samples: 1000 overwrite_cache: true preprocessing_num_workers: 16 dataloader_num_workers: 4### output output_dir: saves/qwen3vl-2b_table/lora/sft # lora文件保存路径 logging_steps: 10 save_steps: 500 plot_loss: true overwrite_output_dir: true save_only_model: false report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]### train per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 1.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000 resume_from_checkpoint: null ### eval# val_size: 0.1# per_device_eval_batch_size: 1# eval_strategy: steps# eval_steps: 500

修改完成后执行训练:

CUDA_VISIBLE_DEVICES=6 llamafactory-cli train examples/train_lora/qwen2_5vl_lora_sft.yaml

在这里插入图片描述

后续合并步骤完全一样。

其他任务数据构造

ing…

模型部署

llama-factory也支持基本的模型部署,但是很多时候我们需要以接口调用的形式来使用大模型能力,常见的有ollma、vllm、sglang等方式,为了支持产品落地支持高并发,我们一般使用vllm部署模型,基于openai风格进行接口调用。下载详细介绍一下使用vllm部署模型并请求。

vllm安装

在当前虚拟环境中执行:pip install vllm==0.11.0 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/

在这里插入图片描述

服务启动命令(openai标准)

直接启动我们上面微调合并后的模型:

# 启动 vLLM OpenAI 兼容 API 服务器# 核心功能:将指定大模型以 OpenAI API 格式暴露服务,支持高并发、低延迟推理exportCUDA_VISIBLE_DEVICES=6# 指定使用哪个gpu python -m vllm.entrypoints.openai.api_server \ --host 0.0.0.0 \# 绑定所有网络接口,允许外部机器访问(仅内网环境建议使用) --port 8003\# API 服务监听端口,客户端通过该端口调用(自定义) --model /data/hcb/LLaMA-Factory-main/output/qwen3vl_lora_sft \# 模型文件本地路径 --served-model-name qwen3_vl \# 对外暴露的模型名称(客户端调用时指定该名称) --trust-remote-code \# 信任模型仓库中的自定义代码(部分模型需要自定义加载逻辑) --dtype float16 \# 模型推理数据类型(float16 平衡性能和精度,适配多数GPU) --gpu-memory-utilization 0.8\# GPU 显存利用率上限(根据实际情况调整) --tp 1\# 张量并行度(1 表示单卡推理,多卡时需调整为显卡数量)# 上面是命令介绍 可以直接用下面这行启动CUDA_VISIBLE_DEVICES=6 python -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --port 8003 --model /data/hcb/LLaMA-Factory-main/output/qwen3vl_lora_sft --served-model-name qwen3_vl --trust-remote-code --dtype float16 --gpu-memory-utilization 0.8

启动成功:

在这里插入图片描述

服务请求

代码请求
""" @version: python3.9 @author: hcb @software: PyCharm @file: multimodal_request.py @time: 2025/11/15 07:20 """import openai import base64 import os from openai import OpenAI defencode_image(image_path):"""将图像文件编码为base64"""withopen(image_path,"rb")as image_file:return base64.b64encode(image_file.read()).decode('utf-8')defmultimodal_chat(image_path=None, text_prompt="描述这张图片"):""" 多模态聊天请求 Args: image_path: 图像文件路径 text_prompt: 文本提示 """ client = OpenAI( api_key="Empty", base_url="http://10.10.185.9:8803/v1/"# 你的vLLM服务器地址和端口)# 构建消息内容 messages =[{"role":"system","content":"你是一个多模态智能助手,可以理解和分析图像内容。"}]# 如果有图像,添加多模态内容if image_path and os.path.exists(image_path): base64_image = encode_image(image_path) user_content =[{"type":"text","text": text_prompt },{"type":"image_url","image_url":{"url":f"data:image/jpeg;base64,{base64_image}"}}]else:# 如果没有图像,只发送文本 user_content = text_prompt messages.append({"role":"user","content": user_content }) payload ={"model":"qwen3_vl",# 你设置的模型名称"messages": messages,"temperature":0.1,"max_tokens":2000}print("请求payload结构:")print(f"- 模型: {payload['model']}")print(f"- 消息数量: {len(payload['messages'])}")if image_path:print(f"- 包含图像: {image_path}")print(f"- 提示词: {text_prompt}")try:# 发送请求 response = client.chat.completions.create(**payload, timeout=30# 多模态请求可能需要更长时间)return response except Exception as e:print(f"请求失败: {e}")returnNoneif __name__ =="__main__":# 直接测试特定图片 image_path =r"C:\Users\15941\Desktop\临时\副业\宠物\狗头舔脚\2.png"# 修改为你的图片路径 prompt ="描述这张图片中有什么"if os.path.exists(image_path):print(f"正在分析图片: {image_path}") res = multimodal_chat(image_path=image_path, text_prompt=prompt)if res and res.choices:print("\n模型回复:")print(res.choices[0].message.content)else:print("请求失败")

结果:

在这里插入图片描述

Read more

AI编译器入门:TVM与MLIR如何将深度学习模型映射到任意硬件——连接算法与芯片的桥梁

AI编译器入门:TVM与MLIR如何将深度学习模型映射到任意硬件——连接算法与芯片的桥梁

点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 第一章:AI编译器的崛起:从手工优化到自动化部署 1.1 深度学习部署的“碎片化”困局 深度学习技术的快速发展带来了一个严峻挑战:算法创新速度远超硬件生态演进速度。根据MLPerf基准测试报告,2020年至2023年间,新发布的深度学习模型数量增长了约300%,而硬件架构类型(CPU、GPU、NPU、ASIC、FPGA等)的多样性也呈指数级增长。这种碎片化生态导致了一个核心矛盾:训练框架(如PyTorch、TensorFlow)输出的模型如何高效运行在千差万别的硬件平台上? 传统部署路径的问题: PyTorch模型 → ONNX → TensorRT(仅NVIDIA)→ GPU ↘ CoreML(仅Apple)→ iPhone NPU ↘ NCNN(移动端)→ 安卓CPU ↘ OpenVINO(仅Intel)→ CPU/VPU

By Ne0inhk
一文彻底搞清楚数据结构之快速排序和归并排序的深入优化

一文彻底搞清楚数据结构之快速排序和归并排序的深入优化

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》《数据结构与算法初阶》 ✨逆境不吐心中苦,顺境不忘来时路!🎬 博主简介: 前言:前面小编已经介绍八大排序算法的基本思想和实现方法!但关于其中的快速排序和归并排序还有一些细节可以优化!接下来跟着小编来看看快速排序和归并排序的深入优化,学习一下优化完之后,具体在实际中的应用!废话不多说,下面跟着小编的节奏🎵一起学习吧! 目录 * 1.快速排序性能的关键点分析 * 1.1三路划分算法思想讲解 * 1.2hoare和lomuto和三路划分单趟排序代码分析 * 1.3三种快排单趟排序运⾏结果分析 * 2.排序数组OJ题 * 2.1lomuto的快速排序跑排序数组OJ题 * 2.2hoare的快速排序跑排序数组OJ题 * 2.3三路划分的快速排序跑排序数组OJ题 * 2.4introsort的快速排序跑排序数组OJ题 * 3.外排序介绍 * 3.1创建随机数据⽂件的代码 * 3.2⽂件归并排序思路分析 * 3.3⽂件归并排序代码实现 * 3.4非递归版

By Ne0inhk
【数据结构】二叉搜索树 C++ 简单实现:增删查改全攻略

【数据结构】二叉搜索树 C++ 简单实现:增删查改全攻略

目录 前言: 1、什么是二叉搜索树? 2、二叉搜索树性能分析 3、key类型二叉搜索树的实现 节点结构 类结构 3.1、插入 3.2、中序遍历 3.3、查找 3.4、删除 4、key_value类型二叉搜索树的实现 节点结构 类结构 4.1、构造函数 4.1.1 默认构造 4.1.2 拷贝构造 4.2、赋值重载 4.3、析构 4.4、插入 总结 前言: 今天这篇,

By Ne0inhk
解锁动态规划的奥秘:从零到精通的创新思维解析(4)

解锁动态规划的奥秘:从零到精通的创新思维解析(4)

解锁动态规划的奥秘:从零到精通的创新思维解析(4) 前言: 小编在前几天讲述了动态规划相关的题目,今天继续跟着上次的脚步,继续进行动态规划相关题目的讲解,下面我们一起走进动态规划的世界。 正文: 1.珠宝的最高价值 1.1.题目来源 和之前一样,本题同样来自于力扣,下面给出它的链接:LCR 166. 珠宝的最高价值 - 力扣(LeetCode) 1.2.题目解析 本题目其实就是个pro版本的不同的路径问题,这个问题小编在之前的博客解答过,由于本文章写的时候那篇文章还没有发布,所以各位想看那个题目的可以进我主页来看一下:忘梓.-ZEEKLOG博客,下面进入正题,本题目是给定我们一个二维矩阵的珠宝价,并且每一个位置都有其价值,现在给定了我们几个规则,简单来说就是:我们从左上角开始拿珠宝,每次我们可以选择从右边或者下边走进行拿珠宝直到我们走到珠宝架子的右下角,问我们如何拿珠宝才可以拿到最高价值的珠宝,经过我这么一说,相信不少小伙伴都可以想到不同的路径那个题目,只不过此时这个题目与那个题目的不同就是本题是求解走到右下角时的珠宝的最高价值,题目的分析就到这里,下面我们进行本题目

By Ne0inhk