Skip to content

Commit ea3562e

Browse files
authored
batch invariant configs should have max off policy = 0 (#3910)
as title without this max off policy is 3 inherited from base config so we hsould set this to 0 in the batch invariant configs to see 0 diff between trainer and generator per step <img width="1498" height="458" alt="Screenshot 2026-07-13 at 2 36 12 PM" src="https://github.com/user-attachments/assets/9b563480-fc66-45df-8d83-7a658279311d" />
1 parent 491596e commit ea3562e

1 file changed

Lines changed: 13 additions & 0 deletions

File tree

torchtitan/experiments/rl/examples/alphabet_sort/config_registry.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,10 @@ def rl_grpo_qwen3_0_6b_flex_batch_invariant() -> Controller.Config:
209209
config.async_loop.batcher = dataclasses.replace(
210210
config.async_loop.batcher, per_sample_pad_multiple=block_size
211211
)
212+
# Batch invariance requires strict on-policy: the generator must run the
213+
# latest weights before generating so trainer/generator logprobs stay
214+
# bitwise-identical (bit_wise/logprob_diff == 0) every step, not just step 1.
215+
config.async_loop.max_offpolicy_steps = 0
212216
config.trainer = dataclasses.replace(
213217
config.trainer,
214218
debug=_BATCH_INVARIANT_DEBUG,
@@ -357,6 +361,9 @@ def rl_grpo_gpt_oss_debug_varlen_batch_invariant() -> Controller.Config:
357361
hf_assets_path="tests/assets/tokenizer",
358362
async_loop=AsyncLoopConfig(
359363
num_training_steps=3,
364+
# Batch invariance: strict on-policy so trainer/generator logprobs
365+
# stay bitwise-identical every step.
366+
max_offpolicy_steps=0,
360367
num_groups_per_train_step=5,
361368
group_size=group_size,
362369
validation=ValidationConfig(num_samples=20),
@@ -663,6 +670,9 @@ def rl_grpo_qwen3_moe_debug_varlen_batch_invariant() -> Controller.Config:
663670
hf_assets_path="tests/assets/tokenizer",
664671
async_loop=AsyncLoopConfig(
665672
num_training_steps=10,
673+
# Batch invariance: strict on-policy so trainer/generator logprobs
674+
# stay bitwise-identical every step.
675+
max_offpolicy_steps=0,
666676
num_groups_per_train_step=8,
667677
group_size=group_size,
668678
validation=ValidationConfig(num_samples=20),
@@ -837,6 +847,9 @@ def rl_grpo_qwen3_0_6b_varlen_batch_invariant() -> Controller.Config:
837847
num_generators=3,
838848
async_loop=AsyncLoopConfig(
839849
num_training_steps=10,
850+
# Batch invariance: strict on-policy so trainer/generator logprobs
851+
# stay bitwise-identical every step.
852+
max_offpolicy_steps=0,
840853
num_groups_per_train_step=8,
841854
group_size=group_size,
842855
validation=ValidationConfig(num_samples=20),

0 commit comments

Comments
 (0)