ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

llamafactory微调qwen3-vl详细流程

llamafactory微调qwen3-vl详细流程 llamafactory微调qwen3-vl详细流程目标本文讲详细介绍多模态大模型使用llama-factory进行多模态模型微调sft的全部流程以及微调后合并和工业落地部署方案。具体包括环境安装部署数据集准备启动微调模型合并模型部署和请求方式(vllm部署)示例模型qwen2.5-vl-instruct qwen3-vl-instruct环境安装llama-factory环境准备方式1 git直接下载gitclone--depthhttps://github.com/hiyouga/LLaMA-Factory.git方式2 下载项目压缩包再解压python环境安装python虚拟环境创建conda create --name llama_env python3.12 (默认已安装好anaconda或者minianaconda)conda activate llama_env # 进入虚拟环境安装依赖包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。在当前项目目录打开cmd输入modelscope download --model Qwen/Qwen3-VL-2B-Instruct --local_dir ./qwen3_vl_model 将模型下载到models目录下。​启动训练命令行在linux系统上一般直接使用命令行进行训练、合并、部署。lora微调步骤-sft任务​先使用默认数据集测试微调流程​ 在LLaMA-Factory-main目录下vim examples/train_lora/qwen2_5vl_lora_sft.yaml### modelmodel_name_or_path: /data/hcb/LLaMA-Factory-main/qwen3_vl_model# 模型路径image_max_pixels:262144video_max_pixels:16384trust_remote_code:true### methodstage: sft do_train:truefinetuning_type: lora lora_rank:8lora_target: all### datasetdataset: mllm_demo,identity,alpaca_en_demo# video: mllm_video_demo 默认数据集项目自带template: qwen3_vl# 这里要改cutoff_len:2048max_samples:1000overwrite_cache:truepreprocessing_num_workers:16dataloader_num_workers:4### outputoutput_dir: saves/qwen3vl-2b/lora/sft# lora文件保存路径logging_steps:10save_steps:500plot_loss:trueoverwrite_output_dir:truesave_only_model:falsereport_to: none# choices: [none, wandb, tensorboard, swanlab, mlflow]### trainper_device_train_batch_size:1gradient_accumulation_steps:8learning_rate:1.0e-4 num_train_epochs:1.0lr_scheduler_type: cosine warmup_ratio:0.1bf16:trueddp_timeout:180000000resume_from_checkpoint: null### eval# val_size: 0.1# per_device_eval_batch_size: 1# eval_strategy: steps# eval_steps: 500执行 CUDA_VISIBLE_DEVICES6 llamafactory-cli train examples/train_lora/qwen2_5vl_lora_sft.yaml开始训练画面​ 训练完成后lora模型存储在配置的目录中​合并lora模型微调完成后需要合并原模型和lora模型。编辑合并脚本vim examples/merge_lora/llama3_lora_sft.yaml### Note: DO NOT use quantized model or quantization_bit when merging lora adapters### modelmodel_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### exportexport_dir: output/qwen3vl_lora_sft export_size:5export_device: cpu# choices: [cpu, auto]export_legacy_format:false执行合并脚本llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml​ 合并后的模型保存在配置的存储路径中。训练完成。私有训练数据准备重要目前使用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格式参考我们需要把自己的数据使用脚本改造成上面的json格式。构造了一个根据图片识别其中表格的数据集。提示词中需要添加图像的占位符 然后在images列表中添加图片的具体路径。可以添加多个图片。将改造好的训练集文件tab_reg_samples.json文件放到LLaMA-Factory-main/data目录下LLaMA-Factory-main/data新建图片存放目录table_reg(与数据集中images下的路径一致)。将数据集中用到的图片上传到table_reg目录下。在dataset_info.json文件中注册tab_reg_samples.json数据集。具体如下开始训练数据集配置完成后在examples/train_lora/qwen2_5vl_lora_sft.yaml训练脚本中直接引入数据集。只修改dataset:部分。项目主目录下执行 vim examples/train_lora/qwen2_5vl_lora_sft.yaml### modelmodel_name_or_path: /data/hcb/LLaMA-Factory-main/qwen3_vl_model# 模型路径image_max_pixels:262144video_max_pixels:16384trust_remote_code:true### methodstage: sft do_train:truefinetuning_type: lora lora_rank:8lora_target: all### datasetdataset: table_reg# 注册的数据集名称template: qwen3_vl cutoff_len:2048max_samples:1000overwrite_cache:truepreprocessing_num_workers:16dataloader_num_workers:4### outputoutput_dir: saves/qwen3vl-2b_table/lora/sft# lora文件保存路径logging_steps:10save_steps:500plot_loss:trueoverwrite_output_dir:truesave_only_model:falsereport_to: none# choices: [none, wandb, tensorboard, swanlab, mlflow]### trainper_device_train_batch_size:1gradient_accumulation_steps:8learning_rate:1.0e-4 num_train_epochs:1.0lr_scheduler_type: cosine warmup_ratio:0.1bf16:trueddp_timeout:180000000resume_from_checkpoint: null### eval# val_size: 0.1# per_device_eval_batch_size: 1# eval_strategy: steps# eval_steps: 500修改完成后执行训练CUDA_VISIBLE_DEVICES6 llamafactory-cli train examples/train_lora/qwen2_5vl_lora_sft.yaml后续合并步骤完全一样。其他任务数据构造ing…模型部署llama-factory也支持基本的模型部署但是很多时候我们需要以接口调用的形式来使用大模型能力常见的有ollma、vllm、sglang等方式为了支持产品落地支持高并发我们一般使用vllm部署模型基于openai风格进行接口调用。下载详细介绍一下使用vllm部署模型并请求。vllm安装在当前虚拟环境中执行pip install vllm0.11.0 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/服务启动命令openai标准直接启动我们上面微调合并后的模型# 启动 vLLM OpenAI 兼容 API 服务器# 核心功能将指定大模型以 OpenAI API 格式暴露服务支持高并发、低延迟推理exportCUDA_VISIBLE_DEVICES6# 指定使用哪个gpupython-mvllm.entrypoints.openai.api_server\--host0.0.0.0\# 绑定所有网络接口允许外部机器访问仅内网环境建议使用--port8003\# API 服务监听端口客户端通过该端口调用自定义--model/data/hcb/LLaMA-Factory-main/output/qwen3vl_lora_sft\# 模型文件本地路径--served-model-name qwen3_vl\# 对外暴露的模型名称客户端调用时指定该名称--trust-remote-code\# 信任模型仓库中的自定义代码部分模型需要自定义加载逻辑--dtypefloat16\# 模型推理数据类型float16 平衡性能和精度适配多数GPU--gpu-memory-utilization0.8\# GPU 显存利用率上限根据实际情况调整--tp1\# 张量并行度1 表示单卡推理多卡时需调整为显卡数量# 上面是命令介绍 可以直接用下面这行启动CUDA_VISIBLE_DEVICES6python-mvllm.entrypoints.openai.api_server--host0.0.0.0--port8003--model/data/hcb/LLaMA-Factory-main/output/qwen3vl_lora_sft --served-model-name qwen3_vl --trust-remote-code--dtypefloat16 --gpu-memory-utilization0.8启动成功服务请求代码请求 version: python3.9 author: hcb software: PyCharm file: multimodal_request.py time: 2025/11/15 07:20 importopenaiimportbase64importosfromopenaiimportOpenAIdefencode_image(image_path):将图像文件编码为base64withopen(image_path,rb)asimage_file:returnbase64.b64encode(image_file.read()).decode(utf-8)defmultimodal_chat(image_pathNone,text_prompt描述这张图片): 多模态聊天请求 Args: image_path: 图像文件路径 text_prompt: 文本提示 clientOpenAI(api_keyEmpty,base_urlhttp://10.10.185.9:8803/v1/# 你的vLLM服务器地址和端口)# 构建消息内容messages[{role:system,content:你是一个多模态智能助手可以理解和分析图像内容。}]# 如果有图像添加多模态内容ifimage_pathandos.path.exists(image_path):base64_imageencode_image(image_path)user_content[{type:text,text:text_prompt},{type:image_url,image_url:{url:fdata:image/jpeg;base64,{base64_image}}}]else:# 如果没有图像只发送文本user_contenttext_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])})ifimage_path:print(f- 包含图像:{image_path})print(f- 提示词:{text_prompt})try:# 发送请求responseclient.chat.completions.create(**payload,timeout30# 多模态请求可能需要更长时间)returnresponseexceptExceptionase:print(f请求失败:{e})returnNoneif__name____main__:# 直接测试特定图片image_pathrC:\Users\15941\Desktop\临时\副业\宠物\狗头舔脚\2.png# 修改为你的图片路径prompt描述这张图片中有什么ifos.path.exists(image_path):print(f正在分析图片:{image_path})resmultimodal_chat(image_pathimage_path,text_promptprompt)ifresandres.choices:print(\n模型回复:)print(res.choices[0].message.content)else:print(请求失败)结果
返回列表