Architecture

OpenWAM composes models through one boundary:

ExperimentConfig -> VariantPipeline -> VisualTower -> PolicyVariant -> ActionDecoder

This separates shared visual execution from policy experiments. A new dataset, conditioning program, model topology, or decoder should fit one of these roles rather than require a separate training or inference stack.

Runtime Ownership

Component Responsibility
ExperimentConfig Typed data, model, conditioning, optimization, and runtime choices
VariantPipeline Common input preparation, visual-stage orchestration, and decoder dispatch
VisualTower Shared encoding, transformer-facing execution, and optional video decoding
PolicyVariant Parameter topology, conditioning, token preparation, and recurrent inference state
ActionDecoder Final predictions, supervised losses, and model-space action plans

The pipeline passes typed artifacts between components. It does not inspect a particular policy's private tensors; the decoder validates its own payload. The visual tower executes prepared inputs and attention profiles, while the policy determines what conditioning and supervision mean.

Configuration Axes

Architecture, program, sequence contract, and decoder express different choices:

Axis Meaning Examples
Architecture Parameter ownership and topology parallel_stream, dual_expert, causal_video_prediction
Program Video/action conditioning and supervision joint, video_then_action, generalist_joint_denoising
Sequence contract Prefix, history, proprioception, and supervised frames default, legacy_prefix_single_frame_perchunk_proprio
Decoder Predictions, losses, and executable action plans parallel_stream_decoder, dual_expert_decoder

For video-action policies, policy_variant.program selects the program:

openwam-train \
  --cfg configs/experiments/dual_expert_libero_joint.yaml \
  --set policy_variant.program=video_then_action

The architecture derives compatible numerical execution and lower-level coupling from this choice. Those derived values are not additional authored config switches. Scheduler coupling is a separate explicit choice, not something inferred from a sequence layout. See Policy Architectures and Programs for supported combinations and Training and Inference for recipes.

Finite built-in choices become enums at the config boundary. Dataset names, paths, and extension identifiers remain open strings. For retired fields and checkpoint loading, consult Compatibility and the migration guide.

Built-In Architectures

Parallel Stream

parallel_stream packs video and action tokens into one shared transformer. The policy owns stream embedding, token packing, and output projection.

Dual Expert

dual_expert uses separate video and action transformer parameters. Paired blocks execute under the chosen program's visibility rules.

Causal Video Prediction

causal_video_prediction predicts video without action supervision. It can serve as a video producer for an independent action model; composition does not require it to create an artificial action stream.

Architecture packages do not import one another. They reuse shared sequence, attention, scheduler, and history contracts. Changing topology does not implicitly change conditioning semantics.

Data Boundary

Adapters selected by data.dataset_type parse source-specific storage and emit WAMSample or LatentWAMSample. The data layer owns:

  • camera decoding and canonical multi-view assembly;
  • action/state transforms and temporal alignment;
  • sample geometry, validity, and supervised-frame metadata;
  • mixed-source and dynamics-objective routing.

Models consume canonical tensors and metadata, not native camera names or simulator storage schemas. See Benchmarks and Data and Add A Dataset.

Generalist Joint Denoising

GJD is the generalist_joint_denoising program in either video-action architecture. Each sample selects one objective:

Mode Supplied clean modality Active loss Task text
Joint Neither future modality Video and action Retained
Forward dynamics (FDM) Future action Video only Removed
Inverse dynamics (IDM) Future video Action only Removed

data.dynamics_routing.routes assigns sources, modes, and relative sampling weights. Standalone forward_dynamics and inverse_dynamics use the same conditional semantics but require routes matching their fixed objective.

Conditional samples begin with a clean t0 video frame in a singleton chunk, with no supervised or visible fictitious t0 action. Future frames are targets. Each conditional chunk sees the most recent clean video boundary and its aligned proprioception, not an unrestricted demonstration prefix. The supplied future modality occupies its clean, timestep-zero conditioning slot; only the other modality is denoised and supervised.

Joint samples retain their configured planning history and text. Frame-level and chunk-level proprioception are aligned to the preceding boundary before architecture-specific token packing, preventing access to future state. These rules are shared by training and rollout.

See GJD recipes for source routing, ablations, and inference commands.

Denoising And Feature Reuse

Programs define dependencies; architectures supply computation. Shared denoising advances schedulers and applies per-stream classifier-free guidance (CFG). Video-then-action supplies the completed video to action generation; action-then-video reverses that order; decoupled stages do not promote the other modality.

inference.use_cache enables reuse of invariant features within a denoising call. It does not change history visibility, scheduler clocks, or the number of denoising updates. Features are reusable only when their attention dependencies are invariant. A supplied clean modality is not automatically cacheable if its queries can attend to changing tokens.

Observed and speculative history belong to the rollout session, separately from these temporary computed features. Attention profiles define visibility; dense and FlexAttention backends execute that same contract.

Rollout Lifecycle

Benchmark driver -> RolloutEngine -> RolloutPlanner -> VariantRolloutRunner
                                                           |
                                                    VariantPipeline

The driver translates environment I/O. The planner prepares a candidate using an immutable policy session. The engine accepts a plan, executes controls, and commits actual observations/actions before the next generation. Predictions and unexecuted actions are speculative, not observed history.

The same lifecycle supports blocking and asynchronous execution where the planner permits it. Fallback controls must be recorded as executed; they cannot be hidden from model history. Temporal geometry comes from the assembled policy, frontend, and action contract rather than script-specific offsets.

For custom integrations, see Rollout Contracts. Independent video and action models use the same lifecycle and exchange canonical artifacts, not model-specific caches; see Video-to-Action Composition.

Training And Checkpoints

The training runtime owns optimization, scheduling, logging, validation, distributed execution, and checkpoint publication. Policies supply prepared batches and predictions; decoders supply losses.

Full-state checkpoints include optimizer, scheduler, strategy/scaler, and progress state. Weight initialization and full-state resume are distinct operations. See checkpoint usage and Artifacts.

Extension Boundary

Choose the smallest component that owns the change:

  • Add a dataset adapter for a new source format.
  • Add a policy for a new parameter topology or conditioning program.
  • Add a decoder for a new output representation or loss.
  • Add a simulator adapter for environment I/O.

Use role-specific open_wam.sdk contracts rather than private implementation helpers. The Extension SDK and cookbooks provide examples.

Numerical Behavior

Refactors must preserve configured model semantics. Regression coverage checks outputs, losses, gradients, optimizer updates, history reconciliation, and checkpoint resume. Exact numerical claims additionally require matched artifacts and hardware/software stacks; see Testing.