VityaVitalich/1pp-1.7b-asst-sft-grpo-gsm8k
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.
Full curve:
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:
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
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.
