Result — held-out 9 patients (48 h, seed 42, bf16)
Table with columns: model, Q4 size, ANN TIR, ANN TBR, ANN surv, UNANN TIR, UNANN TBR, UNANN surv| model | Q4 size | ANN TIR | ANN TBR | ANN surv | UNANN TIR | UNANN TBR | UNANN surv |
|---|
| Qwen3.5-4B | 2.7 GB | 80.8 | 2.1 | 9/9 | 73.8 | 2.2 | 9/9 |
| this (Qwen3.5-2B) | ~1.3 GB | 81.8 | 1.8 | 9/9 | 73.6 | 1.6 | 9/9 |
| Gemini teacher | — | — | — | — | 73.9 | 3.0 | 9/9 |
The 2B matches the 4B at half the size — +1.0 pp TIR announced, −0.2 pp
unannounced (noise), slightly lower hypo on both, 9/9 survival in both meal
conditions with zero deaths. Unannounced TIR 73.6 ≈ teacher parity (73.9).
"Unannounced" = 50 % of meals hidden from the controller (patient forgets to
announce) — the realistic failure mode. Train loss 0.364 (4B: 0.338).
Files
adapter_model.safetensors — LoRA (r32, all-linear; Qwen3.5's hybrid
linear-attention layers require all-linear). Merge onto Qwen/Qwen3.5-2B.
qwen35-2b-f16.gguf — merged f16 GGUF, already patched for llama.cpp/Ollama
(Qwen3.5's phantom MTP block removed: block_count->24, nextn_predict_layers->0).
Deploy: ollama create loop-qwen35-2b --quantize q4_K_M -f Modelfile (Ollama >=0.32),
with FROM qwen35-2b-f16.gguf / PARAMETER num_ctx 4096 / PARAMETER temperature 0.
Notes
- Non-thinking: the chat template emits an empty
<think></think>; the model answers
with JSON directly. Training and eval use identical rendering (no train/serve skew).
- Data:
jxx123/loop-distill-data (distill_sft_v16.jsonl, simulator only).
Trained on 21 non-held-out patients; the 9 eval patients are excluded.
⚠️ Research / simulation only — not a medical device.