LingBot-Map Paged KV Cache:像LLM显存管理一样做3D重建
【免费下载链接】lingbot-mapA feed-forward 3D foundation model for reconstructing scenes from streaming data项目地址: https://gitcode.com/GitHub_Trending/li/lingbot-map
LingBot-Map 是一个前馈式 3D 重建基础模型,它能从视频流中实时重建 3D 点云。它的核心工程亮点是Paged KV Cache(分页 KV 缓存)——把大语言模型里管理长上下文的显存技术,原封不动搬进了流式 3D 重建:缓存内存恒定不涨,从而在 518×378 分辨率下以约 20 FPS 稳定推理超过 10,000 帧的长序列。本文将带你快速看懂这套机制,以及如何在自己的机器上跑通长视频重建。
一、长序列 3D 重建的显存痛点 🤯
流式重建的 Transformer 必须"记住"历史帧:每来一帧,就要和之前所有帧的 KV(Key/Value 特征)做注意力。最朴素的做法是把历史帧的 KV 全部堆在显存里——序列越长、显存占用线性增长,几千帧就 OOM。
LingBot-Map 的思路和 LLM 推理框架(vLLM、FlashInfer)一致:分页 + 按需回收,让缓存大小与视频长度解耦。实现集中在 lingbot_map/layers/flashinfer_cache.py,配合 lingbot_map/layers/attention.py 中的FlashInferAttention完成单帧流式前向。
二、分页 KV 缓存:三路页面各司其职 📄
FlashInferKVCacheManager把每一层 Transformer 的 KV 切分成固定大小的"页"(page),并分成两个逻辑流、三类页面:
| 页面类型 | 作用 | 生命周期 |
|---|---|---|
| Scale 页(8 页) | 开头的 8 个尺度帧,用于确定场景尺度 | 永不清理 |
| 滑动窗口页(64 页) | 最近的 64 帧 patch 特征 | 超过窗口即回收复用 |
| Special 页 | 每帧 6 个特殊 token(相机/寄存器/尺度) | 只追加不回收,一页可打包 42 帧 |
关键设计有两条:
- Patch 页可回收:每帧 256 个 patch token 恰好占一页;窗口外的旧页立刻归还 free list,下一帧直接复用——所以无论视频多长,patch 缓存恒定约 88 页。
- Special token 追加流:被驱逐的帧会丢 patch 细节,但其相机位姿等 6 个特殊 token 会被连续压缩进 Special 页(一页 256 槽打包 42 帧),保证长程位姿漂移校正不丢信息。
注意力计算时按scale 页 → 窗口页 → special 页的顺序拼出可见页表,special 页放在最后,最后一个未满页由paged_kv_last_page_len天然描述,无需自定义 mask(见 flashinfer_cache.py 的build_visible_page_table)。
三、关键帧策略:缓存只留"精华" 🎞️
模型用 video RoPE 在 320 帧范围内训练,KV 里存超过 320 帧会掉点。LingBot-Map 因此提供--keyframe_interval:每 N 帧才存一个关键帧的 KV,非关键帧照常输出预测但不写缓存。
实现非常精巧——非关键帧会"临时追加 → 计算注意力 → 回滚"(_set_skip_append+rollback_last_frame),见 lingbot_map/models/gct_stream.py 的_set_skip_append。这样缓存增长速度约降为1/N,是 320 帧以上长序列最优先的调优手段。
四、窗口化推理:25000 帧室内漫游稳跑 🏃
超过约 3000 帧建议切换到--mode windowed:每个窗口(window_size 128计的是 KV 槽位而非实际帧数)重置一次 KV 缓存,相邻窗口共享overlap_keyframes保持位姿对齐。官方用它重建了约 25,000 帧、13 分钟的室内视频,显存全程平稳:
五、实测性能:20 FPS 与恒定显存 📊
- 518×378 分辨率下~20 FPS,稳定推理 10,000+ 帧长序列;
- 想压测自己的硬件,可用现成脚本:
- FPS 剖析:gct_profile.py(
python gct_profile.py --backend flashinfer --dtype bf16 --compile) - 显存扫描:scripts/benchmark_gct_memory.py(对 64~10000 帧逐档测峰值 CUDA 显存并输出 CSV)
- FPS 剖析:gct_profile.py(
- 无 FlashInfer 环境会自动回退 SDPA 后端(
--use_sdpa),任何 CUDA GPU 均可运行。
六、快速上手:一键跑通与调优参数 🚀
安装依赖(FlashInfer 为推荐的 Paged Attention 后端):
pip install flashinfer-python然后跑示例场景:
python demo.py --model_path /path/to/lingbot-map.pt \ --image_folder example/courthouse --mask_sky显存吃紧时的调优顺序(详见 demo.py 与 README.md):
| 参数 | 作用 |
|---|---|
--keyframe_interval N | 只缓存每 N 帧,显存约降 N 倍(首选) |
--mode windowed --window_size 128 | 超长序列(>3000 帧)窗口化推理 |
--camera_num_iterations 1 | 相机头少做 3 轮精修,速度更快、其 KV 缓存缩小 4× |
--offload_to_cpu | 逐帧预测卸载到 CPU(默认开启) |
--num_scale_frames 2 | 降低初始尺度阶段的激活峰值 |
七、小结 ✅
LingBot-Map 的 Paged KV Cache 证明了:LLM 推理的显存管理哲学(分页、回收、追加流)可以完整迁移到流式 3D 重建。三路页面设计让缓存恒定,关键帧与窗口化推理把"记住多长"变成可调参数,最终实现万帧级、20 FPS 的实时重建。核心源码值得精读:lingbot_map/layers/flashinfer_cache.py(缓存管理器)、lingbot_map/layers/attention.py(Paged 注意力)、lingbot_map/models/gct_stream.py(流式推理主流程)。
【免费下载链接】lingbot-mapA feed-forward 3D foundation model for reconstructing scenes from streaming data项目地址: https://gitcode.com/GitHub_Trending/li/lingbot-map
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考