LingBot-Map 的推理代码不应该关心权重来自哪里。这个模块建议把“下载”和“选择检查点”拆开:
下载模型权重
robbyant/lingbot-mapRobbyant/lingbot-map从本地权重目录里选择一个检查点
balanced:默认推荐,适合大多数 demo、短视频、交互式预览。long:长序列推荐,适合几千到上万帧的流式重建。stage1:训练阶段产物或中间模型,主要用于复现实验、消融、继续训练,不建议作为普通推理默认值。本模块不负责网络推理、不负责构建模型结构,也不修改 demo.py 的推理逻辑。它只输出一个本地 checkpoint 路径,例如:
textcheckpoints/lingbot-map/xxx_balanced_xxx.pth
然后把这个路径传给项目里的 demo、benchmark 或自己的加载脚本。
LingBot-Map README 中提供了两个模型入口:
| 平台 | 模型 ID | 适合场景 |
|---|---|---|
| HuggingFace | robbyant/lingbot-map |
海外网络、已有 HuggingFace 缓存体系 |
| ModelScope | Robbyant/lingbot-map |
国内网络、需要更稳定下载时 |
推荐在项目根目录下统一放到:
textcheckpoints/ └── lingbot-map/ ├── ... ├── *balanced*.pth ├── *long*.pth └── *stage1*.pth
实际文件名可能随项目发布版本变化,不要在业务代码里写死完整文件名,建议按关键字筛选。
| 检查点 | 推荐用途 | 特点 | 不适合 |
|---|---|---|---|
balanced |
默认推理、交互 demo、普通视频 | 速度、显存、重建质量较均衡 | 极长视频的最终重建 |
long |
长视频、长轨迹、超过数千帧的流式场景 | 更偏向长程上下文和轨迹稳定性 | 显存紧张、只跑几十帧预览 |
stage1 |
训练复现、消融实验、继续训练初始化 | 更接近中间阶段模型 | 普通用户直接推理 |
一般选择规则:
text短视频 / 快速看效果 -> balanced 长视频 / 漫游 / 上万帧 -> long 训练调试 / 对齐论文实验 -> stage1
如果只是第一次运行 LingBot-Map,先用 balanced。
依赖安装:
bashpython -m pip install -U huggingface_hub
下载脚本:
python# tools/download_lingbot_map_hf.py
from huggingface_hub import snapshot_download
repo_dir = snapshot_download(
repo_id="robbyant/lingbot-map",
local_dir="checkpoints/lingbot-map",
local_dir_use_symlinks=False,
allow_patterns=[
"*.pth",
"*.pt",
"*.ckpt",
"*.safetensors",
"*.json",
"*.yaml",
"*.yml",
"*.txt",
],
)
print(repo_dir)运行:
bashpython tools/download_lingbot_map_hf.py
下载完成后检查文件:
bashfind checkpoints/lingbot-map -maxdepth 3 -type f如果网络环境需要 HuggingFace 镜像,可以在运行前配置:
bashexport HF_ENDPOINT=https://hf-mirror.com
python tools/download_lingbot_map_hf.py依赖安装:
bashpython -m pip install -U modelscope
下载脚本:
python# tools/download_lingbot_map_ms.py
from modelscope.hub.snapshot_download import snapshot_download
repo_dir = snapshot_download(
model_id="Robbyant/lingbot-map",
cache_dir="checkpoints",
)
print(repo_dir)运行:
bashpython tools/download_lingbot_map_ms.py
ModelScope 默认会在 cache_dir 下建立自己的缓存目录。下载完成后可以这样查看:
bashfind checkpoints -maxdepth 5 -type f | grep -E '\.(pth|pt|ckpt|safetensors)$'如果希望项目里固定使用 checkpoints/lingbot-map,可以把 ModelScope 返回目录软链接过去:
bashln -s "$(python tools/download_lingbot_map_ms.py)" checkpoints/lingbot-map如果目录已存在,不要重复软链接,直接使用脚本输出的真实路径即可。
下面脚本会在权重目录里查找包含 balanced、long 或 stage1 的检查点文件,并输出最匹配的路径。
python# tools/select_lingbot_map_ckpt.py
import argparse
from pathlib import Path
CKPT_EXTS = {".pth", ".pt", ".ckpt", ".safetensors"}
def list_checkpoints(root: Path):
if not root.exists():
raise FileNotFoundError(f"权重目录不存在: {root}")
files = []
for path in root.rglob("*"):
if path.is_file() and path.suffix.lower() in CKPT_EXTS:
files.append(path)
if not files:
raise FileNotFoundError(f"没有在 {root} 下找到检查点文件: {sorted(CKPT_EXTS)}")
return files
def score_checkpoint(path: Path, variant: str) -> int:
name = path.name.lower()
score = 0
if variant in name:
score += 100
# 常见命名里会带 latest、final、ema 等标记,略微提高优先级。
if "final" in name:
score += 10
if "latest" in name:
score += 8
if "ema" in name:
score += 5
# 避免 stage1 被误选成普通推理模型。
if variant != "stage1" and "stage1" in name:
score -= 50
return score
def select_checkpoint(root: Path, variant: str) -> Path:
candidates = list_checkpoints(root)
matched = [
path for path in candidates
if variant in path.name.lower()
]
if not matched:
all_names = "\n".join(f" - {p}" for p in candidates)
raise FileNotFoundError(
f"没有找到包含关键字 '{variant}' 的检查点。\n"
f"当前可用检查点:\n{all_names}"
)
matched.sort(key=lambda p: score_checkpoint(p, variant), reverse=True)
return matched[0]
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"--root",
type=Path,
default=Path("checkpoints/lingbot-map"),
help="LingBot-Map 权重目录",
)
parser.add_argument(
"--variant",
choices=["balanced", "long", "stage1"],
default="balanced",
help="要选择的检查点类型",
)
args = parser.parse_args()
ckpt = select_checkpoint(args.root, args.variant)
print(ckpt)
if __name__ == "__main__":
main()运行:
bashpython tools/select_lingbot_map_ckpt.py \ --root checkpoints/lingbot-map \ --variant balanced
输出类似:
textcheckpoints/lingbot-map/lingbot_map_balanced.pth
切到长序列检查点:
bashpython tools/select_lingbot_map_ckpt.py \ --root checkpoints/lingbot-map \ --variant long
在项目根目录执行:
bashmkdir -p tools checkpoints
cat > tools/download_lingbot_map_hf.py <<'PY'
from huggingface_hub import snapshot_download
repo_dir = snapshot_download(
repo_id="robbyant/lingbot-map",
local_dir="checkpoints/lingbot-map",
local_dir_use_symlinks=False,
allow_patterns=[
"*.pth",
"*.pt",
"*.ckpt",
"*.safetensors",
"*.json",
"*.yaml",
"*.yml",
"*.txt",
],
)
print(repo_dir)
PY
cat > tools/select_lingbot_map_ckpt.py <<'PY'
import argparse
from pathlib import Path
CKPT_EXTS = {".pth", ".pt", ".ckpt", ".safetensors"}
def list_checkpoints(root: Path):
if not root.exists():
raise FileNotFoundError(f"权重目录不存在: {root}")
files = [
path for path in root.rglob("*")
if path.is_file() and path.suffix.lower() in CKPT_EXTS
]
if not files:
raise FileNotFoundError(f"没有在 {root} 下找到检查点文件")
return files
def select_checkpoint(root: Path, variant: str) -> Path:
candidates = list_checkpoints(root)
matched = [p for p in candidates if variant in p.name.lower()]
if not matched:
print("已找到的检查点:")
for p in candidates:
print(f" - {p}")
raise FileNotFoundError(f"没有找到包含关键字 '{variant}' 的检查点")
def score(path: Path):
name = path.name.lower()
value = 0
if variant in name:
value += 100
if "final" in name:
value += 10
if "latest" in name:
value += 8
if "ema" in name:
value += 5
if variant != "stage1" and "stage1" in name:
value -= 50
return value
return sorted(matched, key=score, reverse=True)[0]
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--root", type=Path, default=Path("checkpoints/lingbot-map"))
parser.add_argument("--variant", choices=["balanced", "long", "stage1"], default="balanced")
args = parser.parse_args()
print(select_checkpoint(args.root, args.variant))
if __name__ == "__main__":
main()
PY
python -m pip install -U huggingface_hub
python tools/download_lingbot_map_hf.py
CKPT=$(python tools/select_lingbot_map_ckpt.py --variant balanced)
echo "selected checkpoint: ${CKPT}"如果输出了本地 .pth、.pt、.ckpt 或 .safetensors 路径,说明下载和选择都正常。
有时候不确定远端仓库当前发布了哪些文件,可以先列出来:
python# tools/list_lingbot_map_ckpts.py
from pathlib import Path
root = Path("checkpoints/lingbot-map")
exts = {".pth", ".pt", ".ckpt", ".safetensors"}
for path in sorted(root.rglob("*")):
if path.is_file() and path.suffix.lower() in exts:
print(path)运行:
bashpython tools/list_lingbot_map_ckpts.py
输出中重点看文件名是否包含:
textbalanced long stage1
如果项目脚本支持传入 checkpoint 路径,建议不要手写固定路径,而是先选再传:
bashCKPT=$(python tools/select_lingbot_map_ckpt.py \
--root checkpoints/lingbot-map \
--variant balanced)
echo "using checkpoint: ${CKPT}"
# 下面命令的参数名以当前仓库 demo.py 为准。
# 常见写法是 --ckpt、--checkpoint 或 --model_path。
python demo.py --ckpt "${CKPT}"长视频场景:
bashCKPT=$(python tools/select_lingbot_map_ckpt.py \
--root checkpoints/lingbot-map \
--variant long)
echo "using checkpoint: ${CKPT}"
python demo.py --ckpt "${CKPT}"训练复现或消融场景:
bashCKPT=$(python tools/select_lingbot_map_ckpt.py \
--root checkpoints/lingbot-map \
--variant stage1)
echo "using checkpoint: ${CKPT}"如果你在自己的脚本里加载 LingBot-Map,建议把“选择 checkpoint”作为独立步骤:
pythonfrom pathlib import Path
import torch
ckpt_path = Path("checkpoints/lingbot-map/lingbot_map_balanced.pth")
checkpoint = torch.load(ckpt_path, map_location="cpu")
print(type(checkpoint))
if isinstance(checkpoint, dict):
print(checkpoint.keys())对于 .safetensors 文件:
bashpython -m pip install -U safetensors
pythonfrom safetensors.torch import load_file
ckpt_path = "checkpoints/lingbot-map/lingbot_map_balanced.safetensors"
state_dict = load_file(ckpt_path)
print(len(state_dict))
print(next(iter(state_dict)))加载后如何 load_state_dict,以项目内模型构建函数为准。这个模块只保证能拿到正确的本地文件路径。
LingBot-Map README 里提到过 KV cache、SDPA、FlashInfer 等长序列相关修复。权重、模型结构、推理缓存逻辑最好来自同一时期的代码。
推荐做法:
bashgit pull python tools/download_lingbot_map_hf.py
如果出现这些报错,优先检查代码和权重是否匹配:
textmissing keys unexpected keys size mismatch
stage1 一般用于训练阶段、消融或初始化。普通用户看重建效果时,不建议直接选它。
推荐优先级:
textbalanced -> long -> stage1
只有明确知道自己在复现实验或继续训练时,再使用 stage1。
long 更适合长序列稳定性,不代表它在短视频上一定更好。短视频、交互 demo、显存有限的机器,先用 balanced。
典型选择:
text100 ~ 1000 帧 balanced 3000 帧以上 long 10000 帧以上 long,并结合窗口化/缓存后端配置
HuggingFace 的 local_dir 通常就是目标目录:
textcheckpoints/lingbot-map/
ModelScope 可能返回类似缓存目录:
textcheckpoints/Robbyant/lingbot-map/...
所以不要假设 ModelScope 下载后一定在 checkpoints/lingbot-map。建议使用 snapshot_download 的返回值,或者把返回目录传给选择脚本:
bashMS_DIR=$(python tools/download_lingbot_map_ms.py)
python tools/select_lingbot_map_ckpt.py \
--root "${MS_DIR}" \
--variant balanced如果同一台机器上多个实验都用 LingBot-Map,建议使用统一缓存目录:
bashexport HF_HOME=/data/cache/huggingface
export MODELSCOPE_CACHE=/data/cache/modelscope项目里只保存软链接或 checkpoint 路径,避免每个实验目录都复制一份大文件。
Windows 创建软链接可能需要管理员权限。若软链接失败,直接使用真实路径即可:
powershellpython tools/select_lingbot_map_ckpt.py --root checkpoints/lingbot-map --variant balanced不强制要求存在 selected.ckpt 这种固定链接文件。
如果选择脚本报错:
text没有找到包含关键字 'balanced' 的检查点
先列出本地文件:
bashfind checkpoints -type f | grep -E '\.(pth|pt|ckpt|safetensors)$'如果远端实际文件名没有 balanced、long、stage1 关键字,需要根据当前发布说明调整筛选规则。不要盲目把任意 .pth 当成最终推理权重。