Checkpoints are revisions
Every GRPO step is a git revision. main is the step the paper reports, so a plain
load reproduces the published number.
Table with columns: Revision| Revision | |
|---|
step10 | |
step20 | |
step30 | the checkpoint reported in the paper (= main) |
step40 | |
step50 | |
step60 | |
step70 | |
step80 | |
step90 | |
step100 | |
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-8B-Base", torch_dtype="bfloat16")
tok = AutoTokenizer.from_pretrained("Qwen/Qwen3-8B-Base")
model = PeftModel.from_pretrained(base, "MichiganNLP/hacking-fairness-benchmarks-qwen3-8b-base-z1")
model = PeftModel.from_pretrained(base, "MichiganNLP/hacking-fairness-benchmarks-qwen3-8b-base-z1", revision="step100")
The model is prompted to answer in <think>...</think><answer>A</answer> format.
LoRA config: rank 32, alpha 32, on q,k,v,o,gate,up,down_proj.
Trained against base revision 49e3418fbbbca6ecbdf9608b4d22e5a407081db4.
Citation
@inproceedings{deng2026one,
title = {One Example Is Enough to Pass Fairness Benchmarks:
Rethinking Fairness Evaluation for Aligned {LLM}s},
author = {Deng, Naihao and Arif, Samee and Chang, Shuaichen and
Chen, Yulong and Mihalcea, Rada},
booktitle = {Proceedings of the 2026 Conference on Empirical Methods in
Natural Language Processing},
year = {2026}
}