Skip to main content

概述

Cosmos3 在 PhyAI 里有两条 processor 路径,分别对应两个 engine plugin: Scheduler 接收的是已经 tokenized、已经 resize/normalize、形状明确的 canonical request。tokenizer、prompt metadata、observation 图像预处理、动作 padding、domain name 解析都在 processor 里完成。
cosmos3 生成 plugin 的 engine.step 已经把 video latent 解码成像素;带音频时还会解码 waveform。Cosmos3GenerationPostProcessor 处理的是媒体导出胶水,不负责 VAE decode。cosmos3_policy 路径的 postprocess 负责把 action 裁到真实维度,并可按 stats JSON 反归一化。

生成路径:Cosmos3Processor

Cosmos3Processor 是 Qwen chat-template tokenizer wrapper,主要用于 T2V/T2AV 的 Cosmos3T2VRequest。它会:
  • 对 positive prompt 使用 chat template,并追加 eos<|vision_start|> token。
  • 生成 text_ids 和全 1 的 text_mask
  • 对 negative prompt 走同样的 tokenization,生成 neg_text_idsneg_text_mask
  • append_metadata=True 且已知 fpsnum_framesheightwidth 时,给 positive prompt 追加时长、FPS 和分辨率信息。
  • negative_prompt=None 时,使用内置的 Cosmos3 structured bad-quality negative prompt;传 "" 表示空 negative。
常用构造方式:
tokenize_pair 的输出可以直接映射到 Cosmos3T2VRequest

和 T2V/T2AV Engine 串起来

下面的例子展示 tokenizer 输出如何组装成 Cosmos3T2VRequestvideo_shape 是 latent grid,不是像素尺寸;使用 pixel_to_latent_shape(num_frames, height, width) 从像素尺寸换算。
with_sound=True 时,engine.step 返回 {"video": pixels, "sound": waveform, "sample_rate": int};否则返回 video pixels,shape 为 (B, 3, T, H, W),数值范围为 [0, 1] Cosmos3GenerationPostProcessor.postprocess(...) 的输出是 Cosmos3GenerationOutput 保存 mp4:

动作策略路径:Cosmos3PolicyProcessor

Cosmos3PolicyProcessor 用于 cosmos3_policy plugin。它把 observation image/video、task prompt、可选 conditioning action 和 domain name 转成 Cosmos3ActionRequest 所需字段。 支持三种 mode:

输入规范

preprocess 接收一个 dict。常用字段如下: 输出的 Cosmos3PolicyProcessedInputs 字段:

图像预处理

Cosmos3ImagePreprocessStep 会把输入图像转为 RGB,再 resize/pad 成统一尺寸:
  • 输入可以是路径、PIL image、numpy array、torch tensor,或 list。
  • tensor / numpy 支持 channel-first 或 channel-last。
  • 浮点图像如果看起来是 [-1, 1],会先映射到 [0, 1]
  • resize 使用 scale-down BICUBIC,不会把小图放大;剩余区域用 reflect 或 edge padding。
  • 输出 layout 是 (1, 3, T, H, W),数值范围是 [-1, 1]
image_size 不为 None 时,processor 不直接使用构造参数里的 height/width,而是根据第一帧的原始比例把高度缩放到 image_size,再 snap 到 Cosmos3 训练时使用的预定义分辨率/宽高比网格。examples/cosmos3/run_cosmos3_policy.py 默认 image_size=480

文本 prompt

Cosmos3TextTokenizeStep 支持两种 prompt 格式: negative_prompt 不会追加 metadata。policy 示例默认 negative prompt 是空字符串。

动作和 domain

raw_action_dim 可以显式传入,也可以从 domain_name 自动解析。常见映射包括: 如果 domain_name 是整数 domain_id,processor 无法推断真实 action 宽度,需要显式传 raw_action_dim forward_dynamicscond_action 会按 action_chunk_size 裁剪或用最后一帧 repeat padding,然后补零到 action_dim。其他 mode 下 cond_action 会被置为 None

和 Policy Engine 串起来

下面的例子使用单张 observation image 做 policy 推理,并让 plugin 返回 action 和 decoded rollout pixels。出 action 时请使用 Cosmos3-Nano-Policy-DROID 这类 policy checkpoint;通用 Cosmos3-Nano 仍用于 T2V/T2AV 生成路径。
postprocess 的输出是 dict:

动作反归一化

如果构造 Cosmos3PolicyProcessor 时传入 action_stats_pathpostprocess 会在 CPU 迁移前把 action 反归一化到物理单位:
支持的 action_normalization 没有 action_stats_path 时,postprocess 只做 action slice 和 .cpu(),不会改变数值尺度。

常见问题

video_shape 为什么要再调用 pixel_to_latent_shape

Cosmos3PolicyProcessedInputs.video_shape 是预处理后的像素尺寸 (T, H, W)Cosmos3ActionRequest.video_shape 需要 latent grid (t_lat, h_lat, w_lat)。因此要调用 pixel_to_latent_shape(*processed.video_shape)

单图和视频 observation 有什么区别

单图输入会得到 T=1。视频或 list 输入会保留全部提供的帧,VAE encode 时也会编码整段 observation。下游哪些 latent frame 保持 clean 由 cond_frame_indexes 决定;示例脚本默认单图用 (0,),视频用 (0, 1)

raw_action_dimaction_dim 分别是什么

raw_action_dim 是机器人 embodiment 的真实动作宽度,例如 droid_lerobot=10agibotworld=29action_dim 是模型内部动作 token 宽度,默认 64。processor 会把 conditioning action padding 到 action_dim,postprocess 会把模型输出裁回 raw_action_dim

tokenizer 是否会联网

示例使用 checkpoint 内的 text_tokenizer 目录,例如 /path/to/Cosmos3-Nano-Policy-DROID/text_tokenizer。如果传的是远程 tokenizer 名且本地没有缓存,首次构造 tokenizer 可能会触发下载;离线环境建议传本地 tokenizer 路径。