[rollout] fix: add missing RolloutConfig keys to rollout.yaml - #7430
Open
Nas01010101 wants to merge 2 commits into
Open
[rollout] fix: add missing RolloutConfig keys to rollout.yaml#7430Nas01010101 wants to merge 2 commits into
Nas01010101 wants to merge 2 commits into
Conversation
Six RolloutConfig fields have no key in rollout.yaml. Hydra runs in struct mode, so actor_rollout_ref.rollout.<field>=... is rejected before training starts even though each field is read at runtime: limit_images vllm_async_server.py sets limit_mm_per_prompt repetition_penalty vllm_async_server.py sampling params enable_sleep_mode vllm_async_server.py, trtllm_async_server.py standalone_gpu_memory_utilization fully_async_rollouter.py moe_tensor_parallel_size trtllm_async_server.py checkpoint_manager_class ray_trainer.py limit_images is already present in the inline rollout block of reward/reward.yaml, which builds the same RolloutConfig, so the same override works on the reward model rollout and fails on the actor rollout. Each key is added with its dataclass default, so composed values are unchanged. The generated trainer configs are regenerated accordingly. tests/special_sanity/test_rollout_config_parity.py compares the dataclass fields against the composed node and lists the deliberate exclusions.
Nas01010101
requested review from
PeterSH6,
eric-haibin-lin,
tongyx361 and
vermouth1992
as code owners
August 15, 2026 10:39
RolloutConfig.server (ServerConfig) has no block in rollout.yaml, so actor_rollout_ref.rollout.server.timeout=... and the other four settings are rejected by Hydra. The trtllm rollout reads timeout, max_attempts, retry_delay and max_connections when it builds its HTTP client, so those values are fixed at their dataclass defaults for every run. The block is added with the dataclass defaults and follows the same shape as the neighbouring prometheus block, including _target_.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Seven
RolloutConfigentries have no key inverl/trainer/config/rollout/rollout.yaml. Hydra composes the trainer config in struct mode, so a plainactor_rollout_ref.rollout.<field>=...override is rejected before training starts, even though every one of them is read at runtime:limit_imagesvllm_async_server.py— setslimit_mm_per_promptfor multi-image datarepetition_penaltyvllm_async_server.py— default for the sampling parameterenable_sleep_modevllm_async_server.py,trtllm_async_server.pystandalone_gpu_memory_utilizationfully_async_rollouter.pymoe_tensor_parallel_sizetrtllm_async_server.pycheckpoint_manager_classray_trainer.py,separation/ray_trainer.pyserver(ServerConfig)trtllm_rollout.py—timeout,max_attempts,retry_delay,max_connectionsOn
main, each of them aborts the run:limit_imagesshows the inconsistency most directly:reward/reward.yamlcarries an inline rollout block with the same_target_: verl.workers.config.RolloutConfig, and it does listlimit_images: null. So the same override works on the reward-model rollout and fails on the actor rollout, which is where multi-image training data needs it.enable_sleep_modedefaults toTrueand gatesif not self.config.enable_sleep_mode:in the vLLM async server, so there is currently no way to turn it off from the command line.serverhas no block at all, so the trtllm rollout's HTTP timeout and retry settings are pinned to their dataclass defaults for every run.Same class as #7387 / #7426 (checkpoint config), on the rollout config.
Checklist Before Starting
is:pr is:open limit_images,is:pr is:open repetition_penalty,is:pr is:open rollout.yaml. [rollout] feat: add custom sampling parameters for rollout generation #5138 also touchesrollout.yamlbut adds a new custom-sampling-parameter mechanism rather than restoring parity for existing fields; happy to rebase around it.[{modules}] {type}: {description}Test
tests/special_sanity/test_rollout_config_parity.pycomparesfields(RolloutConfig)against the composedactor_rollout_ref.rolloutnode for bothppo_trainerandppo_megatron_trainer. It fails onmain:and passes with this change. A second test asserts
KNOWN_UNMAPPEDdoes not go stale.API and Usage Example
All seven become settable; composed defaults are unchanged because each key is added with its dataclass default.
python3 -m verl.trainer.main_ppo \ actor_rollout_ref.rollout.limit_images=4 \ actor_rollout_ref.rollout.repetition_penalty=1.05 \ actor_rollout_ref.rollout.enable_sleep_mode=False \ actor_rollout_ref.rollout.standalone_gpu_memory_utilization=0.9 \ actor_rollout_ref.rollout.checkpoint_manager_class=my.pkg.MyManager \ actor_rollout_ref.rollout.server.timeout=120 \ actor_rollout_ref.rollout.server.max_attempts=5 \ ...Composing with no overrides gives
limit_images=None,repetition_penalty=1.0,enable_sleep_mode=True,standalone_gpu_memory_utilization=None,moe_tensor_parallel_size=1,checkpoint_manager_class=None, andserverattimeout=60.0, max_attempts=3, retry_delay=2.0, max_connections=1000, max_start_wait_time=300.0— the dataclass defaults.Design & Code Changes
verl/trainer/config/rollout/rollout.yaml: six scalar keys added next to their related settings, plus aserver:block shaped like the neighbouringprometheus:block (with_target_). Every value is the dataclass default.verl/trainer/config/_generated_*_trainer.yaml: regenerated viascripts/generate_trainer_config.sh(+13 lines each, additive).tests/special_sanity/test_rollout_config_parity.py: new.Left out, and why:
custom,layer_name_mapandsglang_engine_modehave no reader in the tree. All three are listed inKNOWN_UNMAPPEDin the test so the exclusion is explicit rather than silent, and the second test fails if one of them later gains a YAML key.Checklist Before Submitting
tests/special_sanity/already runs in CI.ci-requestchannel.recipesubmodule — not touched.