Training
- LoRA rank 64, alpha 128, dropout 0.05, target modules down_proj, gate_proj, k_proj, o_proj, q_proj, up_proj, v_proj (174,587,904 trainable parameters); vision tower frozen; bfloat16.
- Seed 2, learning rate 5e-05, micro-batch 2 x grad_accum 4, 1 epoch, 2,500 optimiser steps over 20,000 task records; pair records 8,353, pair micro-batches 5,000, lambda_pair 1.0, pair_sees_image True.
- Initialised from
a2_support_s0 (RESEARCH-EMPRM/emprm-v2-a2_support_s0). Task-data sha256 46e0cb91457a…, pair-data runs/v2/data/stageB_pairs_rung5_noev/pairs.jsonl.
- Wall time 5.5 h on one NVIDIA A100-PCIE-40GB; training-pair accuracy mean 0.8528, final 0.97.
Pre-registered gates and reads (development halves; test halves unread)
- Held-out relational FlipAcc (deployed): 0.0000 [0.0000, 0.0000] — gate lost, forced by the architecture; 0.0037 with the chart shown.
- Forced-evidence acceptance at 0.5: true 0.4900 / false 0.005 deployed; 0.925 / 0.005 with the chart shown.
- Chart-disjoint pair gain over v1: +0.0891 [0.0440, 0.1336] deployed; +0.1274 with the chart shown.
- Controlled pools (dev, Best-of-5, InternVL / Qwen): 0.3305 / 0.4670 (paired against the final arm: -0.5064 [-0.5405, -0.4723] / -0.3806 [-0.4147, -0.3486]).
- External dev halves (deployed): VisualProcessBench 0.4350, VLRMBench 0.3959, VL-RewardBench 0.5413, Multimodal RewardBench 0.5051.
Status
Not a deployment candidate (chart gates lost). Kept as the seed-2 replicate of the "E removed" ablation.
Where the artifacts are
- Result files, per-example dumps, config and prompts: dataset
RESEARCH-EMPRM/emprm-sync-20260910 → results/**/runs/v2/train/stageB_rung5_noev_s2/, results/**/runs/v2/e2/stageB_rung5_noev_s2__*.json, configs/ablations/stageB_rung5_noev_s2.yaml, EXPERIMENT_REGISTRY.csv (rows tagged with this adapter), CURRENT.md and WRITER_SYNC_BUNDLE.md (what the deployed scorer computes; which arm is which).
- The frozen 2026-09-09 tree backup
RESEARCH-EMPRM/emprm-v2 predates this arm and does not contain it.
Load
from transformers import AutoModelForImageTextToText, AutoProcessor
from peft import PeftModel
base = AutoModelForImageTextToText.from_pretrained("Qwen/Qwen3-VL-8B-Instruct", dtype="bfloat16", device_map="cuda")
model = PeftModel.from_pretrained(base, "RESEARCH-EMPRM/emprm-v2-stageB_rung5_noev_s2")
processor = AutoProcessor.from_pretrained("Qwen/Qwen3-VL-8B-Instruct")
adapter_config.json records the local path the adapter was trained from; pass the base model explicitly as above. The scorer (scoring.Scorer.score_grounded, family grounded, aggregation product) and its prompts are in code/ of the sync dataset.