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

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

使用 LLaMA-Factory 对 Qwen3-VL 多模态大模型进行微调(SFT)的全流程。内容包括环境安装、数据集准备、LoRA 微调启动、模型合并以及基于 vLLM 的工业落地部署方案。通过命令行操作完成从依赖配置到服务启用的步骤,支持私有数据构造与 OpenAI 风格接口调用,适用于高并发场景下的模型应用。

KernelLab发布于 2026/4/5更新于 2026/5/2130 浏览
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. 在当前项目目录打开 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-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/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

后续合并步骤完全一样。

其他任务数据构造

模型部署

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/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

启动成功。

服务请求
代码请求
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://<ip>: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}")
        return None

if __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("请求失败")

结果:

目录

  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

更多推荐文章

查看全部
  • C++11/14/17 特性整理与 Effective Modern C++ 条款实践(一)
  • Rust 异步编程实战:构建高性能 WebSocket 服务
  • 链表核心算法实战解析
  • AI 时代下的低代码复兴:开发民主化的新机遇
  • 计算机二级 MS Office 必考选择题精选及备考指南
  • 二叉树深度优先遍历实战:计算布尔值与路径数字和
  • 直接 URL 下载与前端 Blob 下载:原理、区别与最佳实践
  • 基于 AI 辅助开发的在线图书借阅平台设计与实现
  • 第 14 届蓝桥杯省赛 Java A 组 Q1~Q3 题解
  • Apache ShardingSphere 高性能架构实践:读写分离与分片详解
  • C++ 算法刷题实战:重组偶数、体操队形及二叉树路径和
  • C++ 面向对象编程:继承机制深度解析
  • Python 爬虫技术快速入门
  • Python 异步编程实战:构建高性能网络应用
  • C++ STL 容器:unordered_map 与 unordered_set 底层结构解析
  • Python 爬虫入门:详解 Scrapy 爬虫框架的基本使用
  • MySQL 表基础语法:增删查改核心技巧
  • Python 3.8+ 海象运算符详解
  • OpenClaw 多 Agent 与多飞书机器人配置指南
  • Ubuntu 22.04 配置 VMware 共享文件夹实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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