Skip to main content

1. Model Introduction

Praxis-1 is a 27.2B-parameter sparse mixture-of-experts policy from Runway. From the camera frames, the end-effector state and a language instruction, it denoises a chunk of future video latents jointly with a chunk of continuous actions. The actions are returned; the predicted video can be decoded on request. The model has three parts:
  • Video-action transformer: a MoE backbone over video, text and action tokens with a windowed attention mask, plus an action expert with adaptive layer norm. Attention runs on FlexAttention.
  • Text encoder: Qwen3.5-2B.
  • Video VAE: the Wan2.2 VAE (Wan-AI/Wan2.2-TI2V-5B-Diffusers).
The sampler is a 2-step Euler window-joint sampler. Classifier-free guidance on the video stream costs a second, unguided pass per step, and each checkpoint sets its own recipe: Calls of one episode share a session_id: the first call has no context (one frame per view), later calls carry the 25 frames executed since the previous call and run with one context chunk. SGLang runs it in the native multimodal_gen runtime, not through the reference code. Supported checkpoints, both public Hugging Face repos in the LeRobot layout: The server picks the embodiment from the checkpoint, so the same command serves either one. The weights of the two checkpoints are 54.4 GB each (bf16, 17 shards). References:

2. Installation

Command

3. Model Deployment

Serve the DROID policy:
Command
Serve the YAM policy:
Command
The text encoder and the VAE are downloaded from their own Hub repositories on first start. A local copy of the policy (a directory holding config.json and the .safetensors shards) is detected automatically when passed as the model path. Pass --revision to pin a Hub revision. Peak GPU memory on one GPU, as the driver reports it (nvidia-smi, including the CUDA context and the memory the allocator keeps reserved) over a run of calls that includes decoding the predicted video: Layerwise offload streams the DiT blocks (and, with all, the text encoder and VAE blocks) from host memory, so use it only when the resident configuration does not fit.

3.1 Multi-GPU

Praxis-1 runs on one GPU, or on two with CFG parallel, which computes the guided and unguided passes on separate GPUs. Tensor and sequence parallelism are not supported.
Command
CFG parallel only helps requests with guidance (guidance_scale other than 1.0). The YAM policy serves without video guidance by default, so it gains nothing from a second GPU unless the request sets guidance_scale above 1.0.

3.2 Action Request Schema

The DROID and YAM requests differ in images and state. Every other field is shared. The response returns data[0].action with shape [24, 13] for DROID: position xyz (3), the rotation matrix row-major (9) and the gripper target (1). For YAM the shape is [24, 26]: those 13 values for the left arm, then for the right arm. On the first call of a YAM session extras.commands holds 21 rows, and 24 afterwards. extras.commands carries the same chunk as robot commands, and timings reports policy_ms (and step_ms, decode_ms when the video was decoded). GET /v1/actions/metadata reports the camera keys, the action layout and the sampler defaults of the served policy.

4. API Usage

Send msgpack with numpy arrays: a 25-frame stack of two views is too large to encode as JSON lists. pack_msgpack and unpack_msgpack come with SGLang.
Example
Predicted video: add "return_video": True to the observation and read out["extras"]["video"], an array of frames [T, H, W, 3]. For the YAM policy, send three views and a 16-value state. The server returns 26 values per row, 13 for each arm:
Example