扩展 SwiftVLN
简体中文 | English
SwiftVLN 的训练与评测共享实验配置、模型名称、Memory 和 embedding 实现。新增能力时, 需要同时保持训练参数、在线推理、checkpoint 和模型名称的一致性。各模块关系见 代码架构。
1. 扩展涉及的公共接口
接口 |
事实源 |
需要保持的约束 |
|---|---|---|
实验配置 |
|
参数组合可以验证,并能够通过模型名称往返解析 |
训练参数 |
|
Dataset、Template 和 model loader 接收相同配置 |
评测参数 |
|
与训练配置一致,并写入评测 summary |
Shell 入口 |
|
环境变量正确传递给 Python CLI |
Checkpoint |
|
新增参数和权重能够保存、恢复并继续评测 |
测试 |
|
配置、结构、数据流和 checkpoint contract 保持稳定 |
当新增能力会出现在模型名称中时,先确定唯一的名称片段,再修改训练和评测入口。
2. 新增环境 Backend
2.1 定义环境语义
在 src/swiftvln/backends/specs.py 中新增 EnvironmentSpec,并加入
_ENVIRONMENT_SPECS。Spec 负责与模拟器无关的静态语义:
字段 |
内容 |
|---|---|
|
环境标识,用于训练参数、评测参数和模型名称 |
|
Forward action 的距离 |
|
Left/right action 的转向角 |
|
导航任务 system prompt |
|
评测参数中对应的配置文件字段名 |
|
是否支持 Map memory |
|
是否输出按 trajectory type 分组的指标 |
|
Action ID 与输出符号的顺序 |
训练 Dataset 通过 get_environment_spec() 获取 prompt、动作符号和位姿积分参数,不在
Dataset 中增加环境分支。
2.2 实现 Backend 与 Wrapper
创建 src/swiftvln/backends/<env>/:
文件 |
职责 |
|---|---|
|
加载任务配置并应用 split、数据路径和 GPU override |
|
将模拟器适配为 |
|
组合配置、模拟器、action parser 和视频 hook |
|
可选的视频帧采集与保存 |
|
保持轻量导出 |
EnvWrapper 必须实现:
reset(episode)与step(action);get_rgb()、get_instruction()和get_metrics();episodes、episode_over、max_steps和env_type;close()。
模拟器 import 放在 Backend.create_wrapper() 或 config.py 的实际加载函数中。
wrapper.py 使用 TYPE_CHECKING 标注模拟器类型,使核心 package 在未安装该模拟器时仍可
导入。
2.3 注册训练与评测入口
完成以下改动:
在
backends/factory.py的_BACKEND_CLASSES注册 Backend;在
evaluation/arguments.py增加环境 choice 和配置路径参数;在
experiment.py更新ENV_TYPES、模型名称正则和环境约束;在训练脚本增加默认 trajectory 路径;
在评测脚本增加默认任务配置、split 和 Python 参数;
在
src/swiftvln/configs/<env>/添加随包发布的 YAML;在
local.env.example增加本机数据与场景路径。
新环境的离线 trajectory 需要满足第 6 节的数据 contract。在线 Episode 的 simulator
字段差异由 Wrapper 消化,EnvironmentEpisodeLoop 和 SwiftVLNInferenceSession 不增加
环境判断。
3. 新增 History Processor
3.1 实现处理器
在 src/swiftvln/modeling/history/ 中新增 HistoryProcessor 子类:
方法 |
Contract |
|---|---|
|
在视觉编码前返回占位 token 数量 |
|
返回 |
|
用于日志的稳定名称 |
get_output_token_count() 的结果必须与 process() 的第一维完全一致。Processor 以单个
样本的历史帧为输入,不能在 batch 内混合不同样本的 token。
3.2 注册与传参
在
modeling/history/__init__.py注册类型和 factory 构造参数;在
experiment.py的HISTORY_PROCESSORS中增加公共名称;为模型名称增加稳定的编码和解析规则;
在训练、评测 arguments 中增加超参数;
在训练和评测 shell 中设置默认值并传递参数;
在
SwiftVLNSft._prepare_template()中创建相同配置的 processor;在
SwiftVLNInferenceSession中创建在线评测使用的 processor;在
build_summary_extras()中记录影响推理结果的参数。
3.3 对齐训练与在线推理
训练预留 token 占位,在线推理缓存 embedding;两条链路遵循相同的处理器输出约束。
训练侧的历史帧选择位于 SwiftVLNDataset._sample_history_frames();在线侧的 cache 构建
位于 evaluation/inference/encoding.py。如果新 processor 使用不同的帧采样或 cache
策略,需要同时增加两侧路由。
Template 会先调用 get_output_token_count() 创建 <history_memory> 占位,再调用
process() 生成 embedding。Inference session 则直接将 process() 输出写入
history_cache。两条路径应使用相同的帧顺序、processor 参数和输出 token 数量。
4. 新增 Embedding Enhancement
Embedding enhancement 位于视觉塔之后、History 压缩之前。当前公开配置为互斥单选, 一个模型只启用一种 enhancement。
4.1 实现模块
在 src/swiftvln/modeling/embeddings/ 中新增 BaseEmbeddingEnhancement 子类,实现:
接口 |
Contract |
|---|---|
|
输入和输出均为 |
|
稳定的日志名称 |
模块通过 EmbeddingEnhancementPipeline.enhancements 中的 nn.ModuleDict 挂载。其参数会
自动进入 optimizer 和 checkpoint state_dict。
4.2 注册公共模式
需要同步修改:
experiment.py:EMBEDDING_MODES、名称解析、互斥规则和辅助判断函数;modeling/embeddings/__init__.py:在create_embedding_pipeline()中创建模块;modeling/embeddings/runtime.py:声明目标模块、重建条件和兼容 alias;training/sft/arguments.py与evaluation/arguments.py:增加参数;modeling/model.py:从 loader kwargs 读取参数,并写入模型 config;训练和评测 shell:校验模式、传递参数并生成名称;
build_summary_extras():记录推理配置。
4.3 增加图像元数据
训练 Template 和在线 VisualEncodingMixin 都以
model.embed_enhance(embed, H, W, **kwargs) 调用模块。如果 enhancement 需要 pose 之外的
逐图像元数据,还需要更新:
SwiftVLNDataset的图像元数据生成和顺序;SwiftVLNTemplateMixin._encode()与 multimodal collator;SwiftVLNInferenceSession的状态记录;VisualEncodingMixin._encode_frame()和_encode_batch_frames()。
元数据顺序必须与 images、视觉塔输出的 per-image token boundary 一致。保存 checkpoint
后,从纯 checkpoint 目录加载模型时应恢复相同的 pipeline 类型、配置和权重。
5. 新增模型族
5.1 Transformers 与 ms-swift 注册
在 modeling/model.py 中增加:
继承上游 Transformers config 的 SwiftVLN config;
继承上游 conditional-generation model 的 SwiftVLN model class;
能够添加特殊 token、挂载 enhancement 并恢复权重的 loader;
新模型需要的
inputs_embeds或视觉输出兼容逻辑。
随后在 modeling/registry.py 中注册 Transformers class、ms-swift ModelMeta、默认模型
ID、model architecture、Template 和 loader。register_swiftvln_models() 必须保持可重复
调用。
5.2 Template
在 modeling/template.py 中基于对应的 ms-swift Template 创建 SwiftVLN Template,并复用
SwiftVLNTemplateMixin。新模型族需要确认:
image processor 返回
image_grid_thw;视觉输出可以按单张图像拆分;
<history_memory>与<current_image>的 token ID 正确;inputs_embeds、attention mask、position IDs 和 generation API 兼容;History processor 的占位 token 数量与实际输出一致。
5.3 配置与名称
同步更新:
experiment.py的MODEL_FAMILIES、模型名称前缀和解析规则;训练与评测 arguments 中
model_type → model_family的显式映射;训练和评测 shell 的
MODEL_FAMILY分支、默认模型路径和运行参数;local.env.example与模型下载文档;模型名称 contract 中的合法与非法样例。
6. 修改数据 Contract
6.1 离线训练数据
每个 trajectory 目录包含 annotations.json 和对应的 RGB 目录。核心 annotation 字段为:
{
"video": "relative/trajectory/path",
"instructions": ["navigation instruction"],
"actions": [-1, 1, 2, 1, 0]
}
video/rgb/ 存放按时间排序的观测帧。actions 中 -1 表示初始状态,0/1/2/3
对应 EnvironmentSpec.action_symbols 中的 STOP、forward、left 和 right。
修改 annotation schema 时,需要同步:
trajectory 生成器与 validation CLI;
SwiftVLNDataset的读取、窗口索引和输出字段;Map metadata resolver 或逐图像元数据生成;
SatNav/Habitat 训练数据文档。
6.2 Dataset 与 Template 边界
SwiftVLNDataset 输出 messages、images 和图像计数元数据。图像顺序固定为:
history images → initial observation → current observations
新增字段必须能够通过 ms-swift StdTemplateInputs.extra_kwargs 到达 Template。Template
collator 需要按样本保留边界,不能把不同样本的图像计数或元数据展平后失去对应关系。
6.3 在线 Episode 与结果
模拟器 Episode 的字段差异由 EnvWrapper 适配。Runner 对外只依赖 episode_id、
scene_id、instruction 和可选的 trajectory_type。
修改评测结果字段时,同时更新:
SwiftVLNEvaluationRunner.evaluate_episode();ResultRecorder与evaluation/reporting.py;resume/dedup contract;
SwiftVLN 评测中的输出说明。
7. 验证改动
在 swiftvln-train 环境运行与改动对应的 contract:
改动 |
测试入口 |
|---|---|
实验配置与模型名称 |
|
Backend |
|
History processor |
|
Embedding enhancement |
|
Dataset / Template |
|
结果与恢复 |
|
CLI 与仓库边界 |
|
python -m unittest \
tests.test_experiment_contract \
tests.test_model_name_contract \
tests.test_dataset_contracts \
tests.test_training_structure_contract \
tests.test_evaluation_structure_contract
修改 Shell 入口后检查语法:
bash -n scripts/train/train_swiftvln_qwen_vl.sh
bash -n scripts/eval/eval_by_name.sh
bash -n scripts/eval/eval_swiftvln_qwen_vl_distributed.sh
涉及模型前向或数据流的改动还需要完成一次真实 optimizer step、保存 checkpoint、从 checkpoint 重新加载,并运行单 Episode 在线评测。修改分布式代码时,再验证多 rank Episode 分片、结果去重和中断恢复。
8. 同步文档
变更 |
同步页面 |
|---|---|
安装依赖、第三方仓库 |
|
基础模型与 checkpoint |
|
训练参数与模型名称 |
|
Memory / embedding |
|
训练或评测数据 |
|
评测入口、输出与指标 |
|
模块边界或依赖方向 |