Skip to main content
HumanWAM-Goal predicts an action chunk from a task instruction, current camera images, a goal image, and robot state. In PhyAI, use the humanwam_goal plugin and the examples/HumanWAM-Goal/run_humanwam_goal.py entry point. Python imports use phyai.models.humanwam_goal and phyai_utils_tools.models.humanwam_goal.

Prepare the environment

Use Linux with GLIBC 2.34 or newer, Python 3.12 or 3.13, and a Hopper GPU (SM90). This inference path is tested with Torch 2.11 and CUDA 12.8. TP=2/4 requires NVLink-connected GPUs and the CUDA toolkit (nvcc). Follow installation to prepare a PhyAI checkout. From its root, activate the environment and install the CUDA 12.8 builds and attention dependency:

Prepare the checkpoint

Model weights: HumanWAM-Goal on Hugging Face. Set the path to an inference checkpoint with these assets:
Keep the supplied configuration files with their matching weights. sampling.json must include corrector_weights for the ten-step sampling schedule.

Prepare an observation

Save your observation in JSON. Image paths are relative to that JSON file; the example script loads them as RGB images. Replace the image paths, instruction, state values, and domain ID below with values for your checkpoint and robot. The zero state shows the input shape only.
normalized_state uses the checkpoint’s normalization and model coordinates. The example does not convert physical robot coordinates. You can also supply state_valid_mask and action_valid_mask to specify valid state and action channels; padded channels must remain disabled. For visual history, add captures to history in timestamp order, oldest first: {"timestamp": ..., "images": {...}}. Their timestamps must precede observation_timestamp and use the same time base in seconds. The processor selects frames using the history settings in processor.json. For real-time chunking (RTC), add normalized_prefix as a matrix of previous actions in the same normalized model coordinates. Its row count must fit the checkpoint’s prefix-length limit. Omit it when you have no prefix to condition on.

Run inference

Select an available GPU. This command uses one GPU:
To use two GPUs, expose both devices and set --tp 2:
For four GPUs, use CUDA_VISIBLE_DEVICES=0,1,2,3 and --tp 4. The Engine starts the workers; run the command once. Add --no-cuda-graph for eager execution. The first request includes model warmup and graph capture.

Read the output

The script saves a NumPy .npy array of normalized actions:
With the default configuration, the result is (1, 48, 49) float32 True: one action chunk, 48 steps, and 49 values per step. RTC prefix rows remain in the chunk. Convert the normalized output to your robot’s coordinates and skip the already committed prefix before executing new actions.