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

LLaMA-Factory 微调多模态大模型 Qwen3-VL

使用 LLaMA-Factory 框架对 Qwen3-VL 多模态大模型进行微调的完整流程。内容涵盖环境准备、模型下载、WebUI 微调配置、LoRA 参数合并导出、vLLM 服务部署及 API 测试。适合拥有 NVIDIA GPU 资源的开发者快速上手本地化多模态模型训练与推理。

信号故障发布于 2026/4/6更新于 2026/5/2244 浏览
LLaMA-Factory 微调多模态大模型 Qwen3-VL

LLaMA-Factory 微调多模态大模型 Qwen3-VL

1. 显卡驱动

  • 显卡型号:NVIDIA GeForce RTX 3090 24G
  • 显卡驱动:NVIDIA-SMI 535.171.04
  • CUDA: 12.2 ,Driver Version: 535.171.04

微调 Qwen3-VL-2B 模型,至少需要 12G 显存

2. 模型微调

项目采用大型语言模型工厂(LLaMA-Factory)对大模型微调,目前可支持 Qwen3 / Qwen2.5-VL / Gemma 3 / GLM-4.1V / InternLM 3 / MiniCPM-o-2.6 等大模型。下面以微调 Qwen3-VL-2B-Instruct 作为例子进行说明。

微调之前,请先下载 Qwen3-VL 基础模型。下载方法可以选择 modelscope 和 huggingface,国内建议选择 modelscope,避免翻墙问题。

modelscope 下载 Qwen3-VL-2B-Instruct 方法,模型默认保存在 ~/.cache/modelscope/hub/models/

# 使用 modelscope 下载模型 Qwen3-VL-2B-Instruct # 模型保持在 ~/.cache/modelscope/hub/models/ modelscope download --model Qwen/Qwen3-VL-2B-Instruct 

微调其他 Qwen3-VL 版本,请参考地址:

  • https://www.modelscope.cn/models/Qwen/Qwen3-VL-2B-Instruct
  • https://www.modelscope.cn/models/Qwen/Qwen3-VL-4B-Instruct
  • https://www.modelscope.cn/models/Qwen/Qwen3-VL-8B-Instruct

LLaMA-Factory 安装教程,请参考官方文档:

https://github.com/hiyouga/LLaMA-Factory

安装好 LLaMA-Factory 后,激活环境,然后终端输入(默认端口是 7860):

export CUDA_VISIBLE_DEVICES=0 # 指定运行 GPU export GRADIO_SERVER_PORT=30000 # 指定 gradio 的端口 (默认是 7860,这里修改为 30000) export GRADIO_TEMP_DIR="~/.cache/gradio" # 指定 gradio 临时缓存路径,解决上传图片权限的问题 llamafactory-cli webui # 启动 llamafactory web 服务

浏览器打开 http://0.0.0.0:30000/ (默认端口是 7860,为避免端口冲突,可以通过 export GRADIO_SERVER_PORT=30000 修改端口),并按照配置如下信息:

  • 模型名称:选择'Qwen3-VL-2B-Instruct',你也可以使用 Qwen3-VL 更大参数量的模型,如 7B

  • 模型路径:请填写服务器 Qwen3-VL-2B-Instruct 模型文件路径绝对地址

  • 模型下载源:可以选择'modelscope'和'huggingface',国内建议选择'modelscope'避免翻墙。注意:选择'modelscope'时,模型路径必须填写绝对地址,否则不能正常加载模型。

  • 微调方法:建议选择'lora'

  • 数据路径:数据路径必须包含 dataset_info.json,默认是 LLaMA-Factory 项目的./data 路径,由于我们使用外部数据训练,因此数据路径设置为项目根目录./data 绝对路径。

  • 数据集:数据集采样 sharegpt 格式,项目已经构建了一个多模态数据集 anomaly-train 这是一个异常行为的视频数据集。

  • 预览数据集:如果数据路径正常,点击'预览数据集',可以正常查看数据的,反之数据路径错误。

  • 预览命令:可以查看训练的命令行

  • 开始:一切准备好后,点击开始训练

  • 如果训练正常的,可以出现如下信息:

3. 模型导出

基于 LoRA 训练的模型,默认情况下,输出目录只保存了增量的训练参数;你还需要将原始基础模型 (--model_name_or_path) 和 LoRA 适配器参数 (--adapter_name_or_path) 进行合并,生成一个独立的、无需额外加载适配器即可运行的完整模型,便于后续部署或分享。

#!/usr/bin/env bash # TODO Lora+model 合并,参数说明: #--model_name_or_path:原始基础模型路径,可使用 modelscope download --model Qwen/Qwen3-VL-2B-Instruct 下载 #--adapter_name_or_path:LoRA 适配器路径(即训练输出目录) #--export_dir:合并后模型的保存路径 #--template default:Qwen3-VL 可使用 default,也可尝试 qwen_vl(但通常自动识别) #--trust_remote_code True:Qwen 系列模型必需 export CUDA_VISIBLE_DEVICES=0 model_name_or_path=~/.cache/modelscope/hub/models/Qwen/Qwen3-VL-2B-Instruct adapter_name_or_path=saves/Qwen3-VL-2B-Instruct/lora/train_2025-12-22-18-08-22/checkpoint-440 export_dir=saves/Qwen3-VL-2B-Instruct/lora/train_2025-12-22-18-08-22/Qwen3-VL-2B-Instruct llamafactory-cli export \ --model_name_or_path $model_name_or_path \ --adapter_name_or_path $adapter_name_or_path \ --template default \ --finetuning_type lora \ --export_dir $export_dir \ --trust_remote_code True 
  • llamafactory-cli export 调用 LLaMA-Factory 的命令行接口(CLI),执行 export 操作,即导出合并后的模型。
  • model_name_or_path $model_name_or_path 指定基础模型(base model)的路径或 Hugging Face 模型 ID。例如:Qwen/Qwen3-VL-2B-Instruct 或本地路径 ~/.cache/modelscope/hub/models/Qwen/Qwen3-VL-2B-Instruct。
  • adapter_name_or_path $adapter_name_or_path 指定微调后保存的 LoRA 适配器(adapter)的路径。通常是通过 LLaMA-Factory 微调后生成的包含 adapter_model.safetensors 或 adapter_model.bin 的目录。
  • template default 指定对话模板(chat template)名称。default 表示使用 LLaMA-Factory 中预设的默认模板(通常适用于无特殊对话格式的模型)。其他值如 llama3、chatglm3 等会根据模型格式自动选择对应的输入格式。
  • finetuning_type lora 指定微调方法类型。此处为 lora,表示使用的是 LoRA(Low-Rank Adaptation)微调。LLaMA-Factory 也支持 full(全参数微调)或 pissa 等类型。
  • export_dir $export_dir 指定合并后模型的输出目录。导出的模型将保存在此路径下,包含 tokenizer、config、权重等完整结构,可直接用于推理或部署。
  • trust_remote_code True 允许加载远程自定义代码(如某些 Hugging Face 模型需要 modeling_xxx.py 等自定义文件)。对于需要自定义建模逻辑的模型(如 ChatGLM、Qwen 等)必须启用该选项。

4. 模型部署:vLLM 服务

模型训练好后,项目推荐使用 vLLM 部署模型

  • 源码:https://github.com/vllm-project/vllm
  • 文档:https://vllm.hyper.ai/docs/
  • 安装:pip install vllm
#!/usr/bin/env bash # TODO 启动 vllm 服务 export CUDA_VISIBLE_DEVICES=0 # http://0.0.0.0:8000/v1 # model_path=~/.cache/modelscope/hub/models/Qwen/Qwen3-VL-2B-Instruct # 原始基础模型路径 model_path=saves/Qwen3-VL-2B-Instruct/lora/train_2025-12-22-18-08-22/Qwen3-VL-2B-Instruct # Lora 微调 (合并) 后的模型路径 vllm serve $model_path --dtype auto --max-model-len 7680 --max_num_seqs 32 --api-key token-abc123 --gpu_memory_utilization 0.95 --trust-remote-code 
  • api-key 是自定义的服务接口的 API 访问密钥,后面接口调用需要使用。客户端请求需包含:Authorization: Bearer token-abc123,保护服务器免受未授权访问
  • model_path 请填写 Lora 微调 (合并) 后的模型路径
  • dtype auto 自动选择模型加载的数据类型,优先使用模型配置文件指定的 dtype。如果没有指定,会根据模型大小和可用 GPU 内存自动选择。常见选择:float16、bfloat16、float32
  • max-model-len 设置模型支持的最大上下文长度(token 数),通常是 2048 或 4096
  • max_num_seqs 设置批处理的最大序列数,控制同时处理的最大请求
  • gpu_memory_utilization 设置 GPU 内存利用率目标,0.95 的含义:尝试使用 95% 的可用 GPU 内存

启动成功后,可以看到 Starting vLLM API server 0 on http://0.0.0.0:8000 等信息,这是就是 vLLM 服务接口,后续可以基于该接口实现聊天对话功能。关于接口说明,请参考 https://vllm.hyper.ai/docs/

5. 测试效果

调用 vLLM API 进行多模态对话,测试脚本如下:

# -*- coding: utf-8 -*- import os import traceback from openai import OpenAI from pybaseutils import image_utils, base64_utils url = "http://0.0.0.0:8000/v1" # vLLM 地址 url + /chat/completions key = "token-abc123" # API 密钥,需与启动服务时设置的 (--api-key) 保持一致 class Client(): """调用 vLLM API 进行多模态对话""" def __init__(self, url, key, model=None): """ 初始化 Client 类 :param url: vLLM API 地址 :param key: API 密钥 :param model: 模型名称 """ self.url = url self.key = key self.model = model self.services = OpenAI(api_key=self.key, base_url=self.url) print(f"url:{self.url}, key:{self.key}, model:{self.model}") def chat(self, messages, T=0.0): """ :param messages: 多模态消息列表 :param T: 温度参数 :return: 模型回复内容 """ result = None try: response = self.services.chat.completions.create(model=self.model, messages=messages, seed=2024, temperature=T) contents = response.choices[0].message.content result = contents if isinstance(contents, str) else contents[0]['text'] except Exception as e: traceback.print_exc() return result if __name__ == "__main__": image_file = "./data/test.jpg" assert os.path.exists(image_file), f"{image_file} not exists" image = image_utils.read_image(image_file, use_rgb=True) messages = [{ "role": "user", "content": [ {"type": "text", "text": "请详细描述这张图片"}, {"type": "image_url", "image_url": {"url": image}}, ] }] messages = base64_utils.serialization(messages, prefix="data:image/jpeg;base64,", use_rgb=True) client = Client(url=url, key=key) output = client.chat(messages) print(output) 

这次测试图片:

这是输出结果:

目录

  1. LLaMA-Factory 微调多模态大模型 Qwen3-VL
  2. 1. 显卡驱动
  3. 2. 模型微调
  4. 使用 modelscope 下载模型 Qwen3-VL-2B-Instruct # 模型保持在 ~/.cache/modelscope/hub/models/ modelscope download --model Qwen/Qwen3-VL-2B-Instruct
  5. 3. 模型导出
  6. 4. 模型部署:vLLM 服务
  7. 5. 测试效果
  8. -- coding: utf-8 -- import os import traceback from openai import OpenAI from pybaseutils import imageutils, base64utils url = "http://0.0.0.0:8000/v1" # vLLM 地址 url + /chat/completions key = "token-abc123" # API 密钥,需与启动服务时设置的 (--api-key) 保持一致 class Client(): """调用 vLLM API 进行多模态对话""" def init(self, url, key, model=None): """ 初始化 Client 类 :param url: vLLM API 地址 :param key: API 密钥 :param model: 模型名称 """ self.url = url self.key = key self.model = model self.services = OpenAI(apikey=self.key, baseurl=self.url) print(f"url:{self.url}, key:{self.key}, model:{self.model}") def chat(self, messages, T=0.0): """ :param messages: 多模态消息列表 :param T: 温度参数 :return: 模型回复内容 """ result = None try: response = self.services.chat.completions.create(model=self.model, messages=messages, seed=2024, temperature=T) contents = response.choices[0].message.content result = contents if isinstance(contents, str) else contents[0]['text'] except Exception as e: traceback.printexc() return result if name == "main": imagefile = "./data/test.jpg" assert os.path.exists(imagefile), f"{imagefile} not exists" image = imageutils.readimage(imagefile, usergb=True) messages = [{ "role": "user", "content": [ {"type": "text", "text": "请详细描述这张图片"}, {"type": "imageurl", "imageurl": {"url": image}}, ] }] messages = base64utils.serialization(messages, prefix="data:image/jpeg;base64,", usergb=True) client = Client(url=url, key=key) output = client.chat(messages) print(output)
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Qwen3-VL 结合 LLaMA-Factory 进行 Grounding 任务 LoRA 微调
  • C++11 核心新特性详解:初始化、引用与移动语义
  • 金仓数据库与 InfluxDB 时序性能对比及 SQL 兼容性分析
  • Git LFS 安装教程:Linux、macOS 与 Windows 全平台指南
  • Mac 抹除重装卡在激活锁的两种解锁方案
  • 2026年,我整理了中国 200 多家机器人(具身智能)公司名单
  • AI 提示词工程:原理、策略与精通之道
  • 银河麒麟服务器版 Nginx Web 服务部署实战
  • 工作中常用的几种设计模式实战
  • 双指针算法进阶:从三角形计数到四数之和
  • 基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
  • Whisper-turbo 速度实测:云端 GPU 7 倍加速
  • Virt-A-Mate 虚拟实境交互软件技术特性解析
  • Linux 常用命令大全:系统管理与文件操作指南
  • 前端可视化界面开发:基于 Vue 构建 VibeThinker 交互平台
  • OpenClaw 本地优先 AI 智能体:从安装到实战部署指南
  • Git 原理与使用进阶:远程协作、标签管理及企业级开发模型
  • Tomcat 核心组件详解
  • 2024 大模型面试 100 道精选真题及答案解析
  • OpenClaw + MCP 对接 143 种工具打造全场景 AI 自动化流水线

相关免费在线工具

  • 加密/解密文本

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