kvloom β XKV translators
Trained translators for kvloom, the first public implementation of XKV (arXiv:2608.20617) β latent KV-cache communication between two frozen heterogeneous language models.
Source code: https://github.com/batuhanzorbeyzengin/kvloom
A translator reads the sharer's and the receiver's KV caches and writes a gated residual into the receiver's cache. Both language models stay frozen; only these 1β10M-parameter translators are trained. Each one is specific to its (sharer, receiver, dataset) triple.
The grid
30 translators: six ordered model pairs Γ five split-evidence datasets. Scores are the primary metric (F1 for generative QA, accuracy for classification) on 80β100 validation examples, in the paper's setting where each model holds half the evidence.
| Sharer | Receiver | Dataset | receiver-only floor | with the channel | after 5 naive turns |
|---|---|---|---|---|---|
| qwen3-0.6b | qwen3-0.6b | ropes | 40.85 | 46.17 | 0.00 |
| qwen3-0.6b | qwen3-0.6b | qasc | 55.50 | 75.40 | 3.22 |
| qwen3-0.6b | qwen3-0.6b | strategyqa | 57.50 | 70.00 | 7.04 |
| qwen3-0.6b | qwen3-0.6b | musique | 18.51 | 37.81 | 0.34 |
| qwen3-0.6b | qwen3-0.6b | hotpotqa_bridge | 18.19 | 39.15 | 0.53 |
| qwen3-0.6b | llama-3.2-3b-instruct | ropes | 38.09 | 53.67 | 0.52 |
| qwen3-0.6b | llama-3.2-3b-instruct | qasc | 79.63 | 94.33 | 3.01 |
| qwen3-0.6b | llama-3.2-3b-instruct | strategyqa | 78.75 | 77.50 | 15.62 |
| qwen3-0.6b | llama-3.2-3b-instruct | musique | 25.01 | 44.39 | 0.00 |
| qwen3-0.6b | llama-3.2-3b-instruct | hotpotqa_bridge | 39.33 | 57.77 | 0.42 |
| gemma-3-1b-it | qwen3-0.6b | ropes | 40.85 | 46.83 | 1.67 |
| gemma-3-1b-it | qwen3-0.6b | qasc | 55.50 | 75.07 | 5.41 |
| gemma-3-1b-it | qwen3-0.6b | strategyqa | 57.50 | 68.75 | 19.87 |
| gemma-3-1b-it | qwen3-0.6b | musique | 18.51 | 40.42 | 0.98 |
| gemma-3-1b-it | qwen3-0.6b | hotpotqa_bridge | 18.19 | 39.17 | 1.50 |
| gemma-3-1b-it | llama-3.2-3b-instruct | ropes | 38.09 | 53.33 | 0.15 |
| gemma-3-1b-it | llama-3.2-3b-instruct | qasc | 79.63 | 95.33 | 4.27 |
| gemma-3-1b-it | llama-3.2-3b-instruct | strategyqa | 78.75 | 83.75 | 0.14 |
| gemma-3-1b-it | llama-3.2-3b-instruct | musique | 25.01 | 46.43 | 0.00 |
| gemma-3-1b-it | llama-3.2-3b-instruct | hotpotqa_bridge | 39.33 | 55.80 | 1.33 |
| llama-3.2-3b-instruct | qwen3-0.6b | ropes | 40.85 | 50.67 | 0.85 |
| llama-3.2-3b-instruct | qwen3-0.6b | qasc | 55.50 | 75.07 | 9.87 |
| llama-3.2-3b-instruct | qwen3-0.6b | strategyqa | 57.50 | 62.50 | 8.11 |
| llama-3.2-3b-instruct | qwen3-0.6b | musique | 18.51 | 39.19 | 0.43 |
| llama-3.2-3b-instruct | qwen3-0.6b | hotpotqa_bridge | 18.19 | 38.65 | 1.00 |
| llama-3.2-3b-instruct | llama-3.2-3b-instruct | ropes | 38.09 | 52.17 | 0.00 |
| llama-3.2-3b-instruct | llama-3.2-3b-instruct | qasc | 79.63 | 94.83 | 0.80 |
| llama-3.2-3b-instruct | llama-3.2-3b-instruct | strategyqa | 78.75 | 75.00 | 0.00 |
| llama-3.2-3b-instruct | llama-3.2-3b-instruct | musique | 25.01 | 44.73 | 0.00 |
| llama-3.2-3b-instruct | llama-3.2-3b-instruct | hotpotqa_bridge | 39.33 | 55.05 | 0.00 |
Mean across the grid: floor 45.14, with the channel 59.63. The paper reports 57.04 over the same cells.
Read this before chaining turns
The last column is not a typo. These translators are trained single-turn, and re-applying one onto its own output destroys the channel within three turns β in 29 of 30 cells it falls below a quarter of its first-turn score.
Recomputing the residual against the original receiver cache instead (clean_base)
holds the full advantage indefinitely: perfectly flat across five turns in 30 of 30
cells. Always use it for multi-turn work:
session = Session(..., strategy="clean_base")
The underlying finding β that receiver-aware pooling does not suppress evidence it has
already sent, so error accumulates rather than self-correcting β is documented in the
kvloom repository under docs/phase2-findings.md. Per-cell curves are in curves/.
Usage
from kvloom import Session, load_translator
translator = load_translator("qwen3-0.6b__llama-3.2-3b-instruct__ropes.pt")
session = Session(
sharer="Qwen/Qwen3-0.6B",
receiver="meta-llama/Llama-3.2-3B-Instruct",
translator=translator,
strategy="clean_base",
)
answer = session.turn(question=..., sharer_context=..., receiver_context=...)
Each .pt ships with a .pt.json provenance sidecar recording the model pair, the exact
geometry it was trained against, the translator configuration, library versions and a
weight hash. load_translator verifies that geometry against the models in use and raises
CheckpointError on a mismatch, so a translator cannot be silently applied to the wrong
pair.
Status and caveats
- Exploration checkpoints. 50β75 optimiser steps at the paper's effective batch size of 256, one seed, 80β100 evaluation examples per cell. They reproduce the paper's ordering and beat its reported score in 16 of 30 cells, but this is not a finished sweep and carries no confidence intervals.
- kvloom is consistently above the paper on MuSiQue and below on ROPES, on every pair. That is structure, not noise, and its cause is not yet identified.
- Gemma-3 appears only as a sharer. As a receiver it is unsupported: rebuilding its
interleaved sliding-window cache has no public path in
transformers.
Licence
The translator weights are Apache-2.0. The base models carry their own licences (Qwen, Gemma, Llama 3.2 Community Licence); using these translators requires access to those models on their own terms.
Ablations
ablations/ holds 54 further translators reproducing the paper Table 3 variants
(-RP, -RX, lcfp) over six pairs and three datasets. The per-cell table is in
ablations/summary.md.
One component-level finding survives the per-dataset split: removing receiver-position retrieval costs 1.68 F1 on ROPES and gains 2.27 on QASC, i.e. it does measurable work on extractive reading and none on multiple choice. The other two variants show positive mean deltas when removed, which at 75 steps and a single seed points at the training budget rather than at the components β that is not yet a finding, and is written up as such in the repository.