Instructions to use lighteternal/tissuedecision-9b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use lighteternal/tissuedecision-9b with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="lighteternal/tissuedecision-9b") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("lighteternal/tissuedecision-9b") model = AutoModelForMultimodalLM.from_pretrained("lighteternal/tissuedecision-9b", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use lighteternal/tissuedecision-9b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "lighteternal/tissuedecision-9b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "lighteternal/tissuedecision-9b", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/lighteternal/tissuedecision-9b
- SGLang
How to use lighteternal/tissuedecision-9b with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "lighteternal/tissuedecision-9b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "lighteternal/tissuedecision-9b", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "lighteternal/tissuedecision-9b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "lighteternal/tissuedecision-9b", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use lighteternal/tissuedecision-9b with Docker Model Runner:
docker model run hf.co/lighteternal/tissuedecision-9b
TissueDecision-9B
An open decision vision-language model (VLM) for rat and mouse tissue pathology.
TissueDecision-9B reads a microscope image of tissue, takes a question with its possible answers, and returns a probability for every answer in about 0.1 s on a single GPU. It covers rat and mouse tissue across organs, in drug and chemical safety studies (toxicologic pathology), disease research and mouse genetics. On VIPER, a public expert-reviewed benchmark for the field, it has the highest score of any model across the multiple-choice and true/false questions, ahead of proprietary specialist models three times its size.
Live demo · Training data · LoRA adapter
Highlights
- Highest score on VIPER: 64.9% across its multiple-choice and true/false questions. VIPER, from the Mahmood Lab at Harvard Medical School, has 1,251 questions on 419 rat tissue images, reviewed by veterinary pathologists. TissueDecision-9B is ahead of every model tested on it, including the benchmark authors' own proprietary specialist models, ToxScribe-Gemma-31B (64.7%) and ToxScribe-Qwen-27B (64.5%).
- Highest multiple-choice score: 67.5%, ahead of ToxScribe-Qwen-27B (67.1%) and ToxScribe-Gemma-31B (65.2%). On the true/false sets alone, ToxScribe-Gemma-31B leads (64.1% against 62.3%).
- The most capable open model for toxicologic pathology: about 7 points ahead of the next open model on VIPER.
- At a third of the size: 9 billion parameters, against 27 and 31 billion for the specialist models it outscores.
- Fast: about 0.1 s per answer and 24 answers per second on one H200 GPU, or $0.06 per 1,000 answers.
- Calls normal tissue normal: on VIPER's over-reading questions, which check whether a model reports a lesion that is not there, accuracy rises from 69.4% to 81.1%.
- Works on studies it has never seen: on real slides from 34 held-out toxicology studies, it separates lesions from clean tissue with an AUROC of 0.96 (base model 0.81) and flags 86% of lesion tiles.
- Calibrated probabilities: calibration error on the internal test split falls from 5.8% to 1.5%, so a 0.9 means about 90%.
- Open: weights and training data under CC BY-SA 4.0, built only from openly licensed images. No VIPER image or question was used in training.
Why it matters
Before a new drug or chemical reaches people, regulators require safety studies in animals: for medicines, repeat-dose studies in a rodent and a non-rodent species. Pathologists examine the tissues from these studies under the microscope, organ by organ; a single two-year rat study produces about 12,000 slides. Most of that tissue is normal, and the findings that matter can be small. TissueDecision-9B is built to help with that reading: it answers a question about any field in about 0.1 s, gives a probability instead of a bare yes or no, and is trained to call normal tissue normal.
TissueDecision family
| Full model: merged weights, load and run | tissuedecision-9b (this repo) |
| LoRA adapter for Qwen/Qwen3.5-9B | tissuedecision-9b-lora |
| Training data, splits and provenance | tissuedecision-data |
Model overview
| Type | decision vision-language model (VLM): image + question + options in, one probability per option out |
| Trained on | rat and mouse H&E tissue images from five openly licensed sources (about half each) |
| This repo | full model, bf16, 9.41B parameters (0.46B vision encoder): Qwen3.5-9B with the TissueDecision LoRA merged at strength λ 0.5; standard Qwen3.5 architecture for Transformers and vLLM |
| Training | LoRA (rank 32) on every linear layer of the language model, 86.6M trained parameters, vision encoder frozen; one pass over 166,000 training samples |
| Question types | multiple choice · yes/no · true/false statement · severity score |
| Output | one probability per option, read from the option-label tokens after "Answer:"; no text generation |
| Input | one H&E image, resized to at most 1024 × 1024 px, plus an optional context line such as "Rat liver, H&E" |
| Calibration | calibration.json: logit offsets for yes/no (+0.25) and statement (+0.0625) questions; reported numbers use raw probabilities |
| Licence | CC BY-SA 4.0 |
Example uses
Toxicologic pathologists who want a second reader they can question, preclinical safety teams screening slides for lesions, researchers working with rodent disease models and mouse phenotyping, and machine-learning researchers working on pathology decision models.
Typical questions:
- Is there any lesion in this field? Is necrosis present? (yes/no)
- Which of these five findings best describes the image? Which structure is in the upper-left quadrant? (multiple choice)
- Is the statement "This liver section shows evidence of necrosis within the parenchyma" true? (statement)
- How severe is the vacuolation? (ordered severity levels)
Every option gets a probability, so answers can be ranked, thresholded, or sent to a pathologist when the model is unsure. TissueDecision-9B does not write descriptions or reports.
How it works
- Input. The image (with an optional context line naming species, organ and stain) is the first user turn. The question and its options, lettered A, B, C, ..., are the second user turn. Thinking is off and the assistant turn is prefilled with "Answer:".
- One forward pass. The model reads both turns once. At the next position it would write an option letter; TissueDecision-9B reads the probabilities of the option-letter tokens there and renormalises them over the options. Nothing is generated.
- Question formats.
- Multiple choice: any number of options; the answer is the most probable one.
- Yes/no: two options, yes and no; P(yes) is the answer.
- Statement (true/false): the stem, then
Statement: "..."andIs this statement true?, as in VIPER's true/false question sets; P(true) is the answer. - Severity: ordered levels; the expected level and the full distribution are returned.
- Calibration (optional).
calibration.jsonholds two logit offsets fitted on our dev split: +0.25 for yes/no questions (set for a 10% false-alarm rate on dev slide tiles) and +0.0625 for statements (fitted on 2,124 dev and proxy statements). - Option-averaged mode (optional). Averaging each option's probability over its five cyclic positions costs five passes and raises the VIPER multiple-choice score from 67.5 to 69.0. Headline numbers are single-pass.
The prompt format is the one of llm2jev 0.6.1, used unchanged in training and evaluation.
Get started
All code in this section was run on one NVIDIA H200 against this repo under its current name (vLLM 0.31.0, Transformers 5.17.0, llm2jev 0.6.1, PEFT 0.21.2, Python 3.12); the outputs are copied from that run. The example tiles are held out from training.
1. Start the model (one GPU; prefix caching lets several questions about the same image share its visual tokens):
vllm serve lighteternal/tissuedecision-9b --max-logprobs 256 --return-tokens-as-token-ids --enable-scale-out \
--enable-prefix-caching --max-model-len 16384 --default-chat-template-kwargs '{"enable_thinking": false}'
2. Ask questions from Python with llm2jev (usage_example.py and tissuedecision_server.py are in this repo; prepare_image resizes the image to the training pixel budget):
pip install "llm2jev[vision]==0.6.1"
python usage_example.py lesion_tile.jpg "Rat liver, H&E"
"""TissueDecision-9B with llm2jev: one forward pass per question, label-token probabilities (no text generation).
Start the model first (any GPU with >= 24 GB):
vllm serve lighteternal/tissuedecision-9b --max-logprobs 256 --return-tokens-as-token-ids --enable-scale-out \
--enable-prefix-caching --max-model-len 16384 --default-chat-template-kwargs '{"enable_thinking": false}'
Then: pip install "llm2jev[vision]==0.6.1" and python usage_example.py lesion_tile.jpg "Rat liver, H&E"
(`prepare_image` comes from tissuedecision_server.py in the model repo: it resizes to the training pixel budget.)
"""
import json
import os
import sys
from llm2jev import LLM2Jev
from llm2jev.backends import VLLM
from transformers import AutoProcessor
from tissuedecision_server import prepare_image
MODEL = os.environ.get("TISSUEDECISION_MODEL", "lighteternal/tissuedecision-9b")
QUESTIONS = {
"lesion": {"type": "noul", "instructions": "Is there any histopathological lesion (abnormal finding) in this image?"},
"finding": {"type": "choice", "instructions": "What is the primary histopathological finding in this image?",
"criteria": {"necrosis": None, "single cell necrosis": None, "inflammatory cell infiltrate": None,
"hemorrhage": None, "vacuolation": None, "no significant findings": None}},
"organ": {"type": "choice", "instructions": "Which organ is shown?",
"criteria": {"liver": None, "kidney": None, "thyroid gland": None, "testis": None, "urinary bladder": None,
"lung": None, "heart": None, "stomach": None, "salivary gland": None}},
}
if __name__ == "__main__":
image = sys.argv[1] if len(sys.argv) > 1 else "lesion_tile.jpg"
context = sys.argv[2] if len(sys.argv) > 2 else None # e.g. "Rat liver, H&E"; optional
jev = LLM2Jev(AutoProcessor.from_pretrained(MODEL), VLLM("http://localhost:8000", MODEL), temperature=1.0)
content = [{"type": "image", "image": prepare_image(image)}] + ([{"type": "text", "text": context}] if context else [])
answers = jev([{"role": "user", "content": content}], QUESTIONS) # raw probabilities (calibration: see the server)
print(json.dumps(answers, indent=1))
Output for a held-out Bayer test tile (expert polygons: necrosis covering the tile, hemorrhage 10%); raw probabilities:
{
"lesion": {
"type": "noul",
"noul": 0.9525741248028792
},
"finding": {
"type": "choice",
"choice": "necrosis",
"probabilities": {
"necrosis": 0.5820235816300651,
"single cell necrosis": 0.003921644045241272,
"inflammatory cell infiltrate": 0.012079514063611232,
"hemorrhage": 0.400018567657866,
"vacuolation": 0.0016347844571594726,
"no significant findings": 0.00032190814605705077
},
"confidence": 0.5704299059660786
},
"organ": {
"type": "choice",
"choice": "liver",
"probabilities": {
"liver": 0.9834527089301988,
"kidney": 0.0008967928376909798,
"thyroid gland": 0.00045093575768919336,
"testis": 0.0005790129741662689,
"urinary bladder": 0.00039794940942535075,
"lung": 0.0037756388728626116,
"heart": 0.009641431623194556,
"stomach": 0.0006984229642465625,
"salivary gland": 0.00010710663052576824
},
"confidence": 0.9519940923626062
}
}
On a tile from a clean held-out slide the same script returns P(lesion) 0.095 and "no significant findings" at 0.95. The context line is optional; on an NTP lung image with the context "Rat tissue, H&E" the organ question returns lung (0.52, runner-up urinary bladder 0.32).
3. HTTP API. calibrated: true applies calibration.json and also returns noul_raw; consistency: true averages multiple-choice answers over the cyclic option orders and reports runner_up, margin and stable (same top option under every order).
pip install "llm2jev[vision]==0.6.1" fastapi uvicorn
python tissuedecision_server.py --model lighteternal/tissuedecision-9b --vllm-url http://localhost:8000 --port 8700
curl -s localhost:8700/v1/systemone -H 'Content-Type: application/json' -d @request.json
Request and response for the lesion tile (HTTP 200)
{
"image": "lesion_tile.jpg",
"context": "Rat liver, H&E",
"questions": {
"lesion": {
"type": "noul",
"instructions": "Is there any histopathological lesion (abnormal finding) in this image?"
},
"finding": {
"type": "choice",
"instructions": "What is the primary histopathological finding in this image?",
"criteria": {
"necrosis": null,
"single cell necrosis": null,
"inflammatory cell infiltrate": null,
"hemorrhage": null,
"vacuolation": null,
"no significant findings": null
}
},
"organ": {
"type": "choice",
"instructions": "Which organ is shown?",
"criteria": {
"liver": null,
"kidney": null,
"thyroid gland": null,
"testis": null,
"urinary bladder": null,
"lung": null,
"heart": null,
"stomach": null,
"salivary gland": null
}
}
},
"calibrated": true,
"consistency": true
}
{
"model": "lighteternal/tissuedecision-9b",
"answers": {
"lesion": {
"type": "noul",
"noul": 0.962673,
"noul_raw": 0.952574,
"confidence": 0.925346
},
"finding": {
"type": "choice",
"choice": "necrosis",
"probabilities": {
"necrosis": 0.645761,
"single cell necrosis": 0.002555,
"inflammatory cell infiltrate": 0.012474,
"hemorrhage": 0.335146,
"vacuolation": 0.00244,
"no significant findings": 0.001624
},
"confidence": 0.574914,
"runner_up": "hemorrhage",
"margin": 0.310615,
"stable": true
},
"organ": {
"type": "choice",
"choice": "liver",
"probabilities": {
"liver": 0.989775,
"kidney": 0.001459,
"thyroid gland": 0.000285,
"testis": 0.000568,
"urinary bladder": 0.000318,
"lung": 0.002286,
"heart": 0.004567,
"stomach": 0.000495,
"salivary gland": 0.000247
},
"confidence": 0.988497,
"runner_up": "heart",
"margin": 0.985207,
"stable": true
}
},
"latency_ms": 214.8
}
Prompt format. The image (and optional context line) is one user turn; the question with lettered options is a second user turn; the assistant turn is prefilled with "Answer:" and thinking is off. tissuedecision_config.json documents the exact template, the label token ids and how calibration is applied.
Merged model = evaluated configuration. On 60 held-out items (20 multiple choice, 20 yes/no, 20 statements), this merged model and the evaluated configuration (base + LoRA at λ 0.5 in vLLM) gave the same decision on 100% of items, with a maximum probability difference of 0.031; two runs of the LoRA configuration differ from each other by 0.030 (vLLM bf16 numerics).
Speed (vLLM 0.31.0 on one H200; one yes/no question on a 1024 × 1024 px tile, every tile new to the server, client on the same machine):
| Latency, one request at a time (200 tiles) | p50 105.6 ms, p90 109.3 ms |
| Throughput at full load (64 concurrent requests) | 24.3 decisions/s |
| Model time for a slide-sized batch of 198 tiles | 8.3 s (excludes reading the slide) |
| Cost per 1,000 decisions at $5.00/h | $0.057 |
Several questions about the same tile share the image prefix and cost much less than a new tile.
Architecture
| Base | Qwen/Qwen3.5-9B, thinking disabled |
| Adapted layers | every linear layer of the language model: attention q/k/v/o_proj, the Gated-DeltaNet projections (in_proj_qkv, in_proj_z, in_proj_a, in_proj_b, out_proj) and the MLP (gate_proj, up_proj, down_proj); 248 adapted modules |
| Vision encoder | unchanged (frozen in training) |
| LoRA | rank 32, α 64 (scale 2), standard scaling (not rank-stabilised), no dropout; 86,556,672 trained parameters |
| Strength | the LoRA update is scaled by λ = 0.5 (WiSE-FT-style interpolation with the base), i.e. an effective scale of 1.0, and merged into the weights |
Training data
TissueDecision-9B was trained on rat and mouse H&E images, about half each, from five openly licensed sources. tissuedecision-data holds every item the model could train on, with its source, licence and label source, and the image files.
| Source | Licence | Used for |
|---|---|---|
| PubMed Central open-access figures | CC BY / CC0 | caption-derived findings mapped to SEND terms; caption-grounded questions |
| NTP Nonneoplastic Lesion Atlas | US Government public domain | expert diagnoses on about 2,000 images |
| Open TG-GATEs rat liver and kidney slide tiles | CC BY-SA 2.1 JP | vehicle controls and weak positives |
| Bayer expert polygons on Open TG-GATEs liver slides | CC BY-SA 2.1 JP | exact structure, extent, count and artifact items; split by study |
| IMPC mouse histopathology (BioImage Archive S-BIAD3040) | CC BY 4.0 | organ breadth, pathologist annotations |
- Question format aligned to the benchmark without its text. VIPER was profiled only as aggregate statistics. The labelled items were then re-rendered with stems that name species, organ and stain; five same-kind options of similar length from a 2,050-entry phrase dictionary; single-assertion true/false statements of 9 to 16 words; image-swap false statements; and over-reading probes with a normal answer in about 45% of them.
- New labelled items. Programmatic items from the Bayer expert polygons; 4,365 questions written by an open LLM (Qwen3.6-35B-A3B) from caption evidence and kept by an image-grounded verifier; and 5,688 items written by Claude Opus from 640 rat images and their expert labels.
- Cleaning. Image-grounded audits with hidden wrong-answer controls (every control was caught); a no-image filter that dropped 11,024 multiple-choice items a text-only model could answer; a panel check that removed 27,016 items on composite, non-H&E or wrong-organ panels.
- Excluded. VIPER images and text (never stored or trained on), MMO (VIPER's main image source), all non-commercial and no-derivatives data, and TG-GATEs slides whose regions matched VIPER images in a template and perceptual-hash check.
The dataset has 235,455 items. After the licence and quality filters the training pool is 181,887 items, from which 166,000 samples were drawn: each good item about once, Claude-written and verified-QA items twice, mouse data at 0.6×, 5,000 round-1 caption questions and 8,500 replay items.
Training procedure
| Samples | 166,000 (2,594 steps × 64), one pass |
| Optimiser | AdamW, learning rate 1e-4, cosine schedule with 3% warm-up, effective batch 64 |
| Loss | cross-entropy plus Brier score on soft labels over the option tokens, class-balanced yes/no weights |
| Replay | KL divergence to the base model on 5% generic items; the teacher is the same network with the adapter disabled, checked to equal the base model at every checkpoint |
| Encoding | 40% of items without a context line (VIPER prompts have none); options re-permuted at every draw; stain, JPEG, scale and crop augmentation; label-independent synthetic markers |
| Checkpoint | evaluated every 10% of training; selected by worst-group dev accuracy under a false-alarm cap (step 2,335) |
| Hardware | one NVIDIA H200, 9.8 hours |
| Software | Unsloth and PEFT 0.21.2; llm2jev 0.6.1 prompt format |
Choosing the strength λ (pre-registered)
The final strength was chosen by a rule fixed before any VIPER number was seen, on a VIPER-format proxy built from our own dev split (330 five-option multiple-choice questions and 270 true/false sets, with an organ mix weighted toward VIPER's). Rule: take the proxy-best λ in {0.15 … 1.0}; ties within 1 point go to the smaller λ. VIPER never informed the choice.
| λ | 0 (base) | 0.15 | 0.2 | 0.25 | 0.3 | 0.4 | 0.5 | 0.7 | 1.0 |
|---|---|---|---|---|---|---|---|---|---|
| Proxy score | 61.4 | 74.3 | 76.6 | 78.8 | 80.3 | 83.0 | 83.9 | 84.4 | 84.5 |
λ 0.5, 0.7 and 1.0 are within 1 point of the best, so the rule picked λ 0.5. The proxy was drawn from the same generators as the training data and overestimates absolute performance (83.9 against a VIPER mean of 64.9); it is used only to rank strengths.
Evaluation
The benchmark. VIPER (Mahmood Lab, Harvard Medical School, 2026) is a public benchmark for toxicologic pathology: 1,251 questions on 419 rat tissue images (1024 × 1024 px) from 9 organ groups. A veterinary pathologist wrote a seed question for each image and reviewed every released question. Each image carries three questions:
- a multiple-choice question with five options ("MCQ" in the paper), scored as the mean over the 5 cyclic shifts of the options;
- a true/false question set of four statements ("KPrim"), each asked separately and scored with the half-point rule (4 of 4 correct = 1, 3 of 4 = 0.5);
- a free-text question, not evaluated here: TissueDecision-9B is a decision model and does not write descriptions. ToxScribe's overall VIPER scores include free text; we compare the multiple-choice and true/false scores only.
We use the official viper-bench evaluator, reached through an OpenAI-compatible proxy that returns TissueDecision-9B's single-pass decision as a letter or as True/False (parse rate 100%).
Published models were scored by the VIPER authors with the generative protocol, in which the model writes the letter or True/False itself; the scoring is the same.
VIPER against every reported model
| Model | Parameters | Weights | Multiple choice | True/false sets | Combined | Source |
|---|---|---|---|---|---|---|
| TissueDecision-9B (single pass) | 9B | open | 67.5 | 62.3 | 64.9 | official evaluator, this work |
| ToxScribe-Qwen-27B | 27B | proprietary | 67.1 | 61.8 | 64.5 | VIPER paper |
| ToxScribe-Gemma-31B | 31B | proprietary | 65.2 | 64.1 | 64.7 | VIPER paper |
| Gemma-4-31B | 31B | open | 60.7 | 54.1 | 57.4 | VIPER paper |
| Qwen3.5-27B | 27B | open | 60.0 | 46.6 | 53.3 | VIPER paper |
| JPT-9B | 9B | open | 59.8 | 55.6 | 57.7 | decision track, measured by us |
| PathChat+ | not published | proprietary | 58.7 | 41.5 | 50.1 | VIPER paper |
| GPT-5.4 | not published | proprietary | 58.5 | 54.3 | 56.4 | VIPER paper |
| Qwen3.5-9B (base) | 9B | open | 56.2 | 51.1 | 53.6 | official evaluator, measured by us |
- Combined is the mean of the multiple-choice and true/false scores (for published models, of their one-decimal scores). The VIPER paper's own "overall" score also averages in free-text answers, which TissueDecision-9B does not write.
- Leaders. TissueDecision-9B has the highest combined and the highest multiple-choice score of every model. On the true/false sets it outperforms ToxScribe-Qwen-27B and every open model; ToxScribe-Gemma-31B leads at 64.1.
- Sample size. VIPER has 419 multiple-choice questions, so one point is about 4 questions (standard error about ±2.3 points).
- Option-averaged mode. Averaging over the 5 option orders gives a multiple-choice score of 69.0 (base: 59.7). This is an inference mode costing five passes; the headline is single-pass.
- Decision track. Scoring the same single-pass decisions directly gives 67.5 / 62.6, and 67.0 / 62.1 with a context line. The official evaluator's answers agree with the decision track on 99.6% of MCQ picks and 99.8% of statements.
- Strength sensitivity. At λ 0.4 / 0.7 the scores are 67.0 / 68.5 (multiple choice) and 61.8 / 62.1 (true/false sets): VIPER varies by less than 1.5 points across λ 0.4 to 0.7.
By question category
| Category (multiple-choice + true/false items) | Qwen3.5-9B (base) | TissueDecision-9B |
|---|---|---|
| Anatomy (241) | 56.0 | 64.6 |
| Over-reading probes (160) | 69.4 | 81.1 |
| Localization (151) | 44.5 | 53.4 |
| Pathology identification (147) | 48.8 | 62.4 |
| Characterization (52) | 55.6 | 68.3 |
| Artifact (42) | 55.0 | 68.3 |
| Quantification (40) | 31.8 | 49.8 |
| Male reproductive organs (99) | 36.7 | 46.0 |
Combined multiple-choice (5-shift) and true/false (half-point) score per item, decision track. Other changes against the base: multiple-choice rotation consistency (same answer under every option order) 0.44 → 0.73; statement accuracy 72.6% → 79.1%; the gap between the mean P(true) and the true rate of true/false statements 0.11 → 0.06.
Held-out real slides
Bayer test studies: 1,174 tiles from rat liver slides of 34 Open TG-GATEs studies held out from training, labelled by the Bayer pathologists' polygons (681 lesion tiles, 332 normal tiles on lesion slides, 161 tiles on clean slides). Question: "Is there any histopathological lesion (abnormal finding) in this image?" TG-GATEs rat-liver probe: held-out regions from Bayer-annotated TG-GATEs slides. 95% confidence intervals from a slide-clustered bootstrap.
| Test | Qwen3.5-9B (base) | TissueDecision-9B |
|---|---|---|
| Bayer: lesion vs clean-slide AUROC | 0.805 (0.720–0.881) | 0.961 (0.933–0.981) |
| Bayer: lesion vs normal tiles within lesion slides, AUROC | 0.822 (0.747–0.885) | 0.897 (0.838–0.946) |
| Bayer: lesion tiles called lesion (raw, P > 0.5) | 19.1% | 86.2% |
| Bayer: tiles on clean slides called lesion (raw) | 0.0% | 5.0% |
| Bayer: normal tiles on lesion slides called lesion (raw) | 0.6% | 19.3% |
| Bayer, with the yes/no calibration offset: lesion tiles / clean-slide tiles called lesion | 89.4% / 10.6% | |
| TG-GATEs probe: lesion vs clean AUROC | 0.843 (0.670–0.962) | 0.947 (0.894–0.986) |
| TG-GATEs probe: within lesion slides, AUROC | 0.721 (0.586–0.859) | 0.773 (0.653–0.886) |
Internal test split
3,843 items from articles, atlas pages and studies held out from training (decision track, context line kept; 392 five-option multiple-choice questions, 89 true/false sets, 2,032 yes/no items).
| Qwen3.5-9B (base) | TissueDecision-9B | |
|---|---|---|
| Accuracy | 72.3% | 84.5% |
| Yes/no false alarms | 27.4% | 12.5% |
| Yes/no recall | 69.6% | 76.9% |
| Expected calibration error | 5.8% | 1.5% |
| Multiple choice, mean over 5 cyclic shifts | 74.7 | 88.4 |
| True/false sets, half-point rule | 68.5 | 77.5 |
Limitations
- No free text. The model does not write descriptions or reports, and VIPER's free-text track was not evaluated.
- One training run. VIPER has 419 multiple-choice questions (standard error about ±2.3 points).
- Weak spots. Male reproductive organs (46.0 on VIPER), quantification (49.8) and localization (53.4) are the lowest categories. Rat thyroid, urinary bladder, salivary gland and male accessory glands are scarce in open data and under-represented in training.
- False alarms near lesions. On slides that carry a lesion, 19.3% of the normal-annotated tiles are called lesion at the raw threshold.
- Labels. The Claude-written items were audited by the same model family, not by a human pathologist. Some literature labels inherit caption-panel misalignment despite filtering.
- Domain. Training images are H&E, about half rat and half mouse; the TG-GATEs slides, the Bayer test and the probe come from one laboratory and scanner. Other stains, species, scanners and laboratories are untested.
- Calibration offsets were fitted on our dev split; check them on your own data before using a threshold.
Intended use
In scope: research on rat and mouse tissue pathology (safety studies, disease models, mouse phenotyping); a second reader for H&E fields; screening and ranking tiles for review; research on calibration and over-reading in pathology models; benchmarking.
Out of scope: diagnosis of any patient or animal; regulatory or GLP decisions without review by a qualified pathologist; human pathology; non-H&E stains; free-text reporting.
Licence
The TissueDecision-9B weights are released under CC BY-SA 4.0 (LICENSE).
- Base model: Qwen3.5-9B, Apache-2.0 (
LICENSE-Qwen3.5). - Training data:
- Open TG-GATEs slides and the Bayer annotations: CC BY-SA 2.1 JP. Attribution: "Toxicogenomics Project and Toxicogenomics Informatics Project under CC Attribution-Share Alike 2.1 Japan", with the database's Additional License.
- IMPC: CC BY 4.0. PMC figures: CC BY or CC0.
- NTP: US Government public domain.
- No non-commercial or no-derivatives data was used.
- Evaluation data: VIPER (CC BY-NC 4.0) was used for evaluation only and never for training.
Citation
@misc{tissuedecision9b2026,
title = {TissueDecision-9B: an open decision vision-language model for rat and mouse tissue pathology},
author = {lighteternal},
year = {2026},
url = {https://huggingface.co/lighteternal/tissuedecision-9b}
}
Acknowledgements
- Data: Open TG-GATEs (Toxicogenomics Project and Toxicogenomics Informatics Project, NIBIOHN, Japan); the Bayer pathologists who annotated 230 Open TG-GATEs liver slides (M. Radbruch, B. Lawrenz, H. Pischon, V. Bertani, U. Bach, F. Schorsch, A. Poehlmann, S. Villalba); the National Toxicology Program (NIEHS) for the Nonneoplastic Lesion Atlas; the International Mouse Phenotyping Consortium and the BioImage Archive; and the authors of the PubMed Central open-access articles whose figures are used.
- Benchmark: the VIPER authors (Mahmood lab) for the benchmark, its official evaluator and its documentation.
- Base model and tools: the Qwen team for Qwen3.5-9B; llm2jev for the decision prompt format; Unsloth, PEFT and vLLM.
- AI-written items: 5,688 training items were written by Claude (Anthropic) from each image and its expert label (98.5% judged correct on an audit sample of 136). Claude also ran the image-grounded audits of the other item sets.
- Downloads last month
- 35
Model tree for lighteternal/tissuedecision-9b
Dataset used to train lighteternal/tissuedecision-9b
Space using lighteternal/tissuedecision-9b 1
Evaluation results
- MCQ on VIPERself-reported67.500
- KPrim on VIPERself-reported62.300



