CoolFace
Modelpublic

VityaVitalich/1pp-1.7b-asst-sft-grpo-gsm8k

sourceHugging Faceupdated 13d agoView on Hugging Face
0likes129downloads
Model Card

1PP 1.7B (assistant-conditioned) — GRPO on GSM8K

GRPO fine-tune of `Raghav-Singhal/1pp-1.7b-asst-sft` on GSM8K, 100 policy steps. Trained with verl 0.9.0.dev0 on 4x GH200.

One of three siblings that differ only in the pre-training persona condition of the starting checkpoint — asst, ua, raw — trained with an identical recipe so the conditions can be compared after RL.

Results

GSM8K test, 16 samples per question, temperature 1.0.

pass@1pass@16
before RL (step 0)0.01100.0979
after RL (step 100)0.03930.2008

Full curve:

steppass@1pass@16entropyresp. chars
100.02030.15731.281399
200.02250.17051.123336
300.03150.22680.769287
400.02860.17220.559249
500.03760.21550.451231
600.03320.20970.388225
700.03120.19580.358213
800.04220.21100.339206
900.03520.19570.319212
1000.03930.20080.293223

Caveat on comparing the three siblings

A configuration-identical repeat of the asst arm reached pass@1 0.0552 at step 100 where this run reached 0.0393. That seed-to-seed gap is larger than the spread across the three conditions (0.0369-0.0413), so the ranking between asst, ua and raw here is not evidence of a real difference. Treat each model on its own absolute improvement, not against its siblings, until multiple seeds exist.

Checkpoints

main is step 100. Every earlier checkpoint is a branch:

python
from transformers import AutoModelForCausalLM, AutoTokenizer

repo = "VityaVitalich/1pp-1.7b-asst-sft-grpo-gsm8k"
model = AutoModelForCausalLM.from_pretrained(repo)                      # step 100
model = AutoModelForCausalLM.from_pretrained(repo, revision="step-50")  # step 50
tok   = AutoTokenizer.from_pretrained(repo)

Branches: step-10, step-20, step-30, step-40, step-50, step-60, step-70, step-80, step-90, and main (= step 100).

Training

algorithmGRPO (group-relative advantages, no critic), KL penalty retained
group size (rollout.n)16
prompts per step256
mini-batch128 prompts
ppo_epochs3
learning rate1e-6, constant
max prompt / response256 / 512 tokens
rewardverl's stock GSM8K scorer, unmodified
precisionbf16
hardware4x GH200, ~50 s/step

ppo_epochs=3 was chosen by sweep: 1, 2, 4 and 5 all validate worse at matched steps, and 4 and 5 reach a higher training reward while validating lower — the signature of over-reusing a fixed batch of rollouts.

Notes

Weights are bf16. verl exports FSDP's fp32 master copy and declares bfloat16 in config.json; the cast here makes the file agree with the config and is lossless for inference. The tokenizer files come from the base repo unchanged — RL does not touch the tokenizer, and verl's export omits four of them.