NeuralQuant / README.md
ArGrigorov's picture
Upload README.md with huggingface_hub
ce9d58a verified
|
Raw
History Blame Contribute Delete
6.31 kB
---
language: en
library_name: agiws-neural-quant
license: apache-2.0
tags:
- quantization
- int4
- int8
- fp8
- fp4
- nf4
- bitnet
- qat
- pytorch
---
# AGIWSNeuralQuant
Universal neural network quantization library β€” 53 formats, weights + activations, QAT, residual codebooks, per-head scales.
## What
Quantize ANY PyTorch model (vision encoders, LLMs, TTS, image/video generation) via ONE parameterized `Quantizer`:
- **INT** β€” int2/3/4/6/8, per-tensor/per-channel/per-group/per-head scales, symmetric/asymmetric
- **MX/NV formats** β€” MXFP4/MXFP6/MXFP8 (E8M0 block scale), NVFP4/NVFP6/NVFP8 (FP8 scale), MXINT2/4/6/8
- **FP4/FP6/FP8** β€” E2M1, E3M2/E2M3, E4M3/E5M2 floating-point with LUT-based dequant
- **NF4** β€” QLoRA NormalFloat 4-bit + double quantization
- **GGUF k-quants** β€” q2_k/q3_k/q4_k/q5_k/q6_k/q8_0/q4_0 (super-block layout)
- **BitNet 1.58** β€” ternary {-1,0,+1}, binary {+1,-1}
- **Codebook/VQ** β€” kmeans/fixed codebook, vector quantization, AQLM, residual multi-level codebooks
- **PTQ** β€” GPTQ (Hessian compensation), AWQ (activation-aware), SmoothQuant, LLM.int8 outlier, QuIP (rotation)
- **QAT** β€” learnable latent weights + scale via STE, learnable codebooks, dual-path distillation
- **Pruning** β€” structural (REAP/REAM), unstructured, magnitude-based
- **Activations** β€” ALL formats quantize activations, per-token/per-group/per-channel scale modes
- **per-head** β€” attention-specific scale per head (Q/K/V/O projections)
## Install
```bash
pip install git+https://huggingface.co/agiws/NeuralQuant
```
## Usage
```python
from agiws_neural_quant import quantize_model, save_model, load_model
# Quantize any PyTorch model in-place (53 formats via presets)
quantize_model(model, format="int4") # 4-bit per-group
quantize_model(model, format="mxfp4") # MXFP4 (E8M0 block scale)
quantize_model(model, format="nvfp4") # NVFP4 (FP8 scale, weights+activations)
quantize_model(model, format="ternary") # BitNet 1.58
quantize_model(model, format="codebook",
residual_levels=3, # residual codebooks cascade
learnable=True) # QAT via STE
# per-head for attention projections
quantize_model(model, format="int4",
per_head_modules=["q_proj","k_proj","v_proj","o_proj"],
num_heads=32, head_dim=128)
# Save / load quantized model (preserves all format metadata)
save_model(model, "quantized.pt")
model2 = load_model("quantized.pt")
# QAT training
from agiws_neural_quant import UnifiedQATWrapper, strip_latent
qat = UnifiedQATWrapper(quantized_module)
loss = qat.distillation_loss(x) # MSE(student, teacher.detach())
# ... optimizer.step() ...
strip_latent(quantized_module) # bake to frozen inference
```
## Structure
```
src/agiws_neural_quant/
base.py β€” QuantizedWeight, QuantizedActivation, QuantizedModule (chunked dequant, dual-path, QAT)
quantizer.py β€” unified Quantizer (53 formats as parameter configurations)
presets.py β€” FORMAT_PRESETS dict (53 presets) + get_preset(format, **overrides)
dispatch.py β€” quantize_model(), save_model(), load_model(), walker
ssm_patterns.py β€” SSM/KDA exclusion patterns (Mamba/RWKV/linear-attention aware)
training_unified.py β€” UnifiedQATWrapper, dual_path_loss, strip_latent
training/ste.py β€” STEQuantize, STECodebook (Straight-Through Estimator)
ternary.py β€” ternarize_tensor (BitNet 1.58 primitives)
nf4/ β€” NF4 LUT, quantize/dequantize, double quantization (QLoRA)
fp4/ β€” FP4 E2M1 LUT, pack/unpack, E8M0 LUT
fp6/ β€” FP6 E3M2/E2M3 LUT, quantize/dequantize, pack/unpack
fp8/ β€” FP8 E4M3/E5M2 LUT, quantize/dequantize
kquant/ β€” GGUF k-quants (super-block layout)
converters/ β€” universal file-to-file converter (stream, low memory)
universal.py β€” convert_model(input, output): safetensors/GGUF/.pt <-> .pt/safetensors/GGUF
safetensors_io.py β€” stream read/write safetensors (lazy, low memory)
gguf_reader.py β€” GGUF binary format parser + k-quant decode
hf_nvfp4.py β€” NVFP4 safetensors -> QuantizedWeight
analysis.py β€” layer analysis (per-layer quantization suitability)
cache.py β€” teacher-cache for distillation
extract.py β€” checkpoint extraction (vision encoders, submodules)
tests/ β€” 169 tests (roundtrip, chunked, dual-path, QAT, SSM, residual, per-head, validation, converter)
scripts/ β€” auxiliary scripts
docs/
```
## Principles
- ONE parameterized `Quantizer` β€” all formats are configurations, not separate classes
- Weights AND activations quantized for ALL formats (W8A8, W4A4, NVFP4)
- Chunked dequant for minimal VRAM (adaptive chunk_size at runtime)
- Dual-path: student + teacher QuantizedModule for cross-quantization distillation
- Save/load preserves all format metadata (buffers + meta + quantizer config + dual-path + teacher)
- Supports any nn.Module: Linear, Conv1d/2d/3d, ConvTranspose, Embedding, LayerNorm, Bilinear
- Parameter validation: invalid combinations raise clear errors (not silent fallback)
- SSM-aware: excludes critical projections (q_proj/k_proj/b_proj) from quantization for Mamba/KDA/RWKV
## Converter (file-to-file, low memory)
```python
from agiws_neural_quant import convert_model
# NVFP4 safetensors (GLM-5.2) -> NeuralQuant .pt (preserves quantized layout)
convert_model("glm5.2-nvfp4.safetensors", "glm5.2.pt")
# fp16 safetensors -> NeuralQuant .pt with int4 quantization
convert_model("model.safetensors", "model_int4.pt", quant_format="int4")
# GGUF k-quant -> safetensors (dequantized to fp16)
convert_model("model.gguf", "model_fp16.safetensors", output_format="safetensors")
# NeuralQuant .pt -> safetensors (dequantized)
convert_model("model.pt", "model_out.safetensors", output_format="safetensors")
```
Processes one tensor at a time (peak memory ~2x largest tensor, not the full model).
Supports sharded safetensors (index.json + multiple shards).
## Status
- 53 quantization presets, all validated (roundtrip tested)
- Universal file-to-file converter (safetensors/GGUF/.pt, stream, low memory)
- 169 tests PASS
- Version 0.2.0