Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
223 commits
Select commit Hold shift + click to select a range
f87cb1b
fix(rm): raise clear error when CP is used with DTensor RM training (…
terrykong May 15, 2026
30108c3
feat: Add HybridEP support for MoE expert parallelism (#1942)
seonjinn May 18, 2026
1a97e0f
fix: enable TE FusedAdam for Qwen3.5 MoE & GLM-4.7-Flash automodel re…
zpqiu May 18, 2026
9053154
perf: enable MoE GroupedGEMM for MoE models (#2278)
seonjinn May 19, 2026
30afecc
fix: remove mlm workspace (#2136)
kajalj22 May 19, 2026
79a6290
ci: skip sglang build and tests for external contributors (#2532)
kajalj22 May 20, 2026
37afd80
ci: Skip sglang prefetch for Lfast CI label (#2534)
chtruong814 May 20, 2026
012bf17
feat: Auto research skill (#2419)
vinhngx May 20, 2026
a7fb764
feat: add AIME-2026 benchmark. (#2469)
xxman-google May 20, 2026
ad36496
docs(fp8): fix YAML key names for pow2 scaling factors (#2536)
achartier May 20, 2026
6afb047
fix: reset dataloader index when dataset changes on resume (#2519)
jinglinglingling May 21, 2026
2a2e7c1
feat: Discard weight when finish generation in the main loop (#2495)
guyueh1 May 21, 2026
247f2e3
fix: set PackedSeqParams.total_tokens for mamba seq packing (#2529)
yfw May 21, 2026
fc60573
fix: run dynamic sampling on unshaped rewards (#2478)
ashors1 May 21, 2026
aa4107e
fix(data): add 'aime2026' to AIMEEvalDataConfig literal (#2469 follow…
qiaochuz-nv May 22, 2026
b603568
perf: selective activation checkpointing feature support (#2280)
seonjinn May 22, 2026
501cd12
fix: aggregate rollout metrics by semantic type (min/max/sum/mean) (#…
yfw May 22, 2026
241ece5
chore: Upgrade vLLM from 0.17.1 to 0.20.0 (#2384)
kajalj22 May 22, 2026
4454fa6
feat: data plane transfer queue integration (#2439)
ZhiyuLi-Nvidia May 24, 2026
f3e9e81
chore: move contributor-facing skills to .agents/contributor-skills/ …
terrykong May 25, 2026
66059ab
fix: Fix the performance page (#2563)
guyueh1 May 25, 2026
ed685b6
perf: Performance script tuning (#2473)
guyueh1 May 26, 2026
bb7e845
feat: [NemoRL] Introduce WeightSynchronizer ABC with IPC/HTTP/NCCL tr…
saumishr May 26, 2026
bff7286
ci: Remove GHA workflow to update skills symlink (#2575)
chtruong814 May 26, 2026
fad476e
fix: move session-memory back to skills/ with auto-research group (#2…
terrykong May 26, 2026
f46ecf7
feat(sft): make only_unmask_final configurable in SFTConfig (#2516)
yuki-97 May 27, 2026
c3bb1d7
fix: use prompt token length for advantage group extraction and fix t…
yfw May 27, 2026
354b8d3
ci: validate release branch-rules (#2546)
ko3n1g May 27, 2026
52d7c93
fix: lower mooncake memory in functional test (#2584)
yuki-97 May 27, 2026
1ded27a
fix(vllm): serialise AsyncMPClient input_socket sends to prevent zmq …
kaloyan-inherent May 27, 2026
a1bf1ad
fix: pass weight shape instead of tensor to should_use_deepgemm_for_f…
kajalj22 May 27, 2026
65683e0
ci: add NVSkills CI workflow for skill signing (#2594)
terrykong May 28, 2026
ff14a44
fix: Make moe_backend triton to fix refit issue with moonlight (#2586)
guyueh1 May 28, 2026
64be007
feat(grpo): add sequence-level logprob error metrics (#2559)
macandro96 May 28, 2026
5494d14
fix: fix preserving dataset merge (#2515)
yuki-97 May 28, 2026
491afa4
fix(grpo): handle seq logprob metrics in sync trainer (#2600)
macandro96 May 28, 2026
684080e
fix: handle non-contiguous tensors in IPC weight refit (#2418)
jlcanta May 28, 2026
9e0cdfd
feat: add GPU variant of Megatron to HF converter (#2581)
macandro96 May 29, 2026
d25ce82
ci: switch sglang to prebuilt PyPI wheels (v0.5.11) (#2535)
kajalj22 May 29, 2026
9b39c07
fix(nemo-gym): clamp max_new_tokens to prompt + output <= max_model_l…
yuki-97 May 29, 2026
7f85849
ci: shard tests to run more in parallel (#2345)
chtruong814 May 29, 2026
bb715a7
ci: guard coverage combine against empty coverage glob in fast shards…
achartier May 29, 2026
f018556
feat: Expose dp_replicate_size for hybrid FSDP in Automodel DTensor v…
vigneshwaran May 29, 2026
b50f51e
ci(docs): NVSkills signing — license, evals, secrets baseline (#2603)
terrykong May 29, 2026
d9fcf3f
ci(launch-nemo-rl): NVSkills signing — license, evals, secrets baseli…
terrykong May 29, 2026
8fbc14b
ci(brev-etiquette): NVSkills signing — license, evals, secrets baseli…
terrykong May 29, 2026
f8ebf0d
ci(auto-research): NVSkills signing — license, evals, secrets baselin…
terrykong May 29, 2026
cd54f8f
ci(session-memory): NVSkills signing — license, evals, secrets baseli…
terrykong May 29, 2026
166ca33
fix(docker): set LD_LIBRARY_PATH for AWS EFA OFI plugin discovery (#2…
ko3n1g May 29, 2026
d9506f7
fix(security): bump mlflow and urllib3 for CVE remediation (#2560)
kajalj22 May 30, 2026
c336076
fix: Fix nanov3 mcore test (#2635)
yfw May 30, 2026
48b2cd2
fix: Fix nanov2 nightlies for new vllm (#2636)
yfw May 30, 2026
e94d33c
revert: Discard weight when finish generation in the main loop (#2495…
terrykong Jun 1, 2026
8eaf7ba
docs: update docs for TypedDict → BaseModel/dataclass (#2650)
yuki-97 Jun 2, 2026
234c44a
refactor: rename docs skill to nemo-rl-docs (#2657)
terrykong Jun 2, 2026
28bebce
refactor: rename session-memory skill to nemo-rl-session-memory (#2659)
terrykong Jun 2, 2026
3fb5618
refactor: rename brev-etiquette skill to nemo-rl-brev-etiquette (#2660)
terrykong Jun 2, 2026
333864d
refactor: rename auto-research skill to nemo-rl-auto-research (#2661)
terrykong Jun 2, 2026
19b1a2a
fix: update ray executor import for vLLM 0.20 (#2609)
achartier Jun 2, 2026
36aac9a
fix: lazily import megatron-core in model_utils (#2648)
RayenTian Jun 3, 2026
ab079b8
feat: add AsyncNemoGymRolloutManager for gym per-prompt rollouts (#2528)
yuki-97 Jun 3, 2026
a841fc9
feat: Add support for GLM 5.1 GRPO (#2489)
slikhite-1 Jun 3, 2026
4e00a24
fix(test): increase timeout for grpo-llama3.2-1b-1n4g nightly test (#…
kajalj22 Jun 3, 2026
fa63eb3
fix(vllm): selectively port NeMo Gym/vLLM cherry-pick fixes (#2639)
macandro96 Jun 4, 2026
49c9f16
fix: lower DPO Qwen2.5-Math-7B accuracy threshold after torch 2.11 up…
NolenLiang Jun 4, 2026
7b568f7
fix: configure port ranges to avoid TOCTOU port contention (#2380)
terrykong Jun 4, 2026
db8a0ef
build: Update deps for Megatron Inference (#2565)
tdene Jun 4, 2026
cff2cba
feat(vllm): support custom reasoning parser plugins (#2569)
macandro96 Jun 4, 2026
402a7fb
ci: Bump Megatron-Bridge to 4bb6330 (#2688)
svcnvidia-nemo-ci Jun 4, 2026
9ba6b1b
feat(data): support dotted import paths in dataset_name (#2642)
lonexreb Jun 5, 2026
458548d
fix(grpo): improve non-colocated refit handling (#2672)
macandro96 Jun 5, 2026
65f4435
build: add managed = true to [tool.uv] (#2704)
kajalj22 Jun 5, 2026
aeb55b5
feat: grpo advantage clip overlong filter (#2686)
arnavk-nvidia Jun 5, 2026
a196d1f
docs: Add ultra news item (#2731)
yfw Jun 6, 2026
37526df
fix(grpo): penalize invalid tool call and malformed thinking (#2656)
macandro96 Jun 6, 2026
50972b9
chore: Remove unused converter type (#2640)
MyviordDjaja Jun 8, 2026
20b10bb
ci: Bump Megatron-Bridge to 823b951 (#2735)
svcnvidia-nemo-ci Jun 8, 2026
44c607d
test: add TQ nightly coverage set (simple + mooncake_cpu backends) (#…
ZhiyuLi-Nvidia Jun 8, 2026
55985e2
fix: fix grpo-gptoss-20b-8n8g-megatron (#2734)
yuki-97 Jun 8, 2026
8f34b33
fix(security): bump deps for CVE remediation (June 2026) (#2663)
kajalj22 Jun 8, 2026
d9ba460
perf: pool IsolatedWorkerInitializer per node instead of per worker (…
ananthsub Jun 9, 2026
66a7e42
fix(flops): count Qwen3 attention FLOPs with num_heads*head_dim (#2736)
joyang-nv Jun 9, 2026
44f2600
feat(xtoken): cross-tokenizer off-policy distillation (#2508)
avenkateshha Jun 9, 2026
e1c2868
ci: bump _release_library.yml to v1.4.3 (#2678)
ko3n1g Jun 9, 2026
e2a144b
chore: bump `_code_freeze` workflow to `v1.4.2` (#2675)
ko3n1g Jun 9, 2026
68065ad
feat: support Qwen/Qwen3-Omni-30B-A3B-Instruct and Audiomcq dataset. …
yuekaizhang Jun 9, 2026
d1788b2
fix: fix qwen3-235b deepseek-v3 h100 perf tests (#2703)
yuki-97 Jun 9, 2026
55fb0d0
feat: add AsyncRolloutManager for native async per-prompt rollouts (#…
yuki-97 Jun 9, 2026
04fc137
fix: Fix fp8 memory fragmentation (#2670)
ashors1 Jun 9, 2026
05967a8
fix(grpo): ReplayBuffer checkpointing and fix reservation leaks (#2651)
macandro96 Jun 9, 2026
7c702b7
chore: drop duplicated text field in x-token (#2747)
yuki-97 Jun 10, 2026
f6e9187
feat(vllm): add deferred model load for overlapped NeMo Gym init (#2750)
yfw Jun 10, 2026
857b115
feat: PPO with MCore (#2530)
bg51717 Jun 10, 2026
ca66d07
ci: add ray.sub sandbox sidecar support (#2763)
macandro96 Jun 10, 2026
7556ddc
fix(security): bump PyJWT and mlflow for CVE remediation (#2752)
kajalj22 Jun 10, 2026
6a9146f
feat: overlap NeMo Gym init with vLLM init (#2741)
yfw Jun 10, 2026
0d51a50
fix(vllm): respect external VLLM_CACHE_ROOT for per-DP-group cache (#…
yfw Jun 10, 2026
f8478e8
ci: increase Slurm time limits by +5 min for 5 nightly tests (#2769)
kajalj22 Jun 11, 2026
6f52ade
feat(xtoken): combine next-token CE with H-KL gold loss (#2757)
avenkateshha Jun 11, 2026
557446d
refactor: unify per-prompt rollout to RolloutManager (#2567)
yuki-97 Jun 11, 2026
45272dd
feat: Enable tqdm configuration for vllm generation (#2677)
louisfaury Jun 11, 2026
e5cf79c
fix: increase nightly test time 1820 -> 1890 (#2777)
yuki-97 Jun 11, 2026
0afedd0
feat: Enable NeMo Gym rollouts for distillation (#2759)
mxinO Jun 11, 2026
0c0988d
fix: fix rollout metric name in RolloutManager unit test (#2778)
yuki-97 Jun 11, 2026
0bffa12
fix(ppo): restore offload_after_refit semantics (#2782)
bg51717 Jun 11, 2026
34d32bf
feat: Add CISPO loss (#2531)
pengdurice Jun 11, 2026
09b63d9
fix(grpo): materialize advantages before message penalties (#2787)
macandro96 Jun 11, 2026
f45e87a
fix(distillation): use _spinup instead of removed health_check for Ne…
yfw Jun 11, 2026
37a5949
feat: add [GPU_DIAG] memory diagnostics logging during worker init (#…
arnavk-nvidia Jun 11, 2026
6ec12bb
feat: add effort levels to nemo gym (#2770)
ashors1 Jun 12, 2026
5034671
feat: cache NeMo Gym server venvs and apptainer in the release image …
yfw Jun 12, 2026
152475e
feat: add Qwen3.5 CP support for MCore path (#2312)
zpqiu Jun 12, 2026
176d4c1
chore: move GLM-5.1 from disable to release test (#2798)
yuki-97 Jun 12, 2026
231462c
fix: fix fp8_params (#2633)
ashors1 Jun 12, 2026
018a047
feat: overlap NeMo Gym init with vLLM init in distillation (#2793)
mxinO Jun 13, 2026
e8d55b9
fix: Preserve quant worker hook overrides during fp8 setup (#2803)
mxinO Jun 13, 2026
3d65039
fix: stable mooncake test with backend reuse (#2760)
ZhiyuLi-Nvidia Jun 13, 2026
911dfc3
feat: add Gemma4 support (#2224)
sharonyu-115 Jun 14, 2026
f42f796
ci: Bump Megatron-Bridge to 554c7b9 (#2820)
svcnvidia-nemo-ci Jun 15, 2026
c8a8ef0
feat: add router replay (R3) support (#2590)
zyzhou5 Jun 16, 2026
aff2af5
docs: Update README with minimax news (#2834)
snowmanwwg Jun 16, 2026
b0233e3
feat: Add advanced nsys options to the wrapper (#2461)
zswerth Jun 16, 2026
c848c7a
fix: interleave Eagle3 draft QKV into Megatron's per-group layout (#2…
isomap Jun 16, 2026
b25b375
docs: add dedicated LoRA page with backend schema comparison (#2781)
RayenTian Jun 16, 2026
45da044
feat: add MiniMax M2.7 support (#2685)
jQizhang Jun 16, 2026
a97a7ee
docs: fix dataset_name override path in grpo task mapping note (#2836)
yuki-97 Jun 16, 2026
10d4a64
feat: add grpo-smoke recipe for quick install validation (#2842)
yuki-97 Jun 16, 2026
ed7984f
feat: add AIME 2025 and 2026 response dataset variants (#2841)
yuki-97 Jun 16, 2026
c236061
docs: update router replay validation report link (#2848)
zyzhou5 Jun 16, 2026
d584a89
feat: add MTP (multi-token prediction) training support (#2801)
yfw Jun 16, 2026
e091607
fix(vllm): pass ignore_eos to vLLM SamplingParams in _build_sampling_…
achartier Jun 16, 2026
48d13ec
feat: Update Megatron Inference (#2355)
tdene Jun 17, 2026
1ff6e11
feat: support router replay (R3) without the dataplane (#2849)
zyzhou5 Jun 17, 2026
30f930d
fix: Fix crashes seen with nsys profiling on vLLM workers when TP > 1…
snivertynv Jun 17, 2026
2a62258
fix: Fix the default setting in Nemo Gym Nano v3 recipe config (#2857)
snowmanwwg Jun 17, 2026
c35a556
fix: missing validation logging in distillation (#2847)
odedovadia Jun 17, 2026
f1bd975
feat(ppo): in-model value head for Megatron PPO (#2825)
bg51717 Jun 17, 2026
69f98ef
feat: Support Nemotron-nano-v3 Omni AutoModel Path (#2362)
yuekaizhang Jun 17, 2026
bab69c2
refactor(dpo): migrate DPOConfig, DPOSaveState, DPOValMetrics to Base…
NolenLiang Jun 18, 2026
29fc948
feat: Sglang Rollout Refactor (#2267)
xiuhu17 Jun 20, 2026
6d164af
fix: fix several tests by pin triton moe backend (#2873)
yuki-97 Jun 22, 2026
34d03e1
chore: temporary skip SGLang L1 tests (#2881)
yuki-97 Jun 22, 2026
bd8a540
docs: fix broken PyTorch CUDA notes links (redirect stub breaks linkc…
terrykong Jun 22, 2026
688cfd0
feat: Topology aware placement (#2612)
youngeunkwon0405 Jun 23, 2026
8bcb414
docs: add two-stage SWE RL guide and recipes for Qwen3-30B-A3B-Thinki…
binhu-nv Jun 23, 2026
6cc50b6
fix(megatron): only build the MTP loss mask when MTP is enabled (#2876)
yfw Jun 23, 2026
6b0a1c4
fix: increase NUM_MINUTES for 5 tests hitting Slurm timeouts (#2896)
kajalj22 Jun 23, 2026
fef890e
fix: enforce_eager WAR for glm4.7-flash colocated refit (vLLM 0.20) (…
zpqiu Jun 23, 2026
737f20a
fix(logger): summarize list-valued metrics to avoid MLflow key explos…
mrm-196 Jun 23, 2026
f67e9e6
fix(megatron): honor policy.logprob_chunk_size in the training loss p…
kaloyan-inherent Jun 23, 2026
6ed959d
ci: forward SANDBOX_CONTAINER/COMMAND/ENV_VARS to ray.sub (#2832)
kajalj22 Jun 23, 2026
9c4f2e5
feat: MoE and Mamba support for QARL (#2442)
mxinO Jun 23, 2026
a3ceedf
fix: increase nightly test time 2150 -> 2300 (#2910)
yuki-97 Jun 24, 2026
2369c0a
perf: Update the dsv3 perf recipe (#2779)
youngeunkwon0405 Jun 24, 2026
33bce20
fix: KL backward in GRPO (#2506)
smahdavi4 Jun 24, 2026
96b1486
fix: Set step_finished=True in async GRPO logging (#2766)
pjin-nvidia Jun 24, 2026
67f1c39
ci: update dapo test metrics following PR 2478 (#2903)
ashors1 Jun 24, 2026
69ce07e
feat: super-v3 recipe and docs (#2829)
macandro96 Jun 24, 2026
79c38c2
feat: vllm worker env shutdown (#2887)
arnavk-nvidia Jun 24, 2026
ff46d30
fix: address deprecation warning for using a non-tuple sequence (#2032)
ananthsub Jun 24, 2026
a45aa53
perf: Fix DSV3 perf regression & boost weight loading time (dsv3 MTP)…
youngeunkwon0405 Jun 24, 2026
3c0cadb
docs: strengthen contributor review/style skill guidelines (#2926)
terrykong Jun 25, 2026
67db99e
fix(vllm): fix FP8 MoE kernel initialization for CUDA graph mode (#2789)
achartier Jun 25, 2026
3db626d
feat: Support aux loss normalization in RL SFT (#2194)
pthombre Jun 25, 2026
9e6c2d5
feat(xtoken): support TP/CP/diff-DP sharded cross-tokenizer distillat…
RayenTian Jun 25, 2026
fc9a688
fix(security): bump diffusers, upgrade rsync, remove ffmpeg (#2773)
kajalj22 Jun 25, 2026
8a8613d
ci: Set GHA environment deployment to false (#2931)
chtruong814 Jun 25, 2026
5515a04
refactor(sft): migrate SFTConfig, SFTSaveState to BaseModel (#2525)
NolenLiang Jun 25, 2026
178110f
fix: topk fp32 chunk memory (#2883)
odedovadia Jun 25, 2026
c122608
fix: fix flaky L1_Functional_Tests_Gym distillation_nemo_gym (#2933)
yuki-97 Jun 25, 2026
3cb22af
feat: support R3 async RL without TQ (#2908)
zyzhou5 Jun 25, 2026
126fbc3
feat(loss): support TIS lower bound (#2886)
macandro96 Jun 25, 2026
df6af75
fix(check_metrics): force console width to prevent CI log truncation …
thomasdhc Jun 25, 2026
d83dc4b
feat: Pass use_fused_weighted_squared_relu argument to megatron confi…
guyueh1 Jun 25, 2026
5c2322c
feat: Multi-Teacher On-Policy Distillation (MOPD) (#2780)
yfw Jun 25, 2026
d2a24cb
feat(modelopt): support real NVFP4 QAT rollout (#2592)
HollowMan6 Jun 25, 2026
1a0fdf6
feat(ppo): Megatron value-model sequence packing + context parallelis…
bg51717 Jun 26, 2026
2eabcf9
fix: fix sglang env and re-enable sglang in CI (#2898)
yuki-97 Jun 26, 2026
5dd5af7
docs(ppo): clarify backend is config-selected, drop dup block (#2945)
qiaochuz-nv Jun 26, 2026
9b331d2
test(data_plane): session-scope mooncake fixtures (#2838)
ZhiyuLi-Nvidia Jun 26, 2026
ff8f07d
chore: update grpo-smoke to grpo_smoke to match other configs (#2954)
yuki-97 Jun 26, 2026
4185306
fix(topology): exclude unknown-NVLink-domain nodes from segment selec…
terrykong Jun 26, 2026
4c0c268
feat: Support for dtensor ppo (#2837)
fujial-code Jun 26, 2026
3e3dfc7
feat: log toolcall and thinktag violation rate (#2800)
arnavk-nvidia Jun 26, 2026
ed3dd6d
fix: super launcher script - default gym env var and mount it (#2956)
macandro96 Jun 26, 2026
714d8fc
fix(distillation): offload student optimizer before teacher inference…
pthombre Jun 26, 2026
2206ae1
fix: KL backward when clamping is active (#2958)
smahdavi4 Jun 27, 2026
60337ec
chore: bump Gym workspace to 610a08ab (#2970)
kajalj22 Jun 28, 2026
f858e7b
fix: bump prometheus-fastapi-instrumentator>=8.0.2 for fastapi>=0.137…
kajalj22 Jun 28, 2026
af14254
refactor(rm): migrate RMConfig, RMSaveState, RMValMetrics to BaseMode…
NolenLiang Jun 29, 2026
80e8630
fix: avoid nvidia-cutlass-dsl install race + fix dsv3 gb200 perf test…
yuki-97 Jun 29, 2026
35d90d9
feat: add Mistral Medium 3.5 (128B) text-only DAPO support (#2875)
sharonyu-115 Jun 29, 2026
25a343b
fix: Add missing variables in mopd nightly (#2966)
yfw Jun 29, 2026
022ae4e
refactor: handle GDPO multi-reward by dict instead of positional list…
NolenLiang Jun 29, 2026
28da2e0
fix: allow router replay trace fallback composition (#2963)
zyzhou5 Jun 29, 2026
8c4bac2
ci: Add super nightly tests (#2855)
ashors1 Jun 29, 2026
8593da7
fix: reduce NUM_MINUTES to 240 in grpo-llama3.1-8b-4n8g-long test (#2…
kajalj22 Jun 29, 2026
8118cd8
fix: tune small scale super configs for h100 (#2965)
macandro96 Jun 29, 2026
6de5f44
fix(deepscaler): disable vLLM rotary_embedding custom op in DeepScale…
NolenLiang Jun 30, 2026
5a26131
fix(grpo_sync): skip refit for colocated MegatronGeneration (#2967)
ZhiyuLi-Nvidia Jun 30, 2026
1492692
fix: WAR for Perf test failing with NCCL error (#2986)
RayenTian Jun 30, 2026
30b9133
chore: make ppo default to dtensor to keep consistent with other algo…
yuki-97 Jun 30, 2026
ef5dd9a
feat(xtoken): multi-teacher support for cross-tokenizer off-policy di…
avenkateshha Jul 1, 2026
3f3eb44
docs(mopd): fix dataset override key data.val -> data.validation (#2991)
qiaochuz-nv Jul 1, 2026
af207e8
feat: R3 gym notq router replay (#2915)
zyzhou5 Jul 1, 2026
26effe2
test: disable flaky grpo-qwen3.5-35ba3b-2n8g-automodel-ep16 nightly (…
zpqiu Jul 1, 2026
195280a
feat(trtllm): add TRT-LLM generation backend
ricklamers Apr 29, 2026
021a8ea
Custom build wheel
shuyixiong Jul 2, 2026
21c15a5
build(trtllm): migrate from UV_FIND_LINKS stub wheel to PEP 517 path …
shuyixiong Jul 3, 2026
e6c93d6
fix(trtllm): correct workspace deps and scope cutlass override to vllm
shuyixiong Jul 3, 2026
0b8a437
Pin nvidia-cutlass-dsl version in vllm
shuyixiong Jul 3, 2026
45eaad6
Drop custom modelopt build
shuyixiong Jul 4, 2026
1d1b2b3
Fix eos_id issue
shuyixiong Jul 4, 2026
9c2297c
Rename trtllm workspace
shuyixiong Jul 5, 2026
ac36770
Clean code
shuyixiong Jul 5, 2026
4c466f5
allow TRT-LLM backend for async GRPO
shikicloud Jul 6, 2026
c7d069e
add trtllm agentic scripts
hchings Jun 10, 2026
61aeb77
4b smoke e2e for trtllm (agentic): prompt_token_ids + max_input_len f…
hchings Jun 15, 2026
3af32de
30B 16 nodes trtllm swe
hchings Jun 22, 2026
12e1aef
fix multiturn, fix env
hchings Jun 30, 2026
de7ed78
fix empty gen token case
hchings Jul 1, 2026
b9622b9
refactor
hchings Jul 8, 2026
c6b1fd9
rebase fix
hchings Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
File renamed without changes.
208 changes: 208 additions & 0 deletions .agents/contributor-skills/config-conventions/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
---
name: config-conventions
description: Configuration conventions for NeMo-RL. YAML is the single source of truth for defaults. Covers BaseModel/TypedDict usage, dataclass for internal classes, exemplar YAML updates, and forbidden default patterns.
when_to_use: Adding or modifying config fields; reviewing config changes; 'where do I set defaults', 'BaseModel pattern', 'TypedDict pattern', 'dataclass', 'exemplar YAML', 'forbidden default patterns', during code review of config files.
---

# Configuration Conventions

## Core Rule

**Defaults must not be scattered at call sites.** A default for a config value must live in exactly one place; readers should never have to grep through algo code to discover what value was actually used. Where that one place is depends on the schema type — see "Where Defaults Live" below — but it is *never* a `cfg.get("k", default)`, a function-parameter default, or a magic constant inside the consumer.

## Class Choice: BaseModel vs. dataclass vs. TypedDict

We are **gradually migrating** the config schema from `typing.TypedDict` (v1) to `pydantic.BaseModel` (v2). Both styles coexist in the codebase today, and the migration is tracked by `tests/unit/test_config_v2.py` against the reference configs in `tests/unit/reference_configs/` (these will be removed when the migration is complete).

Use the right tool for the job. **v2 (the new convention):**

- **`pydantic.BaseModel` — v2, user-facing config (the new default).** Any class the user touches via YAML — currently the top-level `MasterConfig` of each algorithm (`grpo`, `dpo`, `sft`, `rm`, `distillation`, `eval`) and a few shared schemas like `ClippedPGLossConfig` — is a `BaseModel` declared with `extra="allow"` so unknown keys don't break older configs:

```python
from pydantic import BaseModel

class MasterConfig(BaseModel, extra="allow"):
policy: PolicyConfig
grpo: GRPOConfig
...
```

Prefer `BaseModel` for **new** user-facing config classes, and when converting an existing `TypedDict` as part of the v1 → v2 migration.

- **`@dataclass` — v2, internal classes (not loaded from YAML).** For purely in-process data containers — worker metadata, datum specs, internal state passed between Python components — use `@dataclass` (e.g. `nemo_rl/distributed/worker_groups.py`, `nemo_rl/data/interfaces.py`, `nemo_rl/data_plane/interfaces.py`). Do **not** use `BaseModel` or `TypedDict` for these — they're not config and shouldn't pretend to be.

**v1 (legacy, being migrated away):**

- **`typing.TypedDict` — v1, legacy / not-yet-migrated user-facing config.** Most nested sub-configs (e.g. `GRPOConfig`, `RewardScalingConfig`, `AsyncGRPOConfig`) are still `TypedDict`. Continue to maintain them with the same defaults rules below until they are migrated to `BaseModel`. Use `typing.NotRequired` to mark optional attributes. **Do not add new `TypedDict`-based config classes.**

When in doubt: *is this class populated from a user-edited YAML?* If yes → `BaseModel` (or legacy `TypedDict`). If no → `@dataclass`.

### New code follows v2 directly

Any **newly added** class must follow the new convention from the start:

- New user-facing config → `pydantic.BaseModel` (with `extra="allow"` when user configs may carry extra/obsolete keys). Do **not** add new `TypedDict`-based config classes.
- New internal class → `@dataclass`.

`TypedDict` edits should only happen on existing, not-yet-migrated classes — either to extend them or as part of converting them to `BaseModel`.

## Access Config Directly

For required attributes, read the value and assume it is present — don't introduce a fallback at the call site.

- **v2 (BaseModel):** attribute access — `master_config.policy.precision`. The BaseModel class itself supplies any default for the field; the call site reads it as-is.
- **v1 (TypedDict, omegaconf-loaded dict):** key access — `policy_cfg["precision"]`. The exemplar YAML supplies the default; the call site reads it as-is.

In both cases, missing required values should fail loudly at load/access time rather than being silently papered over.

## Express Optionality

- **TypedDict:** use `typing.NotRequired[...]` to mark optional attributes.
- **BaseModel:** declare the field as `Optional[...] = None` (or `T | None = None`).

Optional attributes may be absent/`None`; code may check for their presence. Never substitute a non-`None` default at the access site (see "Accessing NotRequired Fields" below).

## Where Defaults Live

The location of defaults depends on the schema type:

- **v2 — `pydantic.BaseModel` (user config):** the default lives **on the BaseModel field** as a Python value. The BaseModel class is the centralized source of truth for user-facing defaults — exemplar YAML serves as documentation / override examples, not as the canonical default store. Example (from `ClippedPGLossConfig`):

```python
class ClippedPGLossConfig(BaseModel, extra="allow"):
disable_ppo_ratio: bool = False
ratio_clip_min: float = 0.2
ratio_clip_c: Optional[float] = None # None to disable
reference_policy_kl_penalty: float = 0.01
```

- **v1 — `typing.TypedDict` (legacy user config, pre-migration):** the default lives **only in the exemplar YAML** under `examples/configs/*.yaml`. There is no class-level default — Python code must read the value from the loaded dict without supplying a fallback.

- **`@dataclass` (internal class, not loaded from YAML):** usually **no defaults at all**. Fields are populated by the producing code path; a stray `= None` / `field(default=...)` is a smell unless there's a clear reason (e.g., forward-compat for an optional field added mid-migration).

In all three cases:

- Exemplar configs under `examples/configs/*.yaml` include documented defaults. For v1 TypedDict configs they *are* the source of truth; for v2 BaseModel configs they serve as documentation and reasonable starting points, with the BaseModel class itself being authoritative.
- Recipe YAMLs under `examples/configs/recipes/**/*.yaml` are runnable snapshots and may omit documentation.
- Defaults at **call sites** (`cfg.get("k", default)`, function-parameter defaults, magic constants) are never allowed — see "Forbidden Patterns" below.

## Documenting New Config Keys

When adding a new config key to a `BaseModel` or `TypedDict` subclass, document:
- The key's purpose
- Valid values/types
- Recommended default (if applicable)

Reflect the default in the exemplar YAMLs under `examples/configs/*.yaml`. If the change affects an exemplar covered by `tests/unit/test_config_v2.py`, also update the matching `tests/unit/reference_configs/*.yaml` so the v1→v2 migration check stays green.

## Recipe YAMLs Must Set `defaults`

Recipe YAMLs under `examples/configs/recipes/**/*.yaml` must set `defaults: <exemplar>.yaml` to inherit from one of the exemplar configs in `examples/configs/*.yaml`. This keeps recipes minimal — they only override what differs from the exemplar.

If a recipe YAML does not have a `defaults` key, run:

```bash
uv run ./tools/config_cli.py minimize <recipe.yaml>
```

This will minimize the config and assign the appropriate `defaults` key.

## Accessing NotRequired Fields

When accessing a `NotRequired` field, use an `in` check or `.get(key)` / `.get(key, None)`. Never provide a non-`None` default — that hides behavior and defeats the purpose of making the field optional.

**Do:**
```python
# .get() with None (not a hidden default)
stop_properly_penalty_coef = cfg.get("stop_properly_penalty_coef", None)

# Truthiness check for optional booleans
if master_config.grpo.get("skip_reference_policy_logprobs_calculation"):
...

# Nested NotRequired: check presence at each level explicitly
if "megatron_cfg" in policy_config and policy_config["megatron_cfg"]["enabled"]:
...
```

**Don't:**
```python
# Hidden boolean default — should come from YAML
disable_ppo_ratio = cfg.get("disable_ppo_ratio", False)

# Hidden non-trivial default — caller has no idea True is the fallback
normalize_rewards = grpo_config.get("normalize_rewards", True)

# Chained .get() with hidden defaults at each level
megatron_enable = config.get("megatron_cfg", {}).get("enabled", False)
```

If a `NotRequired` field is absent, the code should handle that explicitly — not paper over it with a magic default.

## Forbidden Patterns

These are forbidden in **both v1 and v2** — they all hide defaults at the call site instead of on the schema.

**Don't (any schema type):**
```python
# Hidden default at the call site — should be centralized on the BaseModel
# field (v2) or in the exemplar YAML (v1)
precision = policy_cfg.get("precision", "bfloat16")

# Function parameter defaulting a config value
def build_policy(policy_cfg, precision: str = "bfloat16"):
...
```

**Do — v2 (BaseModel):**
```python
class PolicyConfig(BaseModel, extra="allow"):
# The BaseModel field is the centralized source of truth for the default
precision: str = "bfloat16"

# Call site reads the attribute directly
precision = master_config.policy.precision
```

**Do — v1 (TypedDict, still dict-shaped after omegaconf load):**
```python
# Required attribute: expect it from the (exemplar or user) YAML, no fallback
precision: str = policy_cfg["precision"]

# Optional (NotRequired) attribute: check for presence, never invent a default
if "milestones" in scheduler_cfg:
configure_milestones(scheduler_cfg["milestones"])
```

## Avoid `dict[str, Any]` for Known-Field Config

If a config block has a known set of fields, model it as a `BaseModel` (or, pre-migration, a `TypedDict`) —
do not type it as `dict[str, Any]` and read keys with `.get(k, default)`. A bare `dict[str, Any]` both loses
type-safety and pushes per-key defaults to the call site (the Forbidden Pattern above).

If the block must also pass arbitrary keys through to another system, use `BaseModel(extra="allow")`: the known
fields get types + centralized defaults, and unknown keys still come through (`model_extra`).

**Don't:**
```python
class NonColocatedTeachersConfig(BaseModel, extra="allow"):
default_teacher_cfg: dict[str, Any] = Field(default_factory=dict) # known fields hidden behind Any

# ...so defaults end up scattered at the call site:
tp = cfg.get("tensor_model_parallel_size", 1)
precision = cfg.get("precision", "bf16")
```

**Do:**
```python
class TeacherResourceConfig(BaseModel, extra="allow"): # extra="allow" keeps the passthrough escape hatch
tensor_model_parallel_size: int = 1
precision: str = "bf16"
micro_batch_size: int = 4
# ...

class NonColocatedTeachersConfig(BaseModel, extra="allow"):
default_teacher_cfg: TeacherResourceConfig = Field(default_factory=TeacherResourceConfig)
```

See also: @docs/design-docs/design-and-philosophy.md (Configuration Schema: BaseModel, dataclass, and TypedDict section).
File renamed without changes.
43 changes: 43 additions & 0 deletions .agents/contributor-skills/error-handling/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
name: error-handling
description: Error handling guidelines for NeMo-RL. Covers exception specificity, minimal try bodies, and else blocks.
when_to_use: Writing or reviewing exception handling; 'try-except', 'catch all exceptions', 'bare except', 'how to handle errors', during code review.
---

# Error Handling

## Use Specific Exceptions

When using try-except blocks, limit the except to the smallest set of errors possible.

**Don't:**
```python
try:
open(path, "r").read()
except:
print("Failed to open file")
```

**Do:**
```python
try:
open(path, "r").read()
except FileNotFoundError:
print("Failed to open file")
```

## Fail Loud, Not Silent

When adding a config option or branch, ask: what does the worst plausible misconfiguration do? If it silently
produces *wrong results* rather than an error, add a setup-time `assert`/`raise` so it fails loudly at startup
instead of corrupting a run.

**Examples of silent-wrong worth guarding:**
- An advantage estimator that needs a real `prev_logprobs` while a loss flag zeroes it (advantage degrades to
garbage with no error).
- An agent routed to a teacher alias that has no worker group (cryptic `KeyError` mid-run instead of a
setup-time check).
- A backend/quantization setting silently ignored for a sub-component.

Prefer failing at `setup()` time over a deep-in-the-loop crash; prefer a crash over silent garbage. If you
truly can't validate, surface a logged warning rather than nothing.
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,22 @@ def make_complex(*args):
def make_complex(x, y):
return {'x': x, 'y': y}
```

## Type Annotations

Annotate new functions and methods — both parameters and return type. When you add a parameter to an
existing signature, type it, and **match the type already used at the call site** (don't leave a new arg
untyped while the caller already declares it, e.g. `def __init__(self, teacher_worker_groups=None)` when the
caller passes `teacher_worker_groups: Optional[dict[str, Any]]`).

When you add a new module under a type-checked area, **add it to `pyrefly.toml` `project-includes`**.
`pyrefly` checks an explicit allow-list of files, so a new file that isn't listed silently escapes
type-checking and its annotations are never verified.

## Imports

Put imports at module top. Defer an `import` into a function body ONLY to break a circular import or to avoid
loading a heavy/optional dependency in a path that shouldn't need it — and when you do, add a one-line comment
saying which. An in-function `import` with no such reason should move to the top. In particular, deferring
stdlib (`concurrent.futures`, `collections`, …) or a module that is *already* imported at module top buys
nothing — hoist it.
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ After all subagents return: merge results and deduplicate (same file+line+issue
- Analyze the diff against all guideline skills
- For each changed file, read surrounding context locally using `Read` and `Grep` to understand the change in context
- Cross-reference existing review comments (PR mode only, from step 4) to avoid duplicating points already raised by other reviewers
- Compare any new component to its nearest existing analog in the repo (a new worker group ↔ `lm_policy.py`, a new advantage estimator ↔ the existing estimators, a new config block ↔ `MasterConfig`) and flag missing affordances: backend dispatch, override hooks (e.g. `resolve_policy_worker_cls`), guards/validation, type annotations, return-shape consistency. "It works for the shipped recipe" is not enough if it silently diverges from the sibling's contract
- Also apply any patterns from review memory files
- Categorize findings:
- **[BUG]** — Logic errors, null refs, race conditions, syntax errors
Expand Down
File renamed without changes.
1 change: 0 additions & 1 deletion .agents/skills

This file was deleted.

1 change: 0 additions & 1 deletion .claude/skills

This file was deleted.

1 change: 1 addition & 0 deletions .claude/skills/build-and-dependency
1 change: 1 addition & 0 deletions .claude/skills/cicd
1 change: 1 addition & 0 deletions .claude/skills/config-conventions
1 change: 1 addition & 0 deletions .claude/skills/contributing
1 change: 1 addition & 0 deletions .claude/skills/copyright
1 change: 1 addition & 0 deletions .claude/skills/error-handling
1 change: 1 addition & 0 deletions .claude/skills/launch-nemo-rl
1 change: 1 addition & 0 deletions .claude/skills/linting-and-formatting
1 change: 1 addition & 0 deletions .claude/skills/nemo-rl-auto-research
1 change: 1 addition & 0 deletions .claude/skills/nemo-rl-brev-etiquette
1 change: 1 addition & 0 deletions .claude/skills/nemo-rl-docs
1 change: 1 addition & 0 deletions .claude/skills/nemo-rl-session-memory
1 change: 1 addition & 0 deletions .claude/skills/review-pr
1 change: 1 addition & 0 deletions .claude/skills/testing
19 changes: 17 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,29 @@ ckpts/
coverage.json
.coverage*
test_assets/
.nrl_remote_map.json
.nrl_remote_state.json
# Test biproducts
tests/functional/*/

# Gym
/3rdparty/Gym-workspace/Gym/cache/uv/
/3rdparty/Gym-workspace/Gym/res*/*/.venv/
/3rdparty/Gym-workspace/Gym/res*/*/.venv/
/3rdparty/Gym-workspace/Gym/.venv/

# Cache
uv_cache/
hf_home/
hf_datasets_cache/
*logs/
datasets/
/datasets/
wandb/
checkpoints/
results/
code_snapshots/
code_snapshots*/
.cache/

# Runtime env
*runtime_env.yaml
!default_runtime_env.yaml
1 change: 0 additions & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
/docker/ @nvidia-nemo/rl_reviewers_infra
/docs/ @nvidia-nemo/rl_reviewers_doc
/3rdparty/Automodel-workspace/ @nvidia-nemo/rl_reviewers_automodel
/3rdparty/Megatron-LM-workspace/ @nvidia-nemo/rl_reviewers_mcore
/3rdparty/Megatron-Bridge-workspace/ @nvidia-nemo/rl_reviewers_mcore
/ray.sub @nvidia-nemo/rl_reviewers_infra

Expand Down
Loading
Loading