LLaMA-Factory 微调 Qwen3-VL 多模态大模型指南
基于 LLaMA-Factory 框架演示如何在 NVIDIA RTX 3090 环境下使用 LoRA 方法微调 Qwen3-VL-2B-Instruct 多模态模型。流程涵盖环境准备、模型下载、WebUI 微调配置、LoRA 参数合并导出、vLLM 服务部署及 OpenAI 协议接口测试。重点解决了显存限制、数据路径配置及服务启动参数设置问题,最终实现多模态对话功能的本地化部署与验证。

基于 LLaMA-Factory 框架演示如何在 NVIDIA RTX 3090 环境下使用 LoRA 方法微调 Qwen3-VL-2B-Instruct 多模态模型。流程涵盖环境准备、模型下载、WebUI 微调配置、LoRA 参数合并导出、vLLM 服务部署及 OpenAI 协议接口测试。重点解决了显存限制、数据路径配置及服务启动参数设置问题,最终实现多模态对话功能的本地化部署与验证。

微调 Qwen3-VL-2B 模型,至少需要 12G 显存
项目采用大型语言模型工厂(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 版本,请参考官方仓库地址。
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 服务
浏览器打开 url http://0.0.0.0:30000/ (http://ip:port,默认端口是 7860,为避免端口冲突,可以通过 export GRADIO_SERVER_PORT=30000 修改端口),并按照配置如下信息:
如果训练正常的,控制台会显示相应的训练日志信息。
基于 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指定基础模型(base model)的路径或 Hugging Face 模型 ID。adapter_name_or_path指定微调后保存的 LoRA 适配器(adapter)的路径。template default指定对话模板(chat template)名称。finetuning_type lora指定微调方法类型。export_dir指定合并后模型的输出目录。trust_remote_code True允许加载远程自定义代码。模型训练好后,项目推荐使用 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
启动成功后,可以看到 Starting vLLM API server 0 on http://0.0.0.0:8000 等信息,这是就是 vLLM 服务接口,后续可以基于该接口实现聊天对话功能。
调用 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 地址
key = "token-abc123" # API 密钥,需与启动服务时设置的 (--api-key) 保持一致
class Client():
"""调用 vLLM API 进行多模态对话"""
def __init__(self, url, key, model=None):
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):
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()
result
__name__ == :
image_file =
os.path.exists(image_file),
image = image_utils.read_image(image_file, use_rgb=)
messages = [{
: ,
: [
{: , : },
{: , : {: image}},
]
}]
messages = base64_utils.serialization(messages, prefix=, use_rgb=)
client = Client(url=url, key=key)
output = client.chat(messages)
(output)
测试图片及输出结果可根据实际运行情况验证。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online