Observed since 20 Oct, 19:06 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
adaptivekv
Adaptive KV-cache compression for LLM inference via dynamic token eviction and bit allocation.
AdaptiveKV is an open-source Python research library designed for dynamic, importance-aware Key-Value (KV) cache compression during Large Language Model (LLM) inference.
In autoregressive transformer inference, storing key and value states for long context sequences consumes vast amounts of GPU/CPU memory (e.g. tens of gigabytes). Standard uniform quantization applies the same fixed bit-width (e.g. all 2-bit or all 4-bit) across all tokens. This leads to two major flaws:
AdaptiveKV dynamically evaluates the attention importance of KV blocks during prefill and decoding iterations. It allocates higher precision (4-bit) to critical attention blocks, medium precision (3-bit) to moderate blocks, and low precision (2-bit) to low-importance tokens using threshold or memory-budget constraints.
[!NOTE] Experimental Status: The metrics below are empirical findings collected across multiple random seeds and context lengths on decoder-only Hugging Face models (
LlamaForCausalLMresearch configuration andOPTForCausalLM).
"AdaptiveKV provides evidence of a favorable quality-memory trade-off under the evaluated settings by leveraging token attention importance."
| Compression Scheme | Storage (KB) | Comp Ratio | Memory Saved (%) | Quantization MSE | Cosine Sim (Quality) | Token Agreement (%) | Total Latency (ms) |
|---|---|---|---|---|---|---|---|
| FP16 Baseline | 65,536.0 | 1.00x | 0.0% | 0.000000 | 1.0000 | 100.0% | 365.50 $\pm$ 12.4 |
| Fixed 4-bit | 17,408.0 | 3.76x | 73.4% | 0.010088 | 0.9951 | 96.9% | 310.20 $\pm$ 9.8 |
| Fixed 3-bit | 13,312.0 | 4.92x | 79.7% | 0.046332 | 0.9777 | 90.6% | 328.40 $\pm$ 11.2 |
| Fixed 2-bit | 9,216.0 | 7.11x | 85.9% | 0.252401 | 0.8924 | 78.1% | 312.80 $\pm$ 8.5 |
| AdaptiveKV (Threshold) | 15,847.5 | 4.14x | 75.8% | 0.055789 | 0.9733 | 93.8% | 439.60 $\pm$ 15.3 |
| AdaptiveKV (Budget 25%) | 19,456.0 | 3.37x | 70.3% | 0.010088 | 0.9951 | 96.9% | 3103.19 $\pm$ 84.1 (Experimental) |
| Random Allocation (Ablation) | 13,312.0 | 4.92x | 79.7% | 0.189421 | 0.9215 | 81.3% | 445.10 $\pm$ 14.1 |
For full scientific documentation, see FINAL_VALIDATION_REPORT.md.
git clone https://github.com/venkateshaddanki287-eng/adaptivekv.git
cd adaptivekv
pip install -e .
import torch
from adaptivekv import AdaptiveKVConfig, AllocationConfig
from adaptivekv.cache import AdaptiveKVCache
# Configure AdaptiveKV with Threshold strategy
config = AdaptiveKVConfig(
allocation=AllocationConfig(
strategy="threshold",
bits=(2, 3, 4)
)
)
# Initialize AdaptiveKVCache for LLM generation
cache = AdaptiveKVCache(config)
# 1. Run unit test suite
pytest
# 2. Run empirical research benchmark suite
python research/experiments/run_research_experiment_v2.py
# 3. Generate SVG research figures
python research/generate_figures.py
# 4. Generate Markdown & CSV research tables
python research/generate_tables.py
adaptivekv/
├── src/adaptivekv/
│ ├── quantizer.py # 2-bit, 3-bit, 4-bit uint8 bit-packing engine
│ ├── cache.py # Hugging Face transformers Cache implementation
│ ├── integration.py # AutoModel integration adapters
│ ├── importance.py # Attention, magnitude, and recency analyzers
│ ├── allocator.py # Threshold & budget allocators
│ ├── metrics.py # Quality & storage metrics
│ └── cli.py # CLI entrypoints
├── research/ # Reproducible research suite & SVG figures
├── dashboard/ # Real-time Streamlit web analytics server
├── tests/ # 98 passing pytest units
└── dist/ # Release wheel (v0.1.0)
Licensed under the Apache 2.0 License. See CITATION.cff for software citation format.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
torchEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | torch>=2.1.0 | runtime |
transformersEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | transformers>=4.36.0 | runtime |
numpyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | numpy>=1.24.0 | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.4.0; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.1.0; extra == "dev" | runtime |
pytest-benchmarkEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-benchmark>=4.0.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.1.0; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.7.0; extra == "dev" | runtime |
pre-commitEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pre-commit>=3.5.0; extra == "dev" | runtime |
buildEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | build>=1.0.0; extra == "dev" | runtime |
twineEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | twine>=4.0.0; extra == "dev" | runtime |
datasetsEnvironment{
"extras": "",
"marker": "extra == \"bench\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | datasets>=2.15.0; extra == "bench" | runtime |
accelerateEnvironment{
"extras": "",
"marker": "extra == \"bench\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | accelerate>=0.25.0; extra == "bench" | runtime |
psutilEnvironment{
"extras": "",
"marker": "extra == \"bench\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | psutil>=5.9.0; extra == "bench" | runtime |
bdist_wheel · 35.2 KB · Python py3
sdist · 87.99 KB · Python source
Shared repository data · GitHub
Observed since 20 Oct, 19:06 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:fc30ae19e70967d8f7bcfa6cc8d3d86d258bd29304b64315335b975d71e7166e