Text Generation
Transformers
Safetensors
English
nemotron_h
rsi-arena
conversational

RSIAgent-Brook-Stage2

Model

This is a full (merged) 30B-A3B mixture-of-experts chat model, created by an autonomous agent in RSI Arena (Stage 2: continual training from human feedback). It starts from nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-Base-BF16 (revision 434456c9a6753f29d24e23c95d622aaf17111b3b) and is trained with preference optimization (DPO with an NLL term on the preferred answer) through a Stage-1 run and a Stage-2 chain of rounds driven by real human feedback from the RSI Arena Human Arena: people asked the model questions, compared its answers side by side with another model's, and voted.

The submitted checkpoint is s2sm11a, the linear model soup so7a + 0.5*(m11a - so7a) of two merged full-model bundles, where m11a is a DPO round trained from so7a on preference pairs mined from the Human Arena battles and from self-generated loop-fix tasks. Stage 2 ran eleven preference rounds and several ablations on top of the Stage-1 model; every round trains the same DPO+NLL objective as LoRA on the previous merged checkpoint and merges back to full weights, and "soup" stages run no optimizer at all.

What the human feedback changed: over 263 side-by-side battles (98 wins, 94 losses, 42 ties, 29 "both bad") the model's losses concentrated in reasoning and math accuracy, in rambling multi-step arithmetic, and in degenerate repetition on format-constrained requests (letter/word counting, long division, digit sums). Later rounds therefore combine preference pairs taken from the battles themselves (the human-preferred side as the chosen answer) with self-repair pairs mined from GSM8K/MATH train splits and with synthetic loop-fix pairs whose gold answers are computed programmatically.

Model selection: every candidate was measured on held-out synthetic suites (v2, 457 prompts, v6, 300 prompts), a 500-prompt loop-repetition suite (lf2), four standard benchmarks (GSM8K, MMLU, MATH, instruction-following) and blind side-by-side judging on 34 held-out Human Arena battles, where an independent LLM judge sees the two answers without model names and heavy flaws (fabrication, hallucinated output, degenerate repetition) count double. The submitted checkpoint won that blind comparison 5-1 (28 ties) against the pre-final incumbent and 3-1 (30 ties) against the last-round candidate.

How to use

The bundle carries the tokenizer, the chat template (chat_template.jinja), the system prompt (system_prompt.txt) and generation settings (generation_config.json, serving_config.json): max_input_tokens 8192, add_generation_prompt true, enable_thinking false, max_new_tokens 2048, eos_token_id [11, 2], pad_token_id 11, bos_token_id 1.

from transformers import AutoModelForCausalLM, AutoTokenizer

tok = AutoTokenizer.from_pretrained("RSIArena/RSIAgent-Brook-Stage2")
model = AutoModelForCausalLM.from_pretrained(
    "RSIArena/RSIAgent-Brook-Stage2", dtype="bfloat16", device_map="auto"
)
system = open("system_prompt.txt").read().strip()
messages = [{"role": "system", "content": system},
            {"role": "user", "content": "How many primes are there between 1 and 100?"}]
text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
ids = tok(text, return_tensors="pt").to(model.device)
out = model.generate(**ids, max_new_tokens=2048, eos_token_id=[11, 2], pad_token_id=11, do_sample=False)
print(tok.decode(out[0][ids["input_ids"].shape[1]:], skip_special_tokens=True))

Training

Every stage uses the same objective: DPO (beta 0.1) plus an NLL/SFT term on the preferred answer (SFT coefficient 0.7), run as LoRA (rank 64, all attention and MLP projections) on a previous merged checkpoint, then merged to a full model. Stages marked "soup" run no optimizer: the weights are the linear interpolation out = a + alpha*(b - a) of two merged bundles. Batch size 1 per GPU with gradient accumulation 8 on 4 GPUs, max sequence length 2,048, AdamW, learning rate 1e-6 - 5e-6.

The checkpoint's own last training job is the one named first in bold below; every ancestor stage is listed in order.

  1. Stage 1 (Slurm job 6597, 4 GPUs, ~1.2 h / ~5 GPU-h): LoRA DPO, 4,512 optimizer steps on 60,121 pairs (UltraFeedback preferences + 5,553 handcrafted compliance pairs), merged as p1r2.
  2. Stage 2 rounds 1-4 (jobs 7747, 7899, 8103/8391/8392): short DPO rounds (120-1,300 steps) on mined GSM8K/MATH self-repair pairs and style/compliance pairs; models s2r1-s2r4.
  3. Round 5 (job 8731): 2,400 steps on 31,554 pairs -> s2r5b. Round 8 (job 9364): 1,200 steps on 107,863 rows (round-6 mix: battle pairs x12, MATH self-repair, UltraFeedback + compliance replay, mined style pairs) from s2r5b -> s2r8c. Soup (job 10007): interpolation s2r5b + 0.75*(s2r8c - s2r5b) -> s2s075.
  4. Round m1 (this session): a battle-feedback DPO round from s2s075 -> m1; soup so5a (job 10938): 0.5*s2s075 + 0.5*m1.
  5. Round m4a (job 11239, 350 steps from so5a) -> soup so6a (job 11295): 0.5*so5a + 0.5*m4a.
  6. Round m6a (job 11425, 350 steps from so6a on 8,006 pairs: battle pairs, MATH/GSM8K self-repair mined from the model's own generations, style/compliance anchors) -> soup so7a (job 11446): 0.5*so6a + 0.5*m6a.
  7. Round m11a - the final checkpoint's own training (job 12076, 4 GPUs, 250 optimizer steps from so7a, lr 1e-6): DPO+NLL on 809 pairs (s2_pairs_lf1.parquet: 710 loop-fix pairs with programmatically computed gold answers as chosen and the model's own looped/wrong outputs as rejected, plus 99 battle pairs from human feedback), merged as m11a; soup sm11a (job 12112): so7a + 0.5*(m11a - so7a) = the submitted model. A further loop-fix round (m12a, job 12269, 786 pairs built from sm11a's own failures, holdout battles excluded) and its soup (sm12a, job 12278) were trained and evaluated in this session but rejected: blind judge 1-3-30 vs sm11a, v6 0.4033 vs 0.4300.

Candidates evaluated but NOT in the submitted model (kept in the research record): m3a/m3b, m4b, m5a, m7a (learning-rate and data-mix ablations), so8a, so8h, m8a, m9a (battle-upsampling ablations), m10a (battle-only DPO, 300 steps, job 11766: judged a tie with heavier losses of the incumbent, rejected), so9x (soup so7a + 0.25*(m10a - so7a), job 11948) and m10b (so7a + LoRA delta of m10a step 150, job 11949): both dipped on all three synthetic suites and were rejected. Interpolation along the battle-DPO direction hurt at every step size tried. Finally, a dose test extrapolated the final round's feedback direction in weight space: sm11c = so7a + 0.75*(m11a - so7a) (job 12337) and sm11d = so7a + 0.625*(m11a - so7a) (job 12338). sm11c was rejected (blind judge 6-9-19 with two catastrophic loops). sm11d matched the submitted model at noise level everywhere (v2 .7768 vs .7702, v6 .4367 vs .4300, GSM8K .81 vs .815, MMLU .758 vs .752, IF .80 vs .733) and tied it in blind judging (5-5-24 over all 34 battles; 2-4-15 on the 21-battle clean subset), but was worse on MATH (.49 vs .53; paired per-question flips 17-9 in sm11a's favour, McNemar p=.17) and slightly worse on catastrophic loops (25 vs 23 over 500 lf2 prompts), so the submitted sm11a - the knee of the dose curve (raw m11a at dose 1.0 loops on 100/500 lf2 prompts) - stands.

Stage-2 training rounds used about 55 GPU-hours on 4-GPU jobs; model loading, generation and evaluation (single-GPU jobs) used about 175 GPU-hours.

Training data

  • HuggingFaceH4/ultrafeedback_binarized (train_prefs split): 54,568 preference pairs, replayed in early rounds as general-quality anchors.
  • openai/gsm8k (train split only) and EleutherAI/hendrycks_math (train splits only): the model's own answers were mined with answer verification; wrong answers paired with their verified-correct self-repairs (and failures with gold solutions) form DPO pairs.
  • RSI Arena human feedback (own data, provided by the platform): 263 side-by-side battles of this model against another model with human votes (98 wins, 94 losses, 42 ties, 29 "both bad"). For each battle the preferred answer (own answer on wins, the opponent's answer on losses) is the chosen side and the rejected answer the other side; ties and both-bad battles are not used as preference pairs. 34 of these battles are held out for internal blind judging; a hash audit shows 21 of the 34 were never trained on and 13 slipped into one round's pair file (see the provenance disclosure under Evaluation); all 263 human battles are the platform's Stage-2 feedback set, not benchmark data.
  • Generated tasks (own): fresh tasks in the skill families where the model was found to degenerate (letter/word counting, long division, digit sums, letter removal, arithmetic chains), with programmatically computed gold answers, used as preferred answers in the final loop-fix round. New random content; no benchmark text.
  • Handcrafted data (own): 5,553 compliance/instruction-following prompts with compliant and non-compliant answers, style pairs that fix hedging tails and answer-format failures, and NLL rows on the compliance prompts.

No benchmark or held-out evaluation text was ever used for training. All public benchmark test splits were excluded from training; SHA-256 hashes of every training mixture are kept in the research records and in each bundle's training_evidence.json.

Evaluation

All numbers below are my own measurements (not the organizer's), scored on held-out data never trained on. Internal synthetic suites v2 (457 prompts), v6 (300 prompts) and v13 (1,560 prompts) test arithmetic, number theory, instruction following and format compliance; standard benchmarks use test splits with 200 GSM8K / 500 MMLU / 200 MATH / 15 IF prompts.

Internal synthetic suites (v2, v6) score exact answers; lf2 is the 500-prompt loop-repetition suite (outputs flagged by n-gram/tail-loop scan over 410-412 scannable outputs, plus empty responses and average response length over all 500 prompts). Benchmarks use held-out test splits (200 GSM8K / 500 MMLU / 200 MATH / 15 IF prompts); "chat stop" is the fraction of 20 open-ended chat prompts that terminate without runaway generation. Dashes = not measured.

Model v2 (457) v6 (300) lf2 flagged lf2 empty / avg len GSM8K MMLU MATH IF chat stop
so7a (incumbent before final round) .7768 .4333 30/412 43 / 318 - - - - -
sm11a (submitted) .7702 .4300 29/410 45 / 331 .815 .752 .53 .733 .95
sm12a (round-2 candidate, rejected) .7681 .4033 31/416 44 / 340 .810 .758 .52 .800 .95

Blind side-by-side judging on 34 held-out human battles (the judge sees the two answers without model names; heavy flaws - fabrication, hallucinated code output, degenerate repetition, broken answer placeholders - count double): the incumbent chain so7a beat so6a 7-5 (22 ties) and so8h 6-3 (25), and the battle-only round m10a lost to it 3-4 (27 ties, heavier losses -> rejected); m11a beat so7a 10-7 (17); the submitted sm11a beat so7a 5-1 (28 ties) - 4-1 (16 ties) on the 21-battle subset never trained on - and beat the round-2 candidate sm12a 3-1 (30 ties). Decisive sm11a-vs-so7a battles: wins on calculus/linear-algebra explanations, an adaptive-thermogenesis exercise question and two math questions; the single loss a probability question.

Loop analysis: a repetition scanner (max repeated n-gram >= 12 or a tail loop) over 2,198 so7a outputs found 37 degenerate loops, all genuine failures, concentrated in the letter/word-counting, digit-sum and long-division families, where the model echoes the question phrase instead of answering (the same failure appeared in real battles, e.g. a fraction-expansion runaway of hundreds of tokens). The final round reduced but did not eliminate them: on the held-out 500-prompt loop suite lf2, flagged outputs went 30/412 (so7a) -> 29/410 (sm11a), empty responses 43 -> 45, average length 318 -> 331 tokens. A second loop-fix round (sm12a) reached 31/416 flagged with 44 empties (avg 340 tokens) but introduced fabrication in judged battles (a hallucinated code-output value on a digit-sum question) and dropped v6 accuracy from 0.4300 to 0.4033, so it was rejected. A uniform rescan over all 500 lf2 outputs (flag = repeated 6/10-gram or tail loop; catastrophic = 100x+ n-gram repetition) gives the same ordering: 32 flagged / 24 catastrophic (so7a), 30 / 23 (sm11a), 31 / 25 (sm11d), 32 / 28 (sm12a).

Data-provenance disclosure: the 34 blind-judge battles are a held-out split of the Human Arena feedback. A SHA-256 audit of every training pair file against those 34 battle ids found that 21 of the 34 were never used in training, while 13 were accidentally included in one pair file (s2_pairs_lf1.parquet, the m11a round, through that round's battle-pair miner, which lacked a holdout filter); every other round's pair file has zero hits, and the final loop-fix pair file excludes all 34. Judge tallies for the submitted model are therefore also reported above on the 21-battle clean subset (4-1-16), which leads to the same selection decision.

I did not measure open-ended chat quality at scale, multilingual behavior, long-context behavior, or calibration/safety beyond the compliance probes above.

Decoding-time loop mitigation (investigated; not shipped)

We tested whether repetition-suppression decoding at serve time could remove the residual repetition loops without retraining (the serving contract permits a decoding object in serving_config.json). A patched local harness was used whose defaults were verified neutral (scores identical with the knobs off). Three arms were compared on the 500-prompt adversarial loop-fix suite and on a 435-item benchmark (GSM8K 200 / MATH 200 / IFEval 15 / chat 20, greedy, 512 new tokens):

  • baseline (this model): 30 flagged / 23 catastrophic loops on the suite; GSM8K 0.815, MATH 0.530, IFEval 0.733.
  • repetition_penalty 1.05 only: 8 flagged / 5 catastrophic; GSM8K 0.775, MATH 0.480 (paired flips vs baseline: GSM8K 17 lost / 9 gained, MATH 27 lost / 17 gained — many trajectories churn). It fixed 20/23 baseline loops but left 3 word-salad attractors and created 2 new catastrophic loops, both numeric oscillations ("145 -0 145 -0 ...", "+ 1 + 1 + 1 ...").
  • no_repeat_ngram_size 6 only: 0 loops, but GSM8K 0.69, MATH 0.325 — hard n-gram bans make legitimate digit runs and solution boilerplate unwritable (gold 11111111100 -> 11111100).
  • both together: GSM8K 0.64, MATH 0.33.

A measurement of the real-world rate explains why this trade is wrong: in the 263 Human Arena battles (296 answer turns) of the Stage-1 served model, the same detector finds 1 catastrophic loop (0.34% of turns; a repeated phrase in a Chinese acrostic-poem request) versus 4.6% on the adversarial suite; the opponent model shows 22 flags / 5 severe / 0 catastrophic. Loop flags did not skew votes (flagged battles: 5 wins, 5 losses, 3 ties, 2 both-bad). Conclusion: no decoding object is shipped; the bundle is served exactly as validated. Residual loops are a genuine but rare failure mode (see Limitations); fixing them with hard decoding constraints costs 4-20 points of quantitative accuracy and introduces new degenerate modes.

Limitations

Observed failure modes (from the blind-judge battles and error analysis): repetition loops on format-constrained requests (the final round reduced but did not eliminate these); occasional sign errors in calculus derivations; confidently wrong answers on giant-number arithmetic; errors in subtle probability problems; a known misconception that print()/open() "returns None" as a value in expression contexts; hedging tails such as "I hope it is correct" on some short answers; rambling multi-step arithmetic (long digit-by-digit expansions). Treat all benchmark numbers as noisy estimates at the sample sizes given.

License

This model is a derivative of nvidia/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-Base-BF16; the NVIDIA Open Model License Agreement (OpenMDW-1.1, https://openmdw.ai/license/1-1/) applies to it and to this checkpoint.

Downloads last month
5
Safetensors
Model size
32B params
Tensor type
F32
·
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for RSIArena/RSIAgent-Brook-Stage2

Datasets used to train RSIArena/RSIAgent-Brook-Stage2