Skip to main content

Pare

Quantize any LLM in one line. Switch between GPTQ, AWQ, SmoothQuant, and RTN by changing a config field.


Benchmarks

WikiText-2 perplexity (PPL ↓), A40 46 GB:

Method Llama-3.1-8B Qwen2.5-7B OLMo-3-7B
FP16 baseline 6.24 6.85 9.92
RTN INT8 6.25 (+0.01) 6.85 (+0.00) 9.92 (+0.00)
GPTQ INT4 11.10 (+4.86) ‡ 7.04 (+0.19) 10.21 (+0.29)
AWQ INT4 6.77 (+0.53) 7.13 (+0.28) 10.36 (+0.44)

Zero-shot accuracy — 6-task average (LAMBADA, PIQA, WinoGrande, OpenBookQA, RTE, COPA) ↑:

Method Llama-3.1-8B Qwen2.5-7B OLMo-3-7B
FP16 baseline 73.22 74.13 69.57
RTN INT8 73.00 (−0.22) 74.09 (−0.04) 69.57 (0.00)
GPTQ INT4 71.65 (−1.57) 73.39 (−0.74) 69.42 (−0.15)
AWQ INT4 70.69 (−2.53) 73.93 (−0.20) 69.57 (0.00)

Throughput at BS=1 (tok/s), dequantize-on-the-fly †:

Method Llama-3.1-8B Qwen2.5-7B OLMo-3-7B
FP16 25.8 32.4 25.1
RTN INT8 2.1 2.3 2.3
GPTQ INT4 1.1 1.2 1.2
AWQ INT4 1.1 1.2 1.2

† With the optional Triton kernel: 8.8× faster at BS=1, 2.8× at BS=4.

‡ Llama-3.1-8B is sensitive to column ordering. With act_order=True: PPL improves from 11.10 to 6.54 (+0.30), accuracy moves from 71.65 to 70.05. Qwen2.5-7B and OLMo-3-7B are unaffected (PPL: 7.04 to 7.02, 10.21 to 10.16).


Installation

pip install pare-quant                   # latest
pip install pare-quant==0.1.0           # pin to specific version
pip install "pare-quant[all]"            # + transformers, datasets, Triton kernel

Python ≥ 3.11 · PyTorch ≥ 2.1


Quickstart

from transformers import AutoModelForCausalLM, AutoTokenizer
from pare import quantize, QuantConfig
from pare.calibration.data import load_wikitext2_calibration

model     = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B")
calib     = load_wikitext2_calibration(tokenizer, n_samples=128, seq_len=2048)
# or use your own: a list of tokenized tensors of shape (seq_len,)

# Default is AWQ. Change scheme= to switch methods.
config = QuantConfig(bits=4, scheme="awq", group_size=128)   # ← swap to "gptq", "rtn", "smoothquant"
model  = quantize(model, config, calibration_data=calib, device="cuda")

Save and reload:

from pare import save_quantized, load_quantized

save_quantized(model, "qwen25-awq-int4/")
# [pare] Saved 224 quantized layers to qwen25-awq-int4  (3821 MB)

from transformers import AutoConfig, AutoModelForCausalLM
config = AutoConfig.from_pretrained("Qwen/Qwen2.5-7B")
model  = AutoModelForCausalLM.from_config(config)   # architecture only, no weights
model  = load_quantized(model, "qwen25-awq-int4/")

Methods

scheme= Calibration Quality When to use
"awq" ★ Yes ★★★★ Default. Best robustness across architectures; recommended starting point
"gptq" Yes ★★★★ Matches AWQ on Qwen2.5-7B; architecture-agnostic — works correctly across pre- and post-norm models
"smoothquant" Yes ★★★★ INT8 W+A; closest to FP16 PPL; no INT4
"rtn" No ★★★ No calibration needed; good baseline or for NF4/FP8

★ Default: QuantConfig() uses AWQ. AWQ is the strongest INT4 method on Qwen2.5-7B (−0.20 vs FP16 baseline). GPTQ is architecture-agnostic and is recommended when the target model's architecture is uncertain. On Llama-3.x architectures, act_order=True is recommended; it reduces PPL from 11.10 to 6.54 on Llama-3.1-8B. On Qwen2.5 and OLMo-3 the effect is negligible.

All schemes support bits=4 or bits=8. Use group_size=128 (default) for best INT4 quality.

Additional options

act_order=True — Sort quantization by activation magnitude (improves GPTQ quality on modern architectures):

QuantConfig(bits=4, scheme="gptq", group_size=128, act_order=True)

Mixed-precision — Automatically promote sensitive layers to higher bits:

QuantConfig(bits=4, scheme="awq", sensitive_bits=8, sensitivity_threshold=0.05)
# [pare] 12 of 224 layers promoted to INT8 based on activation-weighted error

NF4 — Normal float 4-bit codebook (QLoRA-compatible base model format):

from pare.core.dtype import QuantDtype
QuantConfig(bits=4, dtype=QuantDtype.NF4, scheme="rtn")

FP8 — 8-bit float for A100/H100:

QuantConfig(bits=8, dtype=QuantDtype.FP8_E4M3, scheme="rtn")

Inference speedup (Triton kernel)

The optional Triton INT4 kernel fuses dequantization into the matmul, avoiding materialising the full FP16 weight matrix. Applies to INT4 schemes (AWQ, GPTQ, RTN). Enable per-layer after quantization:

from pare.layers.linear import QuantizedLinear

for m in model.modules():
    if isinstance(m, QuantizedLinear):
        m.use_kernel = True
Batch size Without kernel With kernel Speedup
1 (decode) 2.09 ms/layer 0.24 ms/layer 8.8×
4 2.18 ms/layer 0.78 ms/layer 2.8×
16 2.66 ms/layer 3.18 ms/layer 0.8×

Requires pip install triton>=3.0.


Hardware

Minimum
Quantizing a 7B model 20 GB VRAM (layerwise strategy peaks at ~2 GB)
RTN / GPTQ / AWQ / NF4 Any CUDA GPU
SmoothQuant W+A Any CUDA GPU
FP8 PyTorch ≥ 2.1 (A100 via software; H100 native)
Triton kernel CUDA GPU + triton ≥ 3.0

References

The methods implemented in Pare are from the following papers:

  • GPTQ — Frantar, Ashkboos, Hoefler, Alistarh. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers. ICLR 2023. arXiv:2210.17323
  • AWQ — Lin et al. AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration. MLSys 2024. arXiv:2306.00978
  • SmoothQuant — Xiao, Lin, Seznec, Wu, Demouth, Han. SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models. ICML 2023. arXiv:2211.10438
  • KIVI — Liu, Yuan, Jin, Zhong, Xu, Braverman, Chen, Hu. KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache. ICML 2024. arXiv:2402.02750
  • NF4 / QLoRA — Dettmers, Pagnoni, Holtzman, Zettlemoyer. QLoRA: Efficient Finetuning of Quantized LLMs. NeurIPS 2023. arXiv:2305.14314

Citation

@misc{moslem2026pare,
  author = {Moslem, Yasmin},
  title  = {Pare: Production-ready quantization for large language models},
  year   = {2026},
  url    = {https://github.com/TinyAdapt/Pare},
}

Metadata

Release files for pare-quant 0.1.3

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

Source distribution (sdist)

Source distribution for pare-quant 0.1.3
File Size Uploaded
pare_quant-0.1.3.tar.gz 110.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pare-quant 0.1.3
File Interpreter ABI Platform
pare_quant-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 177.1 kB

Release files / pare_quant-0.1.3.tar.gz

Download URL pare_quant-0.1.3.tar.gz
Size 110.3 kB
Tags Source
SHA-256 checksum
How to use checksums
263733aee4b7c8fde92996e413651fc817e2dabefe2a9f6b4e6a85e809fe50dc
BLAKE2b-256 checksum
How to use checksums
711a87fc1f1c7ac0c4643f8a117b7ea926e2d8a5365c2dd5582e06838c45ccff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.13

Release files / pare_quant-0.1.3-py3-none-any.whl

Download URL pare_quant-0.1.3-py3-none-any.whl
Size 66.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
16a024d2032e78cecd4776264aff527220f6557d7529f4dda62ace6f0ff2abe1
BLAKE2b-256 checksum
How to use checksums
c0ecc6f8c4651a60c552a1aa293d9a9077097fc43c42e3f129d5043f1ed6ddc0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.13

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

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