Go from zero to your first mechreward-driven GRPO training run in under 10 minutes.
pip install mechreward # Optional extras pip install "mechreward[sae]" # sae_lens integration pip install "mechreward[trl]" # GRPOTrainer hook pip install "mechreward[all]"
Every pack in the catalog has passed Stage Gate 1 (ρ ≥ 0.30 on held-out data). You can load by short name.
import mechreward as mr
sae = mr.load_sae(release="caiovicentino1/Qwen3.5-4B-SAE-L18-topk", sae_id="layer_18")
pack = mr.load_pack("qwen3.5-4b/reasoning_pack")
# 10 helpful + 10 harmful features, validated at Spearman ρ=0.540 on 100Q held-out GSM8Kreward = mr.FeatureReward.from_pack(
pack,
sae=sae,
aggregation="per_token", # per-token dense, matches G3 recipe
)
composite = mr.CompositeReward(
rewards=[
reward,
mr.OutcomeReward(verifier=mr.verifiers.gsm8k_exact_match),
],
weights=[0.1, 1.0], # λ_mech=0.1, validated at G2
)from trl import GRPOConfig, GRPOTrainer
trainer = GRPOTrainer(
model="Qwen/Qwen3.5-4B",
args=GRPOConfig(
output_dir="./out",
num_generations=4,
learning_rate=3e-6, # CRITICAL: Qwen3.5-4B G3 showed 1e-6 stalls
),
train_dataset=gsm8k_train,
reward_funcs=composite,
)
trainer.train()Before running a full G3 training, always verify the signal on your setup with G1 and G2. Skipping these caused us 15h of wasted compute on Qwen3.5-4B before we fixed the LR.
AutoModelForImageTextToText, not CausalLM. Freeze the vision tower.model.disable_adapter() context manager replaces a separate ref_model (saves 8 GB).log_softmax halves logits memory — needed for vocab=248 k on 4 B models.