Overview
DreamZero is a World Action Model (WAM). It uses a video diffusion backbone to jointly predict future video and actions from camera images, language instructions, and robot state. PhyAI’sws1 path runs the text encoder, image encoder, VAE, and DiT on a single GPU. The engine accepts preprocessed tensors and returns video latents and a normalized action chunk. Image transforms, tokenization, state normalization, and action reconstruction are handled outside the engine by DreamZeroProcessor.
This page uses the
GEAR-Dreams/DreamZero-DROID checkpoint and covers single-GPU, single-sequence inference. Model weights, configuration, and the normalization statistics used by the processor should come from the same checkpoint.Architecture
Thedreamzero plugin follows PhyAI’s :
phyai/src/phyai/models/dreamzero
main_dreamzero.py
builder_dreamzero.py
pipeline_dreamzero.py
scheduler_dreamzero.py
model_runner_dreamzero.py
modeling_dreamzero.py
configuration_dreamzero.py
phyai-utils-tools/src/phyai_utils_tools/models/dreamzero
processor_dreamzero.py
steps_dreamzero.py
Each request first encodes text and visual conditioning, then prepares reference KV and video/action noise. The scheduler calls DiT in the denoising loop, updates both latent streams, and carries frame positions and caches into the next request. The CLI action inference path returns video latents directly without decoding RGB video.
The request path is:
Run DreamZero
1
Prepare the checkpoint
Prepare the DreamZero-DROID weights and UMT5 tokenizer. Keep the configuration,
experiment_cfg/metadata.json, and experiment_cfg/conf.yaml in the model directory so the processor can read normalization statistics, modalities, and relative-action settings.The examples use the repository’s CUDA environment and BF16 precision, with TF32 and CUDA Graph disabled.2
Build the engine
Create an engine with the
dreamzero plugin. This page uses the 16-step dynamic DiT schedule and the kernel policy in the example directory.3
Build the processor
The processor uses the same checkpoint as the engine and reads the loaded model configuration.
4
Build a request
Like the other models’ single-request examples, generate synthetic observations to check the inference path: three random RGB images, zero state, and a task instruction. Zero state is a convention for this example; replace it with actual joint positions and gripper state when connecting a robot or simulator.
5
Run a step and reconstruct actions
(1, 24, 8). Retain the original observation for relative-action reconstruction configured by the checkpoint.6
Close the engine
Request format
Raw observations
This page usesB=1. T is the observation history length for each camera; it is 1 for the first request.
The processor center-crops each camera view, resizes it to
176 × 320, and combines the views into a 352 × 640 grid. The wrist view occupies the upper half, and the right and left views occupy the two sides of the lower half. It also handles state normalization, padding, embodiment IDs, and tokenization of positive and negative prompts.
Engine requests and outputs
engine.step() accepts DreamZeroProcessedInputs. The following shapes correspond to the common DROID configuration; use the loaded config for the actual widths.
The postprocessor removes action padding, converts to FP32, and denormalizes using checkpoint statistics. If the checkpoint configures relative joint actions, it also reconstructs joint positions using the original observation. Keep
observation and pass it as obs=observation.
DreamZeroPipelineOutput also retains request and scheduler_output for inspecting internal noise, scheduling results, and frame positions. The internal DreamZeroRequest contains video and action latents, encoded conditioning, and cache control fields. The pipeline constructs it, so callers usually do not need to create it manually.
End-to-end example
By default,examples/dreamzero/run_dreamzero.py generates three random 180 × 320 RGB images, an eight-dimensional zero state, and the task instruction Pick up the object. No camera connection or image files are required. Activate an environment with PhyAI dependencies installed, then run from the repository root:
action.npy:
Sequential requests
Reuse the same engine for a sequence. The caller collects and arranges historical observations, while the pipeline and scheduler retain encoded conditioning, frame positions, and DiT KV. The processor does not accumulate camera history for the caller.
Prepare the four historical frames at the control loop’s sampling cadence; repeating the current image cannot replace actual history. The underlying implementation also handles specific nine-frame reference inputs, but multi-frame lengths are constrained by
num_frame_per_block and cannot be changed arbitrarily.
To start a new task, clear the caller’s observation history and call engine.step() with one new observation frame. Changing only the task text does not automatically create an independent session. For explicit cache control, use the current_start_frame and reset_kv_cache parameters of engine.entry.bundle.pipeline. This is a lower-level interface, and callers must also explicitly provide the required denoising configuration.
Inference configuration
Fixed4 and dynamic16
The examples default to dynamic16. Use--no-dynamic-dit to switch to fixed steps. In dynamic mode, the scheduler uses changes in video predictions to decide which schedule steps run DiT again and which reuse previous predictions. The number 16 refers to schedule steps; the actual number of DiT forwards may be smaller. Do not treat dynamic16 as 16 fixed model executions when measuring performance.
The corresponding Python settings are DreamZeroArgs.num_inference_steps, dynamic_dit, and dynamic_dit_scheduler_steps. The Entry passes them to the pipeline.
Kernel policy and compilation
The example policy explicitly selects:
Other operators follow the framework’s kernel selection rules. VAE channel L2 norm has different computational semantics from standard RMSNorm and should not be replaced based on its name alone.
compile_scheduler=True compiles UniPC updates; it controls a different mechanism from RuntimeConfig.use_cuda_graph. The example disables CUDA Graph, and enabling scheduler compilation does not mean the entire model path has been captured as a CUDA Graph. Compilation adds overhead to the first execution, so time the first request separately from subsequent requests.
Accuracy regression reports should record the checkpoint, source revision, kernel policy, Torch/CUDA versions, and actual initial video/action noise. The same seed does not guarantee elementwise-identical noise across device execution configurations. Enabling scheduler compilation alone also does not establish numerical parity with the official implementation across the full path.
Current limitations
- This page covers a single GPU,
B=1, and DROID three-camera inputs. Other parallel configurations in the model code are outside this page’s validation scope. run_dreamzero.pygenerates one initial action chunk. Network serving, historical-frame sampling, action execution, and task success evaluation require a higher-level adapter.- Weights, live KV, temporary encoding tensors, and compilation caches all affect peak memory. Jetson Thor’s unified memory is also shared with CPU processes, so weight size alone is insufficient to estimate memory requirements for sequential requests.
- Closing the engine releases the model and runtime state it holds. Resource peaks across successive episodes require separate validation in the target deployment environment.

