跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

LLaMA-Factory 微调 Qwen3-VL 详细流程

介绍使用 LLaMA-Factory 对 Qwen3-VL 多模态大模型进行微调的完整流程。内容包括环境搭建、模型下载、LoRA 微调配置、私有数据集构造、模型权重合并以及基于 vLLM 的高并发部署方案。通过命令行操作完成 SFT 任务,并提供 OpenAI 兼容接口的 Python 调用示例,适用于工业级落地场景。

链路追踪发布于 2026/4/6更新于 2026/5/2223 浏览
LLaMA-Factory 微调 Qwen3-VL 详细流程

LLaMA-Factory 微调 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 1 https://github.com/hiyouga/LLaMA-Factory.git
方式 2 下载项目压缩包再解压

[图片]

Python 环境安装

  1. Python 虚拟环境创建
    • conda create --name llama_env python=3.12 (默认已安装好 anaconda 或者 miniconda)
    • 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. 在当前项目目录打开终端
  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/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/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-Factory 整个流程基本固化,主要就是构造不同的数据集。前面我们使用了官方提供的数据集进行了训练。现在我们构造自己的私有数据集,还是以文本类 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-Factory 支持的多种任务的数据集格式都在: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/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

[图片]

后续合并步骤完全一样。

其他任务数据构造

待补充

模型部署

LLaMA-Factory 也支持基本的模型部署,但是很多时候我们需要以接口调用的形式来使用大模型能力,常见的有 Ollama、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 格式暴露服务,支持高并发、低延迟推理
export CUDA_VISIBLE_DEVICES=6
# 指定使用哪个 gpu
python -m vllm.entrypoints.openai.api_server \
--host 0.0.0.0 \
# 绑定所有网络接口,允许外部机器访问(仅内网环境建议使用)
--port 8003\
# API 服务监听端口,客户端通过该端口调用(自定义)
--model /data/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/LLaMA-Factory-main/output/qwen3vl_lora_sft --served-model-name qwen3_vl --trust-remote-code --dtype float16 --gpu-memory-utilization 0.8

启动成功:

[图片]

服务请求
代码请求
import openai
import base64
import os
from openai import OpenAI

def encode_image(image_path):
    """将图像文件编码为 base64"""
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

def multimodal_chat(image_path=None, text_prompt="描述这张图片"):
    """ 多模态聊天请求 Args: image_path: 图像文件路径 text_prompt: 文本提示 """
    client = OpenAI(
        api_key="Empty",
        base_url="http://127.0.0.1:8003/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}")
        return None

if __name__ == "__main__":
    # 直接测试特定图片
    image_path = r"C:\Users\Public\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("请求失败")

结果:

[图片]

目录

  1. LLaMA-Factory 微调 Qwen3-VL 详细流程
  2. 环境安装
  3. LLaMA-Factory 环境准备
  4. 方式 1 Git 直接下载
  5. 方式 2 下载项目压缩包再解压
  6. Python 环境安装
  7. 下载模型
  8. 启动训练(命令行)
  9. LoRA 微调步骤-SFT 任务
  10. model
  11. method
  12. dataset
  13. output
  14. train
  15. eval
  16. val_size: 0.1
  17. perdeviceevalbatchsize: 1
  18. eval_strategy: steps
  19. eval_steps: 500
  20. 合并 LoRA 模型
  21. Note: DO NOT use quantized model or quantization_bit when merging lora adapters
  22. model
  23. export
  24. 私有训练数据准备(重要)
  25. 了解 data 目录和 dataset_info.json 文件
  26. 详细构造自己的 SFT 数据集
  27. 开始训练
  28. model
  29. method
  30. dataset
  31. output
  32. train
  33. eval
  34. val_size: 0.1
  35. perdeviceevalbatchsize: 1
  36. eval_strategy: steps
  37. eval_steps: 500
  38. 其他任务数据构造
  39. 模型部署
  40. vLLM 安装
  41. 服务启动命令(OpenAI 标准)
  42. 启动 vLLM OpenAI 兼容 API 服务器
  43. 核心功能:将指定大模型以 OpenAI API 格式暴露服务,支持高并发、低延迟推理
  44. 指定使用哪个 gpu
  45. 绑定所有网络接口,允许外部机器访问(仅内网环境建议使用)
  46. API 服务监听端口,客户端通过该端口调用(自定义)
  47. 模型文件本地路径
  48. 对外暴露的模型名称(客户端调用时指定该名称)
  49. 信任模型仓库中的自定义代码(部分模型需要自定义加载逻辑)
  50. 模型推理数据类型(float16 平衡性能和精度,适配多数 GPU)
  51. GPU 显存利用率上限(根据实际情况调整)
  52. 张量并行度(1 表示单卡推理,多卡时需调整为显卡数量)
  53. 上面是命令介绍 可以直接用下面这行启动
  54. 服务请求
  55. 代码请求
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 微信“拍一拍”功能原理与一行核心代码解析
  • 数据结构复习:链表详解与 Java LinkedList 应用
  • macOS 使用 n 管理 Node.js 版本解决权限问题
  • MCP 协议详解:与 Function Call 的区别及 Python 使用指南
  • C++与Linux:文件操作底层接口详解
  • MS-S1 MAX 与 AI MAX 395 在 Ubuntu 24 使用 Vulkan 版 llama.cpp 运行 gpt-oss 120b
  • Python 代码打包成可执行文件的六种主流方案及优缺点对比
  • Python 多线程 SSH 文件传输工具设计与实现
  • GpuGeek 平台:AI 开发者与中小企业的算力解决方案
  • Linux 命令行进度条实现原理解析
  • 基于 Django 的 4S 店客户管理系统设计与实现
  • 数据库 SQL 防火墙:内核级防护与 SQL 注入防御实战
  • Python 爬虫基础:requests 库详解
  • 为什么有人劝你别学Python?底层逻辑与小白学习建议
  • 超越宏与指针:用现代C++思想重构STM32寄存器访问模式
  • HarmonyOS6 底部导航栏组件 rc_concave_tabbar 使用指南
  • Python 数据统计实战指南:从环境配置到高级分析
  • LLM 提示工程技巧总结:从 Zero-Shot 到 Chain-of-Thought
  • FastReport Open Source:.NET 报表生成解决方案解析
  • 基于 Python 的 Web 与 App 端自动化测试实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online