Skip to main content

nearlossless-context

Paper DOI Software DOI PyPI CI

A research library for memory-efficient long-context inference under fixed VRAM. It implements critical-span retention, query-unknown discovery, and measured KV-cache quality/peak-memory tradeoffs for Hugging Face models.

Install

pip install nearlossless-context

The distribution name is nearlossless-context; the import package is nearlossless_context. Install a CUDA-enabled PyTorch build appropriate for your system when GPU execution is required.

For development or paper reproduction, install from source:

git clone https://github.com/nilsperssonsuorra/nearlossless-context.git
cd nearlossless-context
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -e .

Quick start

Run the packaged end-to-end example. The first run downloads Qwen/Qwen2.5-0.5B-Instruct (about 0.5B parameters):

nearlossless-example

It automatically uses CUDA when available and otherwise runs on CPU with a shorter prompt. The command reports the original, peak, and retained cache-token counts before printing the generated answer. Override the defaults with, for example, nearlossless-example --device cuda --prompt-tokens 4096.

The equivalent library API is:

from nearlossless_context import greedy_generate, prefill_auto

# Default online path: sticky surface-novelty discovery.
past, logits, info = prefill_auto(
    model,
    input_ids,
    mode="stream",
    tokenizer=tokenizer,
)

tokens = greedy_generate(
    model,
    past,
    logits,
    max_new,
    eos_id=tokenizer.eos_token_id,
    next_position=input_ids.shape[-1],
)

Use discovery="query_hold" for the measured LongBench peak/quality tradeoff, or mode="posthoc" when query-aware scorer quality matters more than peak prefill memory. See USAGE.md for model-family floors, multi-document settings, and generation requirements.

Paper papers/main.pdf · doi:10.5281/zenodo.21894255
Software release v0.2.0 · doi:10.5281/zenodo.21894719
Figure papers/figures/fig1_story.png
Findings results/FINDINGS.md
Usage USAGE.md

Story in one line

Near-lossless training-free KV compression ≈ keep critical local neighborhoods; online stream fails when query-unknown discovery is weak; sticky surface novelty closes most of that gap on a multi-seed retrieval suite through 40k at flat peak cache ~1k; on public LongBench, posthoc query-aware ≈ full F1 while online quality is a peak/quality Pareto (query_hold ~0.92× full @ ~2.5k peak).


Results (headline)

On multi-seed retrieval (primary Qwen3-4B, RTX 3090):

Result Takeaway
H1′ full / oracle crit±1 / anti-oracle 15/15 / 15/15 / 0/15 — critical span + local radius is necessary & sufficient
Stream attention @512 multi-seed ~33% (end-depth only)
Stream oracle pin @512 15/15 — failures are discovery, not peak budget
Stream sticky novelty @512 ~93% @4k surface novelty; 9/9 cells through 40k sticky; peak cache ~1k
multi3 / hop2 / hop3 novelty 5/5 @512; valley multi3 & hop3 0/5 @512
multidoc (6 titled docs) novelty 15/15 @512; valley/oracle_pin 5/15
External-style slice (10 mixed QA @~4k) novelty 10/10 hits = full; valley 0/10
Public LongBench (60 @4k truncate) full F1 0.28; novelty ~0.18 (honest gap vs suite)
Posthoc LB upper bound (same 60) 0.95–1.0× full F1 @ final 512–2048 (peak=(L))
query_hold Pareto on LB best ~0.92× full F1 @ peak ~2.5k (h2048→f1024)
Peak resources (novelty@512) decode KV ~72 MB, peak VRAM ~8.3 GB flat 4k→40k
Transfer H1 holds on Qwen2.5 / Llama-3.2; Gemma-4 hybrid novelty@512 9/9

Default path: prefill_auto(..., mode="stream", discovery="novelty") — see USAGE.md.

What we do not claim

General long-context SOTA, full RULER/LongBench leaderboards, production int8 kernels, or that surface novelty is universal “importance.” Suite is retrieval/needle-class; open long-doc QA is a Pareto, not free lunch at peak~1k. See paper §Limitations.


Goal

Run a small open model (~4B) with much more context than naive inference allows, on consumer hardware, with little or no quality loss vs full key–value (KV) cache on retrieval-critical tasks.

Formally:

Maximize (L_\varepsilon) s.t. quality ≥ ((1-\varepsilon)\times) full-KV on suite (\mathcal{S}), under ≤24 GB and usable speed.

  • ε → 0 on retrieval-critical tasks (exact facts).
  • Theory + falsification first — not “stack known KV tricks.”

Hardware & model

GPU NVIDIA RTX 3090 24 GB (Windows WDDM)
System RAM 32 GB
Primary model Qwen/Qwen3-4B-Instruct-2507 — dense full-attention GQA
Transfer (hybrid) google/gemma-4-E4B-it — full layers compress; novelty stream@512 multi-seed ok
Avoid (for classic KV work) Qwen3.5-4B hybrid linear+full — different game

Workstation policy: long (L) uses streaming (peak cache ~ budget+chunk). Full 40k prefill can thrash WDDM; prefer novelty stream for long jobs.


Experiments

Script Purpose
experiments/novelty_detect.py Sticky surface-novelty stream discovery (default)
experiments/bench_external_slice.py Offline / LongBench slice; posthoc UB + query_hold Pareto
experiments/bench_novelty_stress.py code/nl/prose/adv/multi3/hop2/hop3 multi-seed stress
experiments/bench_novelty_longL.py Long-(L) multi-seed novelty vs valley
experiments/bench_systems_resources.py Peak VRAM / prefill time / decode KV table
experiments/bench_paper_rigor.py Multi-seed H1 + scorer tax
experiments/bench_h1_oracle.py H1 kill (oracle / anti-oracle spans)
experiments/compress_adaptive.py prefill_auto (posthoc/stream, discovery=novelty|attn|query_hold)
experiments/plot_paper_figures.py Regenerates papers/figures/fig1_story.*
papers/build_pdf.ps1 Builds papers/main.pdf from main.tex

Paper reproduction (core)

python experiments\bench_paper_rigor.py --seeds 0,1,2,3,4 --ctx 4096
python experiments\bench_capsules.py --novelty --oracle-online --skip-capsules --budgets 512
python experiments\bench_novelty_longL.py --ctx 16384,24576,32768,40960 --arms novelty --budgets 512
python experiments\bench_external_slice.py --source longbench --n 60 --arms full,posthoc --budgets 512,1024,2048
python experiments\plot_paper_figures.py

Outputs: results/*.csv + *.json (gitignored). Narrative: results/FINDINGS.md.


Status

Core arc is measured and written up: mechanism → discovery gap → sticky novelty → long-(L) + stresses → public LongBench decomposition (posthoc UB + query_hold Pareto).

This is an experimental alpha API intended for research and evaluation. It is not yet a production serving backend. Interfaces and measured operating points may change as integration work expands.


Roadmap

The project is moving from a reproducible research prototype toward an integration-ready long-context inference library. Unchecked items are planned work, not claims about current capabilities.

Near term

  • Validate wheel and source-distribution installation in clean environments
  • Publish the package to PyPI after TestPyPI verification
  • Expand unit tests and CPU-compatible public-API smoke tests
  • Stabilize the compression-policy interface and runnable examples
  • Add lightweight reproducibility checks to CI

Integration work

  • Prototype integration with a vLLM-compatible KV-cache or attention extension point
  • Investigate an SGLang integration path
  • Add real quantized KV storage and kernel support
  • Extend evaluation across additional models, context lengths, and public datasets

Longer term

  • Add scheduled GPU benchmarking with regression tracking
  • Evaluate batching, concurrency, and production-serving constraints
  • Prepare upstream draft PRs once interfaces and benchmarks are sufficiently mature

Priorities may change as benchmark evidence and upstream interfaces evolve. Contributions and reproducible issue reports are welcome.


Docs

File Content
papers/main.pdf Readable preprint (start here)
papers/PAPER_DRAFT.md Markdown twin of the preprint
papers/figures/fig1_story.png H1 / discovery / long-(L) / peak-cache figure
USAGE.md prefill_auto + length guide
results/FINDINGS.md Full experimental tables / verdicts

Related work is crowded (eviction + KV quant). Success here is raising (L) at ε≈0 with honest multi-seed claims and a clear discovery diagnosis—not renaming SnapKV.


Repo layout

nearlossless-context/
  experiments/     # benches + novelty + adaptive API
  papers/          # main.tex / main.pdf / figures
  results/         # FINDINGS.md (+ local CSVs gitignored)
  USAGE.md
  requirements.txt

GitHub: nilsperssonsuorra/nearlossless-context


License

The software in this repository is licensed under the Apache License 2.0. The paper and figures are copyright © 2026 Nils Persson Suorra and licensed under CC BY 4.0. Models, datasets, and other third-party materials remain subject to their respective licenses.

Metadata

Release files for nearlossless-context 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nearlossless-context 0.2.0
File Size Uploaded
nearlossless_context-0.2.0.tar.gz 129.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nearlossless-context 0.2.0
File Interpreter ABI Platform
nearlossless_context-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 295.5 kB

Release files / nearlossless_context-0.2.0.tar.gz

Download URL nearlossless_context-0.2.0.tar.gz
Size 129.1 kB
Tags Source
SHA-256 checksum
How to use checksums
af71afd65950e67d6d168ec1ec67242fbe279c8aefc8966fad82ef4b7e90eaaf
BLAKE2b-256 checksum
How to use checksums
d06ed4a5986bf1ed687a3bc21d74c740040cc73797dcecdefdab41097e5a074c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.

Transparency log

Release files / nearlossless_context-0.2.0-py3-none-any.whl

Download URL nearlossless_context-0.2.0-py3-none-any.whl
Size 166.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2d1b33b39062f42cbb5a9798430e033022903306f6476c90ff9a822b11b4d5e0
BLAKE2b-256 checksum
How to use checksums
ed0d38d9d4b6773faf3b853de09bdb8b8e70d31be69e22ad75a1c55013a4395d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 13, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page