
让机器人学会记忆OpenDM DM05-MEM历史帧记忆机制解析与SFT实践【免费下载链接】opendmAn Open-World Foundation Model for General-Purpose Embodied Intelligence.项目地址: https://gitcode.com/gh_mirrors/op/opendmOpenDM 是 Dexmal 开源的开放世界具身智能基础模型框架其核心模型 DM0.5 是一个视觉-语言-动作VLA大模型。其中DM05-MEM版本引入了「历史帧记忆机制」机器人在做决策时不仅能看到当前画面还能回忆过去 32 秒的主视角画面。本文面向新手解析 OpenDM 中这套记忆机制的工作原理并手把手带你完成一次 MEM 版 SFT 微调实践。为什么机器人需要记忆普通 VLA 模型做决策时输入只有当前时刻的几路相机画面和机器人状态。对于短动作这没问题但遇到先拿起杯子、再放到托盘里这类长程任务时刚才发生了什么往往才是正确动作的关键。DM05-MEM 的思路非常直观把过去的主视角帧按 1 FPS每秒 1 张均匀采样塞进模型的上下文里让大模型在生成动作前回看最近 32 秒的画面。这样长程任务中模型能知道任务进行到了哪一步动作中断或被打扰后模型能依据之前的状态恢复策略推理时只需在请求里多带一个history_images字段即可启用记忆。历史帧记忆机制是怎么实现的OpenDM 的记忆机制由数据采样 → 视觉压缩 → 上下文注入三步组成下面逐层拆解完整文档见 docs/zh/dm05_mem_sft.md。第一步按 1 FPS 均匀采样历史帧采样逻辑在 opendm/data/transforms.py 的LoadHistory变换中完成以主视角image_keys[0]通常是头顶相机为基准向前回看max_history_images默认 32个槽位每个槽位对应回看 1 秒采样时会用数据集注册的fps把秒换算成帧号因此 MEM 数据集注册时必须提供fps字段采样出的图片按从旧到新排序开头缺帧episode 刚开始时会自动丢弃只保留有效帧。也就是说JSONL 数据里不需要额外写history_images字段——训练时框架会从已有的images_1自动回看过去帧数据准备成本和普通 SFT 完全一样。第二步把每张历史图压缩成 16 个视觉 Soft Token当前帧的图片会走完整的视觉编码路径而历史图为了控制长度做了轻量化处理。常量定义在 opendm/constants/robot.py常量值含义HISTORY_TOKENS_PER_IMAGE16每张历史图在上下文中占 16 个 tokenHISTORY_POOL_SIZE4视觉特征做 4×4 自适应平均池化模型侧的实现见 opendm/model/dm05/dm05_arch.py 的_compute_prefix_cache历史图先过视觉塔得到特征图再自适应池化到 4×4最终每张图只贡献 16 个 token。32 张历史图合计约 512 个 token用很小的代价换来了 32 秒的记忆窗口——这是 MEM 版能高效推理的关键设计。第三步占位符机制把历史 Token 注入 VLM 上下文在ChatTokenization同位于 opendm/data/transforms.py中OpenDM 使用了一对特殊的占位符unused0每个有效历史帧在提示词里对应 16 个该占位符unused1无效槽位episode 开头缺帧的部分也用 16 个占位符占满但对应 embedding 会被置零并在 attention 与位置编码中屏蔽保证序列长度恒定。模型前向时占位符位置通过masked_scatter被真实的视觉特征替换最终历史画面与当前画面一起进入 VLM 的 KV 缓存参与动作生成。快速上手DM05-MEM SFT 微调实践一键准备克隆仓库并下载基础模型git clone https://gitcode.com/gh_mirrors/op/opendm cd opendm huggingface-cli download Dexmal/DM05-MEM --local-dir ./checkpoints/DM05-MEM仓库内置了 demo 数据集assets/demo下的 JSONL 三路相机图片在 opendm/dataset/demo.py 中额外注册了demo_mem含fps: 25可直接跑通验证。启动训练一条命令完成 MEM SFTOpenDM 提供可直接运行的 MEM SFT 入口 playground/dm05_mem_sft_demo.py相比普通 SFT 预设了is_historyTrue即默认打开历史记忆。用 script/dm05_launcher.sh 启动script/dm05_launcher.sh \ --exp playground/dm05_mem_sft_demo.py \ --task train \ --model-config.model-name-or-path ./checkpoints/DM05-MEM \ --trainer-config.num-train-steps 50000几个预设值得了解chunk_size50一次预测 50 步动作、max_history_images32、学习率2.5e-5、动作维度 14DOS W1 双臂形态。训练时若没有匹配的归一化统计OpenDM 会自动从当前数据计算并保存到./norm_stats/checkpoint 中会附带norm_stats.json推理时必须使用同一份统计。换成自己的数据只需覆盖数据集名如果你的数据布局与 demo 一致三相机、14 维动作、注册了fps只需追加一个参数即可script/dm05_launcher.sh --exp playground/dm05_mem_sft_demo.py --task train \ --data-config.dataset-name my_robot --model-config.model-name-or-path ./checkpoints/DM05-MEM其它机型请复制该 playground 再修改动作转换默认值数据格式细则参考 docs/zh/data.md。推理带上历史帧发起请求训练完成后用同一入口切到推理任务即可起 HTTP 服务script/dm05_launcher.sh --exp playground/dm05_mem_sft_demo.py --task inference \ --model-config.model-name-or-path ./user_checkpoints/dm05_mem_sft_demo/checkpoint-10000 \ --inference-config.port 7891带记忆的请求示例见 tests/curl_history.sh在observation里除了当前的三路相机images再传入history_imagesbase64 图片数组从旧到新排列服务即会以当前帧 32 秒记忆输出动作。关键配置清单配置项默认值说明is_historytrue打开历史帧记忆见 playground/dm05_mem_sft_demo.pymax_history_images32历史槽位数对应 1 FPS 下 32 秒记忆HISTORY_TOKENS_PER_IMAGE16每帧历史的 token 数见 opendm/constants/robot.pychunk_size50动作块长度训练与推理必须一致fps数据集注册时提供MEM 采样历史帧的必备字段norm_stats.json随 checkpoint 保存推理时必须使用训练时的同一份统计写在最后DM05-MEM 用1 FPS 历史帧 16 token 压缩 占位符注入这套轻量机制让 OpenDM 的 VLA 模型第一次拥有了秒级记忆数据侧零额外标注、训练侧一条命令、推理侧多传一个字段。对新手而言这是当前理解记忆增强的机器人基础模型最简洁的工程范本完整流程可继续深入 docs/zh/dm05_mem_sft.md 与 docs/zh/dm05_finetuning.md。【免费下载链接】opendmAn Open-World Foundation Model for General-Purpose Embodied Intelligence.项目地址: https://gitcode.com/gh_mirrors/op/opendm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考