【大模型】训练 Pipeline:单卡 A100 跑通文档 VLM 的 LoRA SFT 全流程|多模态大模型专栏⑥ 📅 2026/7/15 11:42:02 训练 Pipeline单卡 A100 跑通文档 VLM 的 LoRA SFT 全流程多模态大模型专栏⑥一句话讲透本篇7B 全参微调需要 120 GB 显存单卡根本放不下LoRA 把可训练参数压到 1.4%显存骤降至 17 GB。写在前面前五篇 完成了 VLM 的架构理解全景图、视觉编码器、张量流动、Projector、M-RoPE。从本篇起进入实战篇目标是在单卡 A100 80GB 上训练出一个文档领域的 VLM。本篇覆盖完整 SFT 链条数据配比、多轮 label mask、显存预算、LoRA 训练配方、停止准则与踩坑诊断。其中两份零依赖 demo显存计算器、多轮 mask 展平均附带真实运行结果。阅读本篇后可获得✅ 依据四类显存公式手工核算任意模型/精度/优化器的显存占用✅ 理解 LoRA 为何能把 7B 微调显存从 120 GB 降到 17 GB✅ 构建多轮 ShareGPT 数据的 label mask掌握有效梯度信号占比✅ 掌握文档 VLM 的数据配比、停止准则与三类典型故障诊断一、训练全景三阶段与本篇范围VLM 训练分为三个阶段本篇处理 Stage 1 与 Stage 2Stage 3 的 RL 留待下一篇阶段训练对象数据规模典型耗时7BStage 1Projector Pretrain仅 MLP Projector~500K 图文对数小时Stage 2Multimodal SFTProjector LLM (LoRA)100K–1M 指令1–2 天Stage 3RLHF / DPO / GRPOLLM (LoRA)10K–100K 偏好对半天–1 天Stage 1 让 Projector 学会维度翻译Stage 2 让 LLM 学会基于视觉 token 回答指令。本篇聚焦 Stage 2 的工程实现。二、文档领域的数据策略文档理解DocVQA / OCR / 信息抽取有三个硬约束强 OCR 依赖需高分辨率≥1024×1024、答案文字多在图上需精准定位与转录、中文场景普遍需选支持中文的编码器与 LLM。实测有效的数据配比100K 条 SFT数据源数量占比作用公开 DocVQA / ChartQA train40K40%通用文档能力底座LLaVA-OneVision-OCR25K25%提升 OCR 鲁棒性私有数据合同 / 票据 / 报告20K20%业务领域适配GPT-4V 蒸馏针对私有图10K10%扩充同图指令多样性通用 VQAVQA-v2 / GQA5K5%防止输出格式僵化两条配比经验值得注意保留 5% 通用 VQA纯文档数据训久了模型会格式僵化——只输出短答案、丧失自然描述能力少量通用数据可维持输出多样性。私有数据控制在 20%私有数据指令单一多为提取 X占比过高会让模型只会做这一件事GPT-4V 蒸馏正是为了扩充同一张私有图的指令多样性。ShareGPT 数据格式ms-swift / LLaVA 通用{id:doc_0001,image:/abs/path/doc.jpg,conversations:[{from:human,value:image\n这张图的标题是什么},{from:gpt,value:这张图的标题是《2024 年度财务报告》}]}image为占位符处理时会被替换为 N 个视觉 tokenN 由分辨率决定。code/03_sft/prepare_doc_sft_data.py提供了从 CSV 到该格式的最小转换脚本。三、多轮 label mask有效梯度信号占比第④篇 已展示单轮image展开与 label 构建。真实 SFT 数据是多轮的human, gpt, human, gpt, …难点在于跨轮次构建正确的 label mask。code/03_sft/sft_mask_walkthrough.py零依赖可跑将一条「图 2 轮对话」展平为input_ids与labels核心规则三条turn 0 [user] ▶ user ▶ image×N Look at this table . ◀ label 全 -100 turn 1 [assistant] ▶ assistant Revenue is 1,234 wan yuan . ◀ 仅 content 算 loss turn 2 [user] ▶ user What about profit ? ◀ label 全 -100 turn 3 [assistant] ▶ assistant Profit was 500 wan yuan . ◀ 仅 content 算 loss真实展平后的 40-token 序列节选关键段完整输出见 demopos 3..8 id32000 IMG label X ← 6 个视觉 slot全 -100 pos 9..14 T Look at this table . ◀ label X ← user 文本全 -100 pos15,16 T ▶ assistant label X ← role markermask pos17..22 T Revenue is 1,234 wan yuan . label 真实id ← ★ assistant 内容算 loss pos23 T ◀ label 真实id ← im_end 也学 ... Sanity checks: total tokens : 40 visual slots (IMG): 6 (expected 6) tokens with loss : 14 (expected 14) - assertions passed.关键观察40 个 token 中只有 14 个带 loss35%。有效梯度信号远小于序列长度——这正是 SFT 需要大数据量的根本原因。三类易错规则每个image展开为 N 个视觉 slotlabel 全-100视觉是输入不是目标assistant 的 role markerim_start assistantmask 掉只学内容user 整轮 mask 掉不学用户措辞。梯度累积bs1 如何等效 bs16高分辨率文档图单卡只能bs1通过梯度累积恢复有效 batch sizeper_device accum gpu effective 场景 1 16 1 16 高分文档图单卡 A100 1 16 8 128 高分文档图8 卡 2 8 1 16 中分辨率图单卡 4 4 1 16 小图 / 序列打包公式effective per_device × accum × world_size。优化器每累积accum个 micro-batch 才 step 一次等效于以大 batch 训练。四、显存预算LoRA 为何是单卡可行的关键文档常说7B bf16 14GB“activations ~15-30GB”却不给出处。本节用code/03_sft/memory_budget_demo.py零依赖可跑逐项核算字节让显存不再是黑盒。四类显存的底层算术所有显存项都遵循参数量 × 字节数 × 副本数关系公式实例1B 参数 bf16 权重1e9 × 2B 2 GB1B 参数 fp32 权重1e9 × 4B 4 GBAdamW 每个可训练参数2 × fp32m, v 8 B/param单层 transformer 激活bs × seq × hidden × 34bytes见下LoRA vs 全参微调119 GB → 17 GB同一模型Qwen2.5-VL-7Bbs1seq2048bf16开 gradient checkpointing仅可训练参数不同显存项LoRA可训 0.1B1.4%全参微调可训 7.0B1. Weights (bf16)13.04 GB13.04 GB fp32 master0.37 GB26.08 GB2. Gradients0.37 GB26.08 GB3. AdamW state (m, v)0.75 GB52.15 GB4. Activations2.46 GB2.46 GBTOTAL16.99 GB119.81 GBA100 80GB 余量63.0 GB ✓−39.8 GB ❌ 爆显存差距全部来自第 2、3 项全参微调时 AdamW state 单项就 52 GB加 fp32 master 与梯度共需 104 GB单卡根本放不下。LoRA 只训 1.4% 参数把这两项从 ~104 GB 砍到 ~1.5 GB。单卡 7B SFT 的可行性完全建立在这一 delta 上。可训参数 7B → 0.1BLoRA · 17.0 GB单卡可行AdamW state 0.75 GBfp32 master 0.37 GBGradients 0.37 GB全参微调 · 119.8 GB爆显存AdamW state 52 GBfp32 master 26 GBGradients 26 GB高分辨率图的影响seq 翻倍文档图常达 seq4096激活翻倍Activations 2.46 → 4.92 GBTOTAL 升至19.45 GB仍有 60.6 GB 余量。开 gradient checkpointing 后激活增长是亚线性的有效层数 ≈ √layers但高分图仍逼近显存上限故bs1成为硬约束。单卡可行的三个前提高分辨率图bs1 梯度累积视觉 token 多时开gradient_checkpointing视觉编码器冻结且不存梯度否则白白吃显存。五、LoRA 训练配方code/03_sft/sft_lora.sh给出基于 ms-swift 的完整配置基座 Qwen2.5-VL-7B-Instruct。关键参数swift sft\--model_typeqwen2_5_vl-7b-instruct\--train_typelora\--target_modulesq_proj k_proj v_proj o_proj gate_proj up_proj down_proj\--r64--lora_alpha128\--per_device_train_batch_size1\--gradient_accumulation_steps16\# bs1 × accum16 effective 16--gradient_checkpointingtrue\--learning_rate1e-4\# LoRA 用较大学习率--max_length4096\# 容纳高分文档图的视觉 token--num_train_epochs2\--bf16true选 Qwen2.5-VL 而非 LLaVA 作基座的原因原生中文支持、Native Dynamic Resolution M-RoPE适配密集文档、开箱即用的强 OCR。Projector 如何处理多模态 LoRA 的关键细节LLM 部分加 LoRA 与纯文本场景一致。关键问题在 Projector方案 A推荐Projector 全参训练——LoRA 只作用于 LLMProjector 普通训练方案 BProjector 加 LoRA——极致省显存但效果略差。sft_lora.sh采用方案 A。六、停止准则与过拟合信号SFT 期间每 1000 步在验证集评估文档领域必须看Exact Match / ANLSDocVQA 标准而非 BLEU。Stage 2 的关键监控观察信号: - 训练 loss 平滑下降到 0.8–1.2 ← 文档任务典型值 - DocVQA 验证 EM 升至平台期如 70% → 72% → 72.3% - POPE F1 不下降 ← 关键EM 升但 POPE 降 过拟合 幻觉 停止准则: 验证 EM 连续 3 个 checkpoint 不提升早停 vs 晚停的 trade-offSFT 步数: 1k 3k 5k 8k 12k 20k DocVQA EM: 55 68 72 73 72.5 71 ← 8k 是最优点 POPE F1: 82 85 86 85 82 78 ← 12k 起幻觉加重 通用 VQA: 88 87 86 83 80 75 ← 灾难性遗忘文档 VLM 的 SFT 通常在5K–10K 步达到最优超过 15K 步几乎必然过拟合。过拟合的三个信号训练 loss 续降但验证 EM 反降模型开始背训练集同图不同问法答案一字不差输出越来越短、越来越模板化。早停比晚停安全得多。及格线参考DocVQA EM ≥ 70%。七、实战踩坑三类典型故障诊断现象根因解决Loss 起始即 NaN图像预处理与预训练不一致严格用 SigLIP 原生 processor训练正常推理崩dtype / chat template 不一致全链路 bf16 一致 用apply_chat_templateOOM视觉 encoder 反向传播确认requires_grad_(False)三个真实失败 case 值得细看Case 1OCR 数字总错“1,234→1,264”图被统一 resize 到 336×3365 个字符占像素极少视觉 token 仅 4 个不足以区分相近数字。诊断分辨率瓶颈。升到 1024×1024 或开 AnyRes4 tile视觉 token 4→576EM 从 65% 升至 72%。文档任务分辨率即精度与通用 VQA 截然不同。Case 2中文输出乱码 / 中英混杂基座用 Llama-3-8B中文词表覆盖 5%总营收等字为 unk 或多 token 拼接。换 Qwen2.5-7B中文词表原生支持后输出纯净。多模态 VLM 的 LLM 选型必须考虑目标语言。Case 3训练 loss 正常但推理全乱SFT loss 收敛到 0.9正常合并 LoRA 后推理输出乱码。根因训练用|im_start|user\n{image}{text}|im_end|格式推理却手拼成User: {text}\nAssistant:——格式完全不同。VLM 对 prompt 格式比纯 LLM 更敏感视觉 token 占位必须精确对齐推理须严格用tokenizer.apply_chat_template()。 本篇涉及代码文件说明code/03_sft/memory_budget_demo.py显存预算计算器零依赖本文 Scenario A/B/Ccode/03_sft/sft_mask_walkthrough.py多轮 ShareGPT label mask 展平零依赖code/03_sft/sft_lora.shms-swift LoRA SFT 训练脚本code/03_sft/prepare_doc_sft_data.py文档数据转 ShareGPT 格式小结主题要点数据配比文档 40% OCR 25% 私有 20% 蒸馏 10% 通用 5%label mask仅 assistant 内容算 loss40 token 中约 14 个有效35%显存核心LoRA 把可训参数从 7B 压到 0.1B显存 120 GB → 17 GB训练配方bs1 × accum16gradient checkpointingQwen2.5-VL 基座停止准则5K–10K 步最优EM ≥ 70% 及格早停优于晚停下一篇进入阶段 4多模态 RL——从 LLaVA-RLHF 到 DPO再到 DeepSeek 的 GRPO讲清偏好数据如何构造、DPO 损失如何替代 RLHF、GRPO 的优势函数如何工作。这是把会答的模型训练成不胡说的抗幻觉 VLM 的关键一环。关注专栏更新第一时间通知。专栏《从 NLP 到 VLM多模态大模型研发实战》上一篇⑤ 对齐机制下· M-RoPE 与动态分辨率 本篇⑥ 训练 Pipeline · LoRA SFT 下一篇⑦ 多模态 RL · DPO GRPO