How it works
- Prompt. Every question of a request is listed before the state. Each option gets a
one-token code: A–Z, then two-letter codes that are single Gemma tokens. Up to 255 options per
question are read in one pass.
- Readout. The next-token log-probabilities of the option codes after the prompt, normalised
over the options shown, at a temperature per question type (
calibration.json: choice 1.18,
yes/no 1.18, score 1.12).
- Order averaging. Choice questions with at most
order_avg_max options are also scored with
the options reversed, and the two are averaged.
- Read twice. Inputs up to 12,000 characters are repeated once in the prompt
(
prompt_config.json).
- Attention is Gemma 4's own (causal).
Run it for the Decision Index
hf download turion-ai/turion-jev-31b --local-dir /models/turion-jev-31bpip install "/models/turion-jev-31b/code[vllm]"git clone https://github.com/apolinario/decision-index && pip install -e "./decision-index[transformers]"cd decision-indexpython -m decision_index pipeline --engine turion_jev.kit_engine:TurionJev \ --option model_dir=/models/turion-jev-31b --option backend=vllm --option quantization=fp8 \ --option order_avg_max=2 --option second_pass_max_questions=1 --option repeat_max_questions=1 \ --option warm_prefix=true --option recheck=false \ --compact --out runs/turion-jev-31b
These are the options of the official run. They keep latency within the board's rule on one RTX
PRO 6000:
second_pass_max_questions=1: order averaging (and recheck) only for requests with one question;
repeat_max_questions=1: read twice only for requests with one question;
warm_prefix=true: a request's shared prefix is scored once before its questions;
recheck=false: no second pass for unsure long choice questions.
The engine runs vLLM in-process, one request at a time: BF16 weights quantised online to FP8,
max_model_len 65,600, prefix caching, gpu_memory_utilization 0.92. The official run used
vLLM 0.32.0, torch 2.13.0+cu130 and transformers 5.19.0 (the vllm/vllm-openai image of
October 2026) with the kit at 25c6ec7.
Declared limit: prompts up to 65,536 tokens. A longer request is refused (Unsupported),
never truncated. In the public 0.3 suite that is 226 ToolRet requests and 1 BRIGHT request.
A TypeSafe-compatible POST /v1/systemone server is also included
(python -m turion_jev.serve --model /models/turion-jev-31b --backend vllm --quantization fp8).
It takes fewer options than the kit engine; use the engine for the settings above.
Training
- Method. LoRA r64 (alpha 128) on all linear layers, learning rate 2e-5, 450 steps of ~65k
tokens, sequences up to 16,384 tokens, options shuffled, inputs up to 12,000 characters
repeated once. The loss is cross-entropy against soft (probability) targets over the option
codes.
- Merge. A uniform soup of the checkpoints at steps 300, 375 and 450, merged into the base at
full scale and saved in BF16.
- Calibration. One temperature per question type, fitted on held-out data.
- Compute. A training job on the Turion AI model training platform:
one NVIDIA B300, about 7.3 hours.
Data
157,106 training rows:
The Decision Index suite was not trained on. Every training row was checked against the 0.3 suite
by line match, 13-gram overlap and exact match, and 4,395 rows were dropped. Evaluation sets next
to the suite's benchmarks (VAST, ANLI, MedNLI and others) were excluded.
Limitations
- Prompts over 65,536 tokens are refused.
- Attention is causal; the model does not read the prompt bidirectionally.
- The reported run used FP8. The weights are BF16.
- Probabilities are calibrated on our held-out data. Check calibration on your own data before
relying on the numbers.
Licence
Apache-2.0, like the base model; see LICENSE and NOTICE. The training data sources keep
their own licences, listed above.