资讯动态

Qwen2.5-VL视觉语言模型LoRA微调实战:从数据准备到部署避坑

发布时间:2026/10/20 9:31:45 来源:尧图企业网站定制
在视觉语言模型VLM逐渐成为多模态应用基座的今天微调已经不是什么高不可攀的技术活。但网上大多教程要么只聊理论要么直接甩一堆代码让人跑不动要么聚焦于纯文本模型一到 VLM 就卡在图像怎么喂给模型数据到底长什么样这些问题上。这篇教程我会直接用 Qwen2.5-VL 这一系列里最适合入门与私有化落地的开源版本作为例子从环境准备、数据构造、LoRA 微调、推理验证到踩坑实录全部过一遍。无论你是做图像问答、OCR 结构化抽取、还是想给模型灌入特定领域的看图说话能力只要跟着操作都能得到可复现的流程。整篇文章我会尽量说人话中间涉及的显存估算、参数配置、数据格式这些最容易出问题的地方会带上我的实测经验和计算过程。适合有一定 Python 基础、但没怎么碰过微调的小白当然老手也可以直接跳到第 4 章看参数配置和第 6 章看避坑清单。1. 项目概览与核心技术拆解1.1 Qwen2.5-VL 能做什么不只是看图说话Qwen2.5-VL 是视觉语言模型核心能力是同时理解图像和文本输入然后输出文本内容。和纯文本大模型相比它多了视觉编码器这一层能把图片切成 patch图像块转换成视觉 token再和文本 token 一起送入语言模型。日常能做的任务非常多图像问答用户问图里的人在做什么模型基于画面内容回答OCR 识别与结构化抽取从发票、表格、名片、手写体里抽关键字段图表分析与数学推理读曲线图、柱状图算趋势、做推断视觉定位与 grounding描述物体位置、按文本找图内区域视频理解输入视频帧序列概括事件、回答内容问题这些能力对很多业务场景非常关键。比如一家做电商数据分析的团队每天要处理几千张商品主图希望自动生成卖点描述或者做医疗影像辅助的团队想从 CT 报告图片里抽取结构化结论。这种高度垂直的需求直接用通用基座模型效果往往一般因为基座模型虽然见多识广但不够专精这时就需要微调。1.2 为什么基座模型不够用微调的必要性很多人一开始会有疑问Qwen2.5-VL 官网 Demo 看起来挺聪明的我用 API 不就行了吗为什么还要自己微调答案是通用能力不等于专项能力。基座模型的知识和输出风格是平均化的。如果你直接让它帮你识别某种特殊材质表面的缺陷比如铝合金压铸件的气孔它会因为训练数据里这类样本太少给出模棱两可的描述甚至编造不存在的纹理。另外你可能有自己的一套输出格式需求比如必须输出 JSON 结构字段名、枚举值都是固定的。虽然通过 prompt 也能约束一部分但稳定性和可控性远不如微调过的模型。微调的本质是在预训练权重的基础上用你的垂直数据再做一次有监督学习让模型学会这批数据长什么样、该用什么样的格式去回答。和从零训练相比它需要的数据量小得多几百到几千条就有效果算力需求也低得多。我打个比方预训练模型像是一个读过很多书的大学生微调像是给他做了一套目标公司的入职培训他不需要重新学语文数学只需要熟悉公司内部的工作流程和话术。1.3 三种微调策略怎么选全参、LoRA 与 QLoRA微调策略大致分三类选错了要么显存不够要么效果不理想所以一开始就要想清楚方案显存需求(以7B模型为例)训练速度效果适用场景全参数微调80GB以上慢最强有A100/H100数据量大追求极限效果LoRA微调24GB-40GB快强消费级显卡数据中量性价比最高QLoRA微调12GB-20GB较快较强显卡资源紧张优先跑通流程Qwen2.5-VL 系列中适合小白入门的版本我建议选择 7B 或 3B 规格。LoRALow-Rank Adaptation的思路是冻结原模型权重在旁边加一个低秩矩阵作为可训练参数。它只更新新增的小部分参数显存占用大幅下降训练速度也快。QLoRA 更进一步把基座模型量化到 4-bit 精度再去做 LoRA显存需求可以压到十几 GB几乎平民化。我实测下来对于 7B 量级的多模态微调LoRA 在数据量 500-2000 条、训练 2-3 个 epoch 的场景下效果和全参数微调差距非常小但显存和时间的开销却低了不止一个量级。所以对本篇教程默认采用的是QLoRA 或 LoRA 方案大家可以根据自己的显存灵活调整。2. 环境准备与模型加载2.1 硬件配置与显存估算先算清楚再动手微调 VLM 和微调文本模型最大的不同就是输入除了文本还要过视觉编码器图像会被转换成几百甚至上千个视觉 token这些 token 在训练时都要参与计算显存压力比同样长度的纯文本要大不少。拿单张 224x224 或 448x448 的图片举例经过视觉塔处理后可能产生 256 到 1024 个 token。如果一张图上挂一个约 512 token 的问题训练批次batch size设为 2再用 LoRA 微调 7B 模型峰值显存大约在 22-28GB。个人经验用 4090 显卡24GB会比较紧张可以开启梯度检查点gradient checkpointing或者把 batch size 降为 1、开启梯度累积就能压下去。3B 模型会宽松很多QLoRA 模式下 12GB 显存基本可以跑。这里给出一份我的实测参考表基于 4-bit 量化 LoRA单图输入模型规模量化峰值显存推荐 GPU3B4-bit10-14GB3060 12G / 40607B4-bit16-22GB3080 12G / 40907B无量化30-40GBA100 / 多卡如果实验室或公司有多张卡可以用 DeepSpeed 或 accelerate 做简单数据并行但小白阶段不建议折腾多卡先单卡跑通再说。2.2 环境搭建Python、CUDA 与依赖库环境搭建的核心诉求是保证 PyTorch 版本、CUDA 版本、transformers 版本和模型代码能够正确兼容。Qwen2.5-VL 模型基于 transformers 库加载但它对版本有要求用太老或太新的版本都可能踩坑。推荐环境组合Python 3.10 或 3.11CUDA 11.8 或 12.1根据驱动和 PyTorch 版本定PyTorch 2.1.0 及以上建议 2.2对 SD 类注意力计算有优化transformers 4.49.0 及以上flash-attn 可选装了训练更快但安装麻烦如果用的是云服务器建议直接用 conda 建新环境避免弄坏系统自带 Pythonconda create -n qwen-vl python3.10 -y conda activate qwen-vl # 安装 PyTorch以 CUDA 12.1 为例 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 # 安装模型加载与微调相关库 pip install transformers accelerate peft bitsandbytes datasets pip install qwen-vl-utils建议再装一个 flash-attn但如果你编译老失败比如缺少 CUDA toolkit 或者系统 gcc 版本不对可以跳过把训练时相关的注意力参数调整一下就行后面会讲。注意装 bitsandbytes 时注意它是否支持当前 CUDA 版本Windows 用户在量化加载可能遇到 DLL 加载问题Linux 服务器上基本没有。2.3 模型下载与加载走通第一次推理模型从 ModelScope 或 Hugging Face 下载。国内网络环境建议使用 ModelScope速度非常快from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-VL-7B-Instruct, cache_dir./models) print(model_dir)加载模型时有几个关键点7B 模型建议直接load_in_4bitTrue这样加载后显存占用可控设备映射用device_mapauto让代码自动把模型放到合适的 GPU多模态模型需要指定trust_remote_codeTrue因为视觉部分的代码需要动态加载加载测试代码from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor from qwen_vl_utils import process_vision_info model Qwen2VLForConditionalGeneration.from_pretrained( model_dir, torch_dtypeauto, device_mapauto, load_in_4bitTrue, # QLoRA 模式 trust_remote_codeTrue ) processor AutoProcessor.from_pretrained(model_dir, trust_remote_codeTrue) # 简单推理测试 messages [ {role: user, content: [ {type: image, image: test.jpg}, {type: text, text: 请描述这张图片的内容。} ]} ] text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) image_inputs, video_inputs process_vision_info(messages) inputs processor(text[text], imagesimage_inputs, videosvideo_inputs, paddingTrue, return_tensorspt) inputs inputs.to(model.device) with torch.no_grad(): output_ids model.generate(**inputs, max_new_tokens128) output_text processor.batch_decode(output_ids, skip_special_tokensTrue) print(output_text)跑通这一步说明环境没问题接下来就可以进入数据准备阶段。3. 数据集的构建与预处理3.1 微调数据格式VLM 的数据长什么样VLM 微调数据与纯文本模型最大的区别是每条样本里都要带上图像的引用。常见做法是把图片通过model_input里的image字段传给模型文本部分使用类似 ChatML 的对话格式。Qwen2.5-VL 官方推荐的格式是 messages 结构其中 content 是一个列表可以混合 image 和 text 类型。一份标准的微调样本如下{ messages: [ { role: user, content: [ {type: image, image: data/images/001.jpg}, {type: text, text: 这张设备的仪表盘显示什么状态} ] }, { role: assistant, content: [ {type: text, text: 仪表盘显示温度正常压力值接近上限建议检查安全阀。} ] } ] }注意这里 image 字段存的是图片路径在训练脚本里需要先转换成 base64 字节流或者用 PIL 打开后转成像素数组再交给 processor 处理。不能直接拿路径硬怼进去。数据集的目录组织大致如下dataset/ images/ 001.jpg 002.jpg ... data.jsonl每条 JSON 一行方便后续用 datasets 库加载。3.2 数据清洗与标注宁缺毋滥微调效果好不好数据质量占七成以上。我第一次做 VLM 微调时犯了垃圾进垃圾出的错误用爬虫抓了一堆图片和描述没清洗就直接训练结果模型学会了输出脏话和无意义内容。后来认真做了一遍清洗效果立竿见影。我需要强调几个清洗原则图片质量删除模糊、过暗、过曝、分辨率低于 64x64 的图片如果任务识别依赖细节尺寸不要小于 224x224文本一致性描述文本必须和图片内容严格对应。如果图片是红色汽车文字却写蓝色跑车模型会被教坏答案风格统一同样的任务输出风格要一致。比如要求 JSON 输出所有答案都必须是合法 JSON没有例外去重以图片的感知哈希或 MD5 为键去重避免同图不同文本的冲突样本标注质量方面宁可每条数据多花点时间也不要盲目扩充数量。500 条高质量数据的效果往往好过 5000 条随手标注的数据。如果预算允许建议让两个人同时标注同一批数据再计算一致性不一致的重新讨论。3.3 数据增强与采样策略训练数据的多样性对 VLM 微调非常重要。通用做法是图像增强随机裁剪、旋转、颜色抖动、亮度调整。但要注意如果你的任务是 OCR 或细粒度识别过度的几何增强反而会破坏文字可读性建议只做轻微亮度和对比度调整文本模板增强同一个图片可以配不同问法。比如这张发票的总金额是多少和帮我提取这张发票里的价税合计答案一样问题表达不同能提升模型泛化能力采样策略上我习惯使用均衡采样。比如你有三类任务目标检测描述、OCR 抽取、视觉问答每一类的样本数不要差太远。如果某一类只有 50 条一类有 2000 条模型会偏向数据量大的任务。可以在 datasets 库中设置采样权重或者手动把少数类复制几份做上采样。另外一个小技巧把训练集按 9:1 切成训练/验证集。因为样本数较少切分时用stratify_by_column保持类别均衡不能盲目随机切。4. 微调实操全流程4.1 关键参数配置LoRA 的 rank、alpha 与 target_modulesLoRA 有几个参数会直接影响效果并不存在万能配置需要根据任务和数据规模调整rank秩控制可训练矩阵的维度越大表示可学习的容量越大。7B 模型常用 8-64。数据量小500左右用 8-16 就够数据量大5000可以上 32alpha缩放因子一般设为 rank 的 1-2 倍常见的是 rank16alpha32。它决定 LoRA 权重在合并时的影响强度target_modules要对哪些模块注入 LoRA 层。VLM 模型通常可以只训练语言部分的 q_proj, k_proj, v_proj, o_proj也可以加上视觉编码器里的注意力层。实际经验视觉编码器部分如果数据量小训练它反而容易过拟合建议默认先只训练语言部分Qwen2.5-VL 的实际配置参考from peft import LoraConfig, TaskType, prepare_model_for_kbit_training peft_config LoraConfig( task_typeTaskType.CAUSAL_LM, r16, lora_alpha32, lora_dropout0.05, biasnone, target_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj ] )prepare_model_for_kbit_training需要调用它可以对量化模型做预处理把某些层转为 fp32 以保证数值稳定。4.2 训练脚本全解从模型封装到数据 collator最关键的步骤是把数据和模型对接起来。Qwen2.5-VL 的 processor 处理图像时会生成 pixel_values 和 image_grid_thw图像网格的尺寸信息处理视频会生成 video_grid_thw。训练 collator 必须正确组装这些字段。我直接用 PeftModel 封装已加载的量化模型然后用 Hugging Face 的 Trainer 跑。训练脚本的核心逻辑如下from peft import prepare_model_for_kbit_training, get_peft_model, LoraConfig from transformers import Trainer, TrainingArguments, DataCollatorForSeq2Seq # 准备模型 model prepare_model_for_kbit_training(model) model get_peft_model(model, peft_config) model.print_trainable_parameters() # 应该只显示2%-5%的可训练参数 # 数据预处理函数 def process_function(examples): # 将 JSON 数据转换为输入格式 texts [] images [] for msg in examples[messages]: user_content msg[0][content] assistant_content msg[1][content] # 提取图像路径和文本 img_path None user_text for item in user_content: if item[type] image: img_path item[image] elif item[type] text: user_text item[text] assistant_text assistant_content[0][text] # 构造完整的对话模板 messages [ {role: user, content: [ {type: image, image: img_path}, {type: text, text: user_text} ]}, {role: assistant, content: [ {type: text, text: assistant_text} ]} ] prompt processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) texts.append(prompt) images.append(Image.open(img_path).convert(RGB)) # 批量处理 batch processor(texttexts, imagesimages, paddingTrue, return_tensorspt) # 用最后一个 assistant token 后面作为标签 labels batch[input_ids].clone() # 这里需要把 prompt 部分 mask 掉只让模型学习 assistant 部分 return batch上面这段是简化逻辑实际项目里要注意两个坑。第一个坑是apply_chat_template后文本里同时包含 user 和 assistant 内容训练时必须把 user 部分的 token 用 -100 mask 掉否则模型会去学习如何复述问题而不是回答问题。第二个坑是图像会变成多个 tokenlabels 需要把图像 token 位置也 mask 掉因为它们不是文本输出目标。处理这些细节时可以只对input_ids中 assistant 对应的 segment 保留原始 token id其余都置为 -100。4.3 训练超参选择与监控训练参数方面以 7B 模型 500 条数据为例我的基准配置如下training_args TrainingArguments( output_dir./qwen-vl-lora, num_train_epochs3, per_device_train_batch_size1, gradient_accumulation_steps8, learning_rate2e-4, warmup_ratio0.03, lr_scheduler_typecosine, logging_steps10, save_strategyepoch, evaluation_strategyepoch, fp16True, # 显存不够时开启混合精度 gradient_checkpointingTrue, remove_unused_columnsFalse, )几个关键参数的思考逻辑learning_rateLoRA 微调常用 1e-4 到 5e-4。数据量小用偏小的学习率比如 1e-4避免一步更新太大导致过拟合batch sizeVLM 因为图像 token 多per_device_train_batch_size 通常只能到 1 或 2用 gradient_accumulation_steps 补足总 batch sizeepochs500 条数据 2-3 个 epoch 就够。不要盲目加轮次VLM 微调非常容易过拟合epoch 太多会出现背答案现象fp16QLoRA 场景下开启同时注意bf16是否被显卡支持Ampere 以上可以30系/40系都支持训练过程中要盯几个指标loss曲线理想情况是平滑下降在验证集上先降后升的点就是开始过拟合的时机grad_norm如果一直很大超过 10说明学习率太高或数据有问题memory跟踪显存使用如果爆显存优先减小 batch size 或关掉 fp16我习惯在训练启动后每隔 20 步打印一下 loss如果 loss 在最初几十步内完全不降大概率是学习率太低或数据格式有错及时止损调参。4.4 模型合并与保存训练完成后得到的是一个 LoRA adapter权重很小通常几十 MB。可以有两种使用方式直接加载 adapter 与基座模型一起推理把 adapter 合并进基座模型导出完整权重方便部署前者适合快速验证后者适合正式上线。合并代码from peft import PeftModel # 加载原始模型 base_model Qwen2VLForConditionalGeneration.from_pretrained( model_dir, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue ) # 加载 LoRA adapter model PeftModel.from_pretrained(base_model, ./qwen-vl-lora/checkpoint-100) merged_model model.merge_and_unload() merged_model.save_pretrained(./qwen-vl-merged) processor.save_pretrained(./qwen-vl-merged)合并后模型体积和原始模型差不多7B 约 15-16GB 的 fp16 权重。保存时一定要连同 processor 一起保存因为 processor 里有图像预处理用的 mean/std、size 配置不保存的话推理时容易图片尺寸对不上。5. 效果评估与部署应用5.1 评测方法别只用肉眼判断微调完成后很多人的习惯是挑几张训练图跑一跑发现回答得挺好就觉得成功了。这非常不严谨。模型在训练集上表现好是应该的关键要看未见过图片的表现。建议准备一份独立的测试集和训练集来源不同最好是另一个时间段的截图、另一批商品图。评测时注意几个维度准确率答案和标准答案是否一致适合 OCR 抽取、分类任务格式遵循率输出是否严格符合预设 JSON 格式对大模型应用非常关键幻觉率图片里没有的信息模型是否编造。比如识别发票模型把税额写成备注就是幻觉鲁棒性同一张图换个问法答案是否稳定轻量级评测可以用脚本做字符串比对或字段提取更严谨的做法是直接用更强模型充当裁判对大模型输出打分。我常用的方法是先跑 50 条测试集人工标注完全正确 / 部分正确 / 错误三类计算一个粗略有效率作为 model 是否可上线的判断依据。5.2 快速部署本地推理与轻量服务微调后的模型如果只是自己用直接加载 merged 模型就能推理。如果要接入业务系统推荐用 vLLM 做部署吞吐量比原生 transformers 高很多。vLLM 对 Qwen2.5-VL 有原生支持一个命令就能起服务vllm serve ./qwen-vl-merged \ --task chat \ --dtype bfloat16 \ --max-model-len 8192 \ --limit-mm-per-prompt image5 \ --port 8000然后通过 OpenAI 兼容接口调用from openai import OpenAI client OpenAI(base_urlhttp://localhost:8000/v1, api_keyEMPTY) resp client.chat.completions.create( model./qwen-vl-merged, messages[{ role: user, content: [ {type: image_url, image_url: {url: https://xxx/test.jpg}}, {type: text, text: 输出这张表格的简要总结} ] }], temperature0.2 ) print(resp.choices[0].message.content)这里设置temperature0.2是因为业务场景一般期望输出稳一点不要每次推理结果都不一样。如果你做的是创意类看图写故事可以调高到 0.7 甚至 0.9。另外 vLLM 部署时要注意--limit-mm-per-prompt参数它限制每张图片能输入的 image token 数量如果图片分辨率过大会超过最大 token 限制。vLLM 起服务占用的显存会略高于直接推理因为它需要预留 KV cache 空间。7B 模型在 bf16 下约占 16GB再加 4GB 的 KV cache总共 20GB 左右实际部署时用 24GB 显卡问题不大。6. 常见问题与避坑指南6.1 显存溢出第一步就卡住显存溢出OOM是 VLM 微调最常见的报错之一。遇到CUDA out of memory别慌按以下顺序排查检查 batch sizeVLM 里batch_size1不等于显存小单张 1080p 图片可能产生 1000 多个视觉 token先改成更小的图像输入尺寸比如 448x448开启gradient_checkpointingTrue只保留前向部分激活值反向时重新计算能省约 40% 显存检查是否同时加载多个模型。很多人开着基座模型没释放又去加载训练副本显存自然不够确认量化生效。加载模型后打印model.hf_device_map并检查参数 dtype确认 llama 的lm_head等关键层是 fp32 而不是错误的 fp16还有一个容易被忽略的问题多进程数据加载会额外占显存。如果 DataLoader 的 num_workers 设置较大CPU 往 GPU 拷贝数据时会在显存里产生临时缓存。可以适当调低 num_workers或者用pin_memoryFalse速度略降但显存更稳。6.2 Loss 不降或下降极慢训练中 loss 一直不降最常见的原因是数据格式错了。VLM 的输入包含图像 token如果 processor 没有正确生成 pixel_values模型等于没有看到图像训练就成了盲猜任务loss 自然难降。排查方法在训练前单独用 processor 处理一条数据检查返回的 batch 里pixel_values是否有值、像素范围是否在 0-255还是被归一化到 0-1。另外确认图像路径能找到文件如果路径错了但代码没报错因为 PIL 自动跳过模型会收到空白图。还有一个情况是学习率设得太低。QLoRA 4-bit 量化后的模型对学习率更敏感建议lr2e-4起步如果 loss 没有变化可以增加到5e-4但超过 1e-3 就很危险容易震荡发散。6.3 过拟合与幻觉微调后反而更胡说微调数据量小最典型的副作用是过拟合和幻觉加重。模型可能对训练集里的图片背答案但对测试集图片开始胡编比如把不存在的东西说成存在。应对手段减少训练 epoch从 3 降到 1 或 2增加数据多样性同一张图配多个问题、多种回答风格在训练数据中混入一定比例5%-10%的通用对话数据帮助模型保留基础能力推理时降低 temperature或者用top_p0.8、top_k50限制采样范围如果图片任务对精确度要求高可以在 prompt 里明确加一句仅基于图片内容回答不要推测幻觉问题需要自己在测试集上反复试。我遇到过 OCR 模型把2024识别成2021的情况后来发现是训练数据里年份样本集中在 2021通过补充 2024 和 2025 样本才修正过来。6.4 中文响应差、多语言混答Qwen2.5-VL 本身中文能力不弱但微调时如果只用英文 prompt 或数据里有大量英文模板模型可能在新任务上倾向英文回答。这个问题在小数据微调时尤其明显。对策很简单数据里的中文必须原汁原味。检查两处对话模板里 system prompt 如果写了英文换成中文图像 OCR 结果里的文字和标注文字语言要保持一致不要中英混杂如果任务就是中英混合比如商品描述中英双语那就必须保证训练数据里每个样本都包含双语输出并且格式统一否则模型会随机切换语言姿态非常不稳定。这点在部署上线前一定要测试。6.5 微调后能力退化通用能力下降有时微调完发现模型在你关注的垂直任务上变强了但简单的通用问答反而变笨了。比如它认发票很准但你问李白是谁它开始胡说。这是 VLM 微调的经典问题原因是小数据集把模型参数往特定方向拽得太狠。我的经验是在微调数据中混入 10%-20% 的通用对话数据通常来源可以是该基座模型的公开指令数据集或者你自己积累的日常问答语料。这能有效缓解灾难性遗忘。另外 LoRA 的 rank 不要设太大你只想让模型记住领域模式而不是把原始知识覆盖掉。提示微调不是越训越聪明而是一次定向改造。保留基础能力的策略小学习率、小 rank、混入通用数据、及时早停。7. 从微调到上线一个完整路线图回到最初的问题打造专属 AI 看图说话能力现在已经有了一条清晰路径。我自己做完一个完整的 VLM 微调项目后最大的体会是这件事真正的门槛不在写训练脚本而在数据和质量把控。环境问题有标准答案跑一次就能复现训练脚本有无数开源模板可以参考。但数据怎么清洗、标注标准怎么定、评估集怎么设计这些才是决定最终模型能不能落地的关键。所以我建议第一次做 VLM 微调的朋友宁可先花 60% 的时间在数据上也不要急着把模型跑起来。对于下一步你可以尝试几个扩展方向把微调数据扩展到视频理解让模型不仅能看图还能看短视频片段做总结接入 RAG 流程把 OCR 抽取的字段和业务数据库连接起来构建自动归档系统用多卡并行训练更大参数量的模型比如 72B在更复杂任务上尝试全参微调最后分享一个实操小技巧微调完模型后先不要急着部署把训练过程里保存的 checkpoint 都保留下来。因为早期 checkpoint 可能在某些维度上比最终版本更好如果你发现最终版过拟合了可以退回训练中途的 checkpoint 做推理测试往往有意外惊喜。我踩过几次训到最后反而更差的坑之后现在都有意识地存 3-4 个中途结果。希望这篇教程能帮你在微调 VLM 的路上少走弯路。动手试起来你的第一版 AI 看图说话模型也许今天就能跑通。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑