verl Integration
Run the public verl-recipe Dynamo rollout backend
Experimental. verl-recipe provides an asynchronous Dynamo rollout backend with a shared frontend, vLLM workers, routing, and colocated policy updates. Use the upstream recipe as the implementation source of truth; this page covers the shortest Dynamo workflow and its support boundary.
Integration Shape
The native router and ThunderAgent are different scheduling paths. Choose one before building the environment and do not compare their results as if only a router flag changed.
Prerequisites
- A Linux GPU environment that satisfies the selected verl, Dynamo, vLLM, CUDA, and PyTorch versions
git, Python,etcd, andnats-server- Model and dataset paths visible on every participating node
- Enough GPUs for the trainer and rollout layout; the validation smoke is not a full training run
Prepare the Source
The reviewed recipe snapshot is 461b830c, and its REQUIRED_VERL.txt selects the matching core verl commit. The core commit records an older recipe submodule, so use the installer and then set the nested recipe checkout to the same reviewed snapshot:
The recipe does not pin a complete Dynamo/vLLM image for the native-router path. Build one clean environment, record its immutable image and package versions, and keep the Dynamo and nested recipe checkouts clean during validation.
Run the Validation Smoke
Run the upstream validation-only smoke from the resulting verl checkout:
The smoke starts recipe-managed etcd, NATS, a Dynamo vLLM worker, and the shared frontend. PASS: Dynamo validation smoke completed confirms the validation command completed; it does not prove an optimizer step or policy refresh.
Run a Training Iteration
After the smoke passes, run at least one optimizer step with the same environment. Use the pinned upstream Dynamo trainer configuration as the baseline, then make the model, data, resource, and routing overrides required for your environment. This example selects the native Dynamo router explicitly:
Adjust model, data, and resource values for your environment. A passing run must include rollout generation, reward or advantage computation, an actor update, policy synchronization, and generation after the update.
Verify the Run
Check three boundaries before scaling:
- Generation correctness: The completion token IDs and selected log probabilities consumed by verl match in length and order. Record terminal and canceled attempts separately.
- Policy update: Every intended rollout shard receives the same trainer step through the recipe’s CUDA IPC path, stale KV state is handled, and post-update generation succeeds.
- Routing: With ThunderAgent disabled, compare
round-robinandkvusing the same prompts, concurrency, cache state, and update cadence. Report useful framework output, not only request throughput.
Set request_completion_token_ids=true when the framework must score the exact engine tokens. Use RL Integration Reference for the shared response checks and KV-Aware Load Balancing for RL Rollouts for the routing experiment.
Observe and Recover
The training command above enables worker system metrics and starts the provided sidecar before workers come online. The sidecar rediscovers endpoint files throughout the run and writes per-worker snapshots to /tmp/verl-dynamo/kv-metrics.jsonl; starting it only after training leaves no live workers to scrape.
See Profile and Simulate RL Rollouts for request tracing and Distribute and Update Rollout Weights for the policy-update boundary.
Current Limitations
- The recipe does not provide one complete native-path Dynamo/vLLM image pin.
- The documented policy update is the recipe’s colocated CUDA IPC path, not public Dynamo worker discovery or ModelExpress.
- Multi-node and large-model layouts require separate topology and failure validation.
- Supported status requires an independent run with token correctness, policy refresh, post-update generation, and request, worker, and update recovery.