本页记录 minivLLM 多模态推理实验在 6 周计划结束时的状态,包括完成度、验证数字、已知限制和后续工作。
项目从纯文本推理引擎 minivLLM 起步,增加一条最小可运行的 VLM 推理流水线,目标模型是 Qwen3-VL-4B 或同类开源 VLM。
实验环境:macOS (Apple Silicon, MPS),transformers 5.8.0,torch 2.11.0,无 NVIDIA GPU / 无 CUDA。引擎代码 minivLLM/ 作为只读基础存在,所有实验代码独立于引擎目录,不修改 minivLLM/ 底层源码。
项目分为 5 个 Wave,每 Wave 约 1 周工作量,覆盖引擎审计、模块修复、paged attention 实现、多模态 pipeline、VLM reference 对照、以及多模态 KV cache 管理。
| Wave | 主题 | 产出 | 状态 |
|---|---|---|---|
| Wave 1 | 目录骨架 + 引擎盘点 | 全目录创建、engine_inventory.md(18 模块审计)、显存预算与模型选型矩阵 | 完成 |
| Wave 2 | 文本引擎审计 + Engine Patch | 3 个构造 Bug 修复(Attn 参数 / act_fn=None / head_dim 接线)、HF 对齐 IDENTICAL(max|diff|=8.2e-5, cos_sim=0.99999994)、contiguous KV cache 接入 prefill/decode 路径 | 完成 |
| Wave 3 | Paged Attention + 多模态 Token Pipeline | PagedKVCache(BlockManager + BlockTable + correctness-first gather)、contiguous vs paged 对比通过;教学型 token pipeline(5 模块、2 种 visual token 模式、2 种序列布局) | 完成 |
| Wave 4 | inputs_embeds 路径 + VLM Demo + VLM Reference | inputs_embeds 正式接入(text_parity max|diff|=0)、最小 VLM demo(random projector 工程跑通);4 个 VLM reference 模型因缺 accelerate 全部失败,降级 smoke 通过 | 完成(降级) |
| Wave 5 | 多模态 KV Cache 管理 + 收尾 | 3 策略 × 7 场景 mm cache 模拟器、策略 A false_hit 验收(same_text_different_image: A.false_hits=1, B.false_hits=0, C.false_hits=0)、5 份 JSON/HTML 结果 | 完成 |
verdict: IDENTICAL,max |diff| = 8.2e-5,cosine similarity = 0.99999994Qwen3-0.6B(随机权重),在 validate_model.py --compare-hf --full 下全部通过。
经过 3 轮调试修复了 5 个 Bug:
Qwen3Attn → Attn 构造参数不兼容(S= / is_decode= 不存在)Qwen3FFN.act_fn = None(前向 NoneType not callable)head_dim 未通过 DecoderLayer 传给 Attn(推导值 64 vs 实际 128)rope_theta 未传参(默认 10000 vs HF 实际 1,000,000)Contiguous KV cache:已接入 minivLLM prefill/decode 路径,4 个 seq_len(1/8/64/512)的 prefill-then-decode vs full-sequence 对比全部通过(atol=1e-5, rtol=1e-4)。
Paged KV cache:correctness-first 实现(BlockManager + BlockTable + PagedKVCache + gather_kv_for_attention),使用 torch.gather 完成逻辑-物理地址映射。与 contiguous KV cache 对齐,logits 通过 torch.allclose。注意:decode 阶段使用 gather fallback,非 CUDA paged_attention kernel;无 CUDA 环境,仅在 CPU/MPS 上验证正确性。
实验显示:text-only prefix cache 在多模态推理中不安全。当用户两次请求使用相同文本前缀但不同图像时,仅基于文本 token 的 cache key(策略 A)会错误复用 KV cache,导致模型基于错误的 visual context 解码。
| 场景 | 策略 A | 策略 B | 策略 C |
|---|---|---|---|
| same_text_same_image | true_hit | true_hit | true_hit |
| same_text_different_image | false_hit | safe_miss | safe_miss |
| same_image_different_question | safe_miss | safe_miss | safe_miss |
| same_image_different_resize | true_hit* | true_hit* | safe_miss |
| multi_image_same_order | true_hit | true_hit | true_hit |
| multi_image_different_order | false_hit | safe_miss | safe_miss |
*Case 4 中策略 A/B 的 true_hit 在语义上是错误的(resize 不同导致 visual layout 不匹配),但按 image_bytes 相同被归为 true_hit + 语义警告。
结论:策略 B(text + image_hash)是最小防御线;策略 C(full multimodal metadata)提供完整保护。
inputs_embeds 路径正式接入 minivLLM 引擎:双输入冲突正确拒绝(ValueError),text_parity 测试通过(input_ids 路径 == inputs_embeds = embed_tokens(input_ids) 路径,max|diff|=0.00e+00),HF parity 无回归。
最小 VLM demo(run_minimal_vlm.py)使用随机 tiny-ViT + 随机 linear projector 将图像 embedding 拼接进 LLM,工程路径跑通。重要声明:随机 projector 不保证语义质量。真实 VLM 语义需要真实 vision encoder 权重(HF pretrained)和匹配的 projector。
minivLLM/.venv 未安装 accelerate 包,而 device_map="auto" 强制依赖该包。InternVL3.5-4B 额外面临 InternVLChatConfig 不被 AutoModelForImageTextToText 识别的问题。降级路径(tokenizer-only smoke)通过。
其他已知限制:
run_minimal_vlm.py 中的 visual-to-text projector 是随机初始化的 nn.Linear,不携带任何预训练语义。真实 VLM 语义需要 HF 预训练权重。torch.gather 拼接 KV block,非 GPU-native paged attention kernel。正确性已验证,但性能非优化。minivLLM 无 scheduler、无 request queue、无批量调度。仅单序列推理。torch.cuda.memory_stats() 在真实 GPU 上校准。minivLLM/.venv/bin/pip install accelerate
重新运行 run_qwen_vl_reference.py,验证 3 个 Qwen/SmolVLM 模型能否在 MPS 上加载并前向。InternVLChatConfig 的 AutoModelForImageTextToText 注册问题(可能需要特定加载器或更新的 transformers 版本)。
run_minimal_vlm.py 中的随机 nn.Linear 替换为从 HF checkpoint 加载的真实 projector(如 Qwen3-VL 的 visual.merger),使 local VLM demo 具备语义。
mm_cache_simulator.py 的 3 策略设计迁移到 minivLLM 引擎的 KV cache 读/写循环,用真实模型前向验证 cache key 命中逻辑。
compare_contiguous_vs_paged.py,测量 real fragmentation ratio 和 throughput 差异。
RequestState / Lifecycle / 批量 prefill-then-decode 调度。这一步把当前的 demo 扩展为可服务的执行路径。
| 类别 | 路径 | 数量 |
|---|---|---|
| 静态文档 | docs/01_*.html 至 docs/10_*.html | 10 篇 |
| 学习笔记 | learning/papers/(12 篇论文)+ learning/notes/(12 篇笔记) | 24 篇 |
| 实验脚本 | experiments/**/*.py | 23 个 |
| 周报 / 报告 | reports/week_1.md 至 reports/week_6.md + engine_inventory.md | 7 篇 |
| KV cache 实验 | experiments/mm_kv_cache_management/results/*.json + *.html | 10 个 |
| 证据文件 | .omo/evidence/task-*.txt | 10+ 个 |