Model details
Table | |
|---|
| Base model | Qwen/Qwen3.8-27B |
| Architecture | Qwen3.5 vision-language backbone |
| Output head | 255-way linear readout (readout.safetensors) replacing the LM head |
| Attention | Full-attention layers are non-causal; the linear-attention recurrence stays causal |
| Pooling | Last token |
| Calibration | One fitted temperature, 0.8821, stored in decision_config.json |
| Precision | bfloat16 |
| License | Apache-2.0 |
The readout is initialised from the LM-head rows of 255 single-token answer codes (A to JT). The model reads the prompt once, takes the hidden state of the last token, and applies the readout:
probs = softmax(readout(hidden[-1])[:n_options] / T)
Training
- Fine-tuned on static image-text decision data with three question types: multiple choice, yes/no and graded score.
- Objective: soft-label cross-entropy over the 255 answer codes.
- The vision tower was frozen.
- Training images and the 12,210 public vision evaluation images were compared by exact byte hash and no match was found. Perceptual or semantic overlap was not checked.
Evaluation
Decision Index edition 0.3, public vision suite (11 benchmarks, 12,210 rows, one to four images per row): public vision index 73.50, with every row answered and no errors. Images were used at native resolution, capped at 1,638,400 pixels each.
This is the public half of the Vision board's score only. The board's Full score also includes private tests that are run by the maintainers, so 73.50 is not a leaderboard rank.
Usage
pip install -r requirements.txt
from rbdash_decision import RBDashDecision model = RBDashDecision.from_pretrained("RBDash-Team/RBDash-Decision-v0.1") # Multiple choice. List items become options A, B, C, ...r = model.decide("How many organs are in the image?", ["3", "2", "1", "0"], images=["scan.jpg"])print(r["choice"], r["probabilities"]) # Yes/nor = model.decide("Is the meme hateful?", kind="noul", images=["meme.png"])print(r["noul"]) # probability of "yes"
Command line:
python rbdash_decision.py --model . --question "How many organs?" \ --option 3 --option 2 --option 1 --option 0 --image scan.jpg
rbdash_decision.py depends only on torch, torchvision, transformers, safetensors, pillow and huggingface_hub. requirements.txt also installs flash-linear-attention (pure Python), which speeds up the linear-attention layers; the first run is slow while triton compiles its kernels. A GPU with about 60 GB free memory is needed for bfloat16.
causal-conv1d is optional and kept out of requirements.txt on purpose, because it can need a compiler. After the main install, run pip install --no-build-isolation -r requirements-optional.txt. It downloads a prebuilt wheel from GitHub Releases when one matches your CUDA, torch and Python versions (the v1.7.0 release covers torch 2.6 to 2.10); otherwise it compiles from source, which needs nvcc and takes several minutes. Without it the model still runs through a slower PyTorch path.
Reproduce the public vision evaluation
The Decision Index kit does not ship an engine for this model, so rbdash_decision_engine.py in this repository plugs it in. The prompt is part of the trained model: keep rbdash_decision.py unchanged, because other wording can change individual predictions.
# 1. Get the model and the kithf download RBDash-Team/RBDash-Decision-v0.1 --local-dir RBDash-Decision-v0.1git clone https://github.com/apolinario/decision-index && cd decision-indexpip install -e '.[vision]'pip install -r ../RBDash-Decision-v0.1/requirements.txt # 2. Build the public vision suite (about 5.7 GB of downloads; Winoground is gated, accept its terms first)hf auth logindecision-index suite rebuild --vision --work workdecision-index vision verify --dir work/vision # 3. Run and score it (one GPU with about 60 GB free)PYTHONPATH=../RBDash-Decision-v0.1 decision-index vision pipeline --dir work/vision \ --engine rbdash_decision_engine:RBDashEngine \ --option checkpoint=../RBDash-Decision-v0.1 \ --out runs/vision-rbdash-decision-v0.1
The run checkpoints to runs/vision-rbdash-decision-v0.1/results.jsonl and resumes if interrupted; add --limit 50 for a quick trial. When it finishes, vision-scores.json in the same directory reports the public vision index, and complete must be true. A --limit run scores only the rows it ran, so it reports complete: false and an index near zero; that is expected.
The engine handles one request at a time on one GPU (the kit's default of 8 worker threads is serialised inside the engine). flash-linear-attention comes with requirements.txt and causal-conv1d with requirements-optional.txt; without them the model runs through slower PyTorch fallbacks. Triton compiles its kernels on first use, so the first minutes of a run with flash-linear-attention are slow.
Limitations
- One to four images per request, up to 255 options. Nothing is truncated: inputs over 32,768 tokens raise an error.
- Images above 1,638,400 pixels are resized with LANCZOS and re-encoded (JPEG quality 95, or PNG for PNG input) before use, which matches how the reported score was produced.
- Probabilities use one temperature fitted on 100 rows. Do not treat them as reliable outside the training distribution.
- This is a classifier over supplied options. It cannot produce free-form answers.