[weight_broadcast] type = "modelexpress" sends full FSDP weight updates from the trainer to vLLM through ModelExpress (MX). Inference GPUs pull their shards over RDMA (NIXL) from a host snapshot of the trainer shards, so the trainer does not run a collective with inference.
Setup
The GPU extra pins the MX client (modelexpress==0.8.0.dev20261022). Build the matching server and its Redis backend once on the shared filesystem:
uv run rl starts a run-scoped server and Redis (logs under logs/modelexpress/). Multi-node SLURM jobs start them on the trainer head node. To use an existing server instead, set slurm.launch_modelexpress = false and configure weight_broadcast.host and weight_broadcast.port.
Config
staging_mode:COPY_TO_HOST(default) snapshots trainer shards into host memory.COPY_TO_DEVICEuses extra GPU memory.IN_PLACEcopies nothing, but requires the trainer tensors to stay unchanged and already have the transfer dtype until inference has installed them.staging_buffer_bytes×staging_buffers_countbounds the extra receiver memory per inference GPU. Without it, each GPU stages a full copy of its shard, which can OOM at highgpu_memory_utilization.
Behavior
- The first update is slower while MX plans the transfer; later updates reuse the plan.
- Inference is paused only after the trainer has published the version. A failed update leaves inference paused; restart the trainer and inference together, since there is no rollback.
- Trainer rank 0 and the orchestrator must share the broadcast directory, which holds only rendezvous markers, not weights.