Views
No views yet
BCJR-QAT: A Differentiable Relaxation of Trellis-Coded Weight Quantization (V. Iyengar, 2026; arXiv preprint, pending)
| Configuration | PPL | Δ vs QTIP-PTQ |
|---|---|---|
| FP16 baseline (no quantization) | 9.7000 | — |
| QTIP-PTQ at L4 only (2 bpw) | 10.2189 | — |
| BCJR-QAT at L4 only, skip-high-T (2 bpw) | 10.1347 | −0.0842 |
| QTIP-PTQ at L8 only (2 bpw) | 10.3083 | — |
| BCJR-QAT at L8 only, naive schedule (2 bpw) | 10.3302 | +0.022 (overshoot) |
| QTIP-PTQ at $[L_4, L_8]$ joint | 10.9134 | — |
| BCJR-QAT at $[L_4, L_8]$ joint (mixed schedules) | 10.8364 | −0.0770 (super-additive) |
| Path | Bytes | Contents |
|---|---|---|
layer_04_skipT_wq.pt | 232 MB | Hardened-Viterbi snapshot for L4 under T_init=0.3 schedule. The headline winner. |
layer_04_skipT_trajectory/ | 1.2 GB | 5 per-step W_latent checkpoints (steps 2/4/6/8/10) for trajectory analysis. |
layer_04_naive_wq.pt | 232 MB | L4 hardened snapshot under T_init=1.0 (the schedule-overshoot example). |
layer_08_naive_wq.pt | 232 MB | L8 hardened snapshot under T_init=1.0, used in multi-layer compounding test. |
bench/30step/ | 1.6 GB | LR=2e-5 30-step reference run (sub-threshold drift; no codeword movement). |
results/*.json | ~10 KB | Trajectory-eval and multi-layer-eval JSONs reproducing the paper's tables. |
bootstrap/perwin_bcjr_n4.npz | 3 KB | OLMoE per-window NLLs for bootstrap analysis (companion to OLMoE results in the paper). |
.pt files saved as a dict
{"attn_q_proj": tensor, "attn_k_proj": tensor, ..., "mlp_down_proj": tensor}, one entry per quantized linear in the wrapped layer
(7 entries: q/k/v/o/gate/up/down). They install in-place into a fresh
FP16 Llama-3.2-1B as follows:1import torch
2from transformers import AutoModelForCausalLM
3from src.qat.eval_llama_layer import install_layer_weights
4
5model = AutoModelForCausalLM.from_pretrained(
6 "meta-llama/Llama-3.2-1B", torch_dtype=torch.float16, device_map="cuda")
7snap = torch.load("layer_04_skipT_wq.pt", weights_only=True)
8install_layer_weights(model, layer_idx=4, snap_or_fn=snap, dtype=torch.float16)
9# now model has 2-bit BCJR-QAT-trained weights at layer 4, FP16 elsewhereinstall_layer_weights helper is in
src/qat/eval_llama_layer.py
in the companion repo.1git clone https://github.com/Venugopalan2610/quant-olmoe
2cd quant-olmoe
3bash scripts/vast_setup_llama.sh
4bash scripts/vast_train_llama_skip_highT.sh
5python -m scripts.eval_llama_trajectory \
6 --ckpt-dir cache/llama_bcjr_skipT \
7 --target-layer 4 \
8 --output results/llama_skipT_trajectory.json \
9 --skip-baselines --ppl-fp-cached 9.70 --ppl-ptq-cached 10.21891@article{iyengar2026bcjrqat,
2 title = {BCJR-QAT: A Differentiable Relaxation of Trellis-Coded
3 Weight Quantization},
4 author = {Iyengar, Venugopalan},
5 year = {2026},
6 journal = {arXiv preprint}
7}1@inproceedings{tseng2024qtip,
2 title = {QTIP: Quantization with Trellises and Incoherence Processing},
3 author = {Tseng, Albert and Yao, Qingyao and Kuleshov, Volodymyr and
4 De Sa, Christopher},
5 booktitle = {NeurIPS},
6 year = {2024}
7}