YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Real StackCube L3 deploy1state 真机交接包
这份包只包含部署和对照实验需要的小模型 adapter、config、language embedding 和最小推理代码。Cosmos / DiT4DiT 预训练大模型不在包内,请继续使用你们本地已有权重或 Hugging Face cache。
核心接口保持如下:
输入 state: [1, 16],只给当前一个机器人状态 token
输出 action: [8, 16],8 步 absolute joint target,不是 delta joint
维度顺序: left7 + left_gripper + right7 + right_gripper
包内文件
checkpoint_adapters/ 小 IDM adapter 和 Stack3 delta adapter
configs/ 每个模型对应的 DiT4DiT config
language_embeddings/ 预计算 prompt embedding,节省 24G 显卡显存
scripts/ 最小推理/服务代码
reports/ 离线评测和 smoke test 结果
推荐测试顺序
第一轮测 right_nonshared。目的:验证最简单的右手单臂 one-state deploy policy 是否能在真机闭环里输出合理动作。这个模型不依赖 shared IDM,也不依赖 token 区分左右手。
第二轮测 left_nonshared。目的:确认左手单臂数据、动作维度 0:8、inactive right-arm masking 都没问题。
第三轮测 primitive_shared_token 的 right/left。目的:和 non-shared 对比,验证 shared IDM + left/right token 是否足够稳定。如果它接近 non-shared,说明 shared 版本可用。
第四轮测 stack3_token_shot30。目的:验证 primitive token 初始化 + 30-shot 双臂 fine-tune 是否能做 L3 双臂组合任务。这是当前最重要的双臂主模型。
第五轮只做对照,不建议优先上真机:stack3_token_shot05/10、stack3_ordinary_shot05/10/30、stack3_scratch_shot30。这些用于拆分 shot scaling、token 效果、primitive 初始化效果。
模型文件含义
| 模型 | 加载方式 | 说明 |
|---|---|---|
right_nonshared_action_model_s12000_adapter.pt |
单独加载 | 右手单臂 non-shared baseline,第一优先级 |
left_nonshared_action_model_s12000_adapter.pt |
单独加载 | 左手单臂 non-shared baseline |
primitive_shared_token_action_model_s12000_adapter.pt |
单独加载 | shared primitive token,right/left 由 prompt/token 区分 |
primitive_shared_ordinary_action_model_s12000_adapter.pt |
单独加载 | shared primitive ordinary,不加 token 的对照 |
stack3_token_shot30_from_primitive_s8000_delta.pt |
先加载 primitive token,再加载该 delta | L3 双臂主模型 |
stack3_token_shot05_from_primitive_s8000_delta.pt |
先 primitive token,再 delta | 5-shot token 对照 |
stack3_token_shot10_from_primitive_s8000_delta.pt |
先 primitive token,再 delta | 10-shot token 对照 |
stack3_ordinary_shot05/10/30_from_primitive_s8000_delta.pt |
先 primitive ordinary,再 delta | 不加 token 的 primitive 初始化对照 |
stack3_scratch_shot30_action_model_s8000_adapter.pt |
单独加载 | 30-shot scratch baseline,只用于对照 |
环境准备
如果你们已有 Docker,只需要在已有镜像里加 Conda 环境和 DiT4DiT 依赖即可。
conda env create -f environment.yml
conda activate real-stackcube-dit4dit
pip install -e /application_ws/src/dit4dit_src/DiT4DiT
请确保 PYTHONPATH 能找到你们本地的 DiT4DiT 源码和 Cosmos diffusers patch。例如:
export HANDOFF_ROOT=/application_ws/src/real_stackcube_l3_partner_handoff_deploy1state_20260524
export PYTHONPATH=/application_ws/src/dit4dit_src:$PYTHONPATH
export STATE_PORT=5575
export ACTION_PORT=5576
第一轮:右手 non-shared safe mode
Policy server:
cd $HANDOFF_ROOT
python scripts/run_policy_server.py \
--arm_mode right \
--config_yaml configs/right_nonshared_config.yaml \
--adapter_pt checkpoint_adapters/right_nonshared_action_model_s12000_adapter.pt \
--prompt_cache language_embeddings/right_nonshared_prompt_embeds.pt \
--state_port "tcp://localhost:${STATE_PORT}" \
--action_port "tcp://*:${ACTION_PORT}"
Robot server:
cd $HANDOFF_ROOT
python3 scripts/run_robot_server.py \
--arm_mode right \
--num_episodes 3 \
--safe_mode \
--print_first_chunk \
--use_lti_filter \
--state_port "tcp://*:${STATE_PORT}" \
--action_port "tcp://localhost:${ACTION_PORT}"
通过标准:打印出的 right arm 8:16 action chunk 不应有 NaN/Inf,不应远离当前关节状态;safe mode 通过后再低速执行。
第二轮:左手 non-shared
只改三处:arm_mode=left、config、adapter、prompt cache。
python scripts/run_policy_server.py \
--arm_mode left \
--config_yaml configs/left_nonshared_config.yaml \
--adapter_pt checkpoint_adapters/left_nonshared_action_model_s12000_adapter.pt \
--prompt_cache language_embeddings/left_nonshared_prompt_embeds.pt \
--state_port "tcp://localhost:${STATE_PORT}" \
--action_port "tcp://*:${ACTION_PORT}"
Robot server 同上,把 --arm_mode right 改成 --arm_mode left。
第三轮:shared primitive token right/left
右手:
python scripts/run_policy_server.py \
--arm_mode right \
--config_yaml configs/primitive_shared_token_config.yaml \
--adapter_pt checkpoint_adapters/primitive_shared_token_action_model_s12000_adapter.pt \
--prompt_cache language_embeddings/primitive_right_prompt_embeds.pt \
--state_port "tcp://localhost:${STATE_PORT}" \
--action_port "tcp://*:${ACTION_PORT}"
左手只改 --arm_mode left 和 --prompt_cache language_embeddings/primitive_left_prompt_embeds.pt。
第四轮:Stack3 token 30-shot 双臂
注意这里要加载两个 adapter:先 primitive base,再 Stack3 delta。
python scripts/run_policy_server.py \
--arm_mode dual \
--config_yaml configs/stack3_token_shot30_config.yaml \
--adapter_pt checkpoint_adapters/primitive_shared_token_action_model_s12000_adapter.pt \
--adapter_pt checkpoint_adapters/stack3_token_shot30_from_primitive_s8000_delta.pt \
--prompt_cache language_embeddings/stack3_prompt_embeds.pt \
--state_port "tcp://localhost:${STATE_PORT}" \
--action_port "tcp://*:${ACTION_PORT}"
Robot server:
python3 scripts/run_robot_server.py \
--arm_mode dual \
--num_episodes 3 \
--safe_mode \
--print_first_chunk \
--use_lti_filter \
--state_port "tcp://*:${STATE_PORT}" \
--action_port "tcp://localhost:${ACTION_PORT}"
对照实验怎么比较
比较 right_nonshared vs primitive_shared_token right:如果 shared token 接近 non-shared,说明 token 能区分 left/right,共享 IDM 没明显损失。
比较 stack3_token_shot30 vs stack3_ordinary_shot30:如果 token 更稳,说明 token 对双臂组合有帮助。
比较 stack3_token_shot30 vs stack3_scratch_shot30:如果 token-from-primitive 更稳,说明 primitive 初始化确实有价值,不只是 30-shot 记忆。
比较 stack3_token_shot05/10/30:观察 few-shot scaling,shot 越多应越稳定。
安全注意
单臂执行时,inactive arm 必须在 robot server 或安全层强制 mask 成当前 state:right 只执行 8:16,left 只执行 0:8。
上线前先 --safe_mode --print_first_chunk,只看 action,不动机器人。任一 active joint target 距当前 state 超过你们安全阈值时,直接 reject,不发给机器人。