Model optimization — quantization
এই পাঠে যা শিখবেন
- Quantization — types, trade-offs, calibration
- Pruning ও knowledge distillation
- ONNX export + runtime optimization
- LLM quantization (GPTQ, AWQ, GGUF) overview
১ · কেন optimize
Production deployment-এ:
- Latency: 100ms model → 30ms quantized — UX win.
- Cost: GPU memory smaller → fewer GPUs needed.
- Edge: mobile-এ 50 MB max — quantization essential.
- Energy: battery, server cooling.
২ · Quantization types
- FP32 → FP16: half precision, ~2× speedup, virtually no accuracy loss. Default for modern GPUs.
- FP32 → BF16: brain float, similar to FP16 but better range. A100/H100 native.
- FP32 → INT8: 4× memory + speed; calibration needed; accuracy drop 0.1-2%.
- FP32 → INT4: 8× memory; accuracy drop measurable; LLM-popular.
৩ · Quantization-aware training (QAT) vs Post-training (PTQ)
- PTQ: trained model directly quantize. Calibration data দিয়ে scale/zero-point compute. Easy, but accuracy drop sometimes.
- QAT: training-time fake quantization simulate. More work, better accuracy.
৪ · PyTorch dynamic quantization example
import torch
import torch.quantization
# Original FP32 model
model_fp32 = torch.load("model.pt").eval()
# 1. Dynamic quantization — easiest
# Quantize Linear/LSTM layers; activations dynamic
model_int8 = torch.quantization.quantize_dynamic(
model_fp32,
{torch.nn.Linear, torch.nn.LSTM},
dtype=torch.qint8,
)
# Save smaller model
torch.save(model_int8.state_dict(), "model_int8.pt")
# Compare sizes
import os
fp32_size = os.path.getsize("model.pt") / 1024 / 1024
int8_size = os.path.getsize("model_int8.pt") / 1024 / 1024
print(f"FP32: {fp32_size:.1f} MB; INT8: {int8_size:.1f} MB ({fp32_size/int8_size:.1f}× smaller)")
# 2. Verify accuracy on validation set
import torch.utils.benchmark as benchmark
sample = torch.randn(1, 768)
t_fp32 = benchmark.Timer(stmt="m(x)", globals={"m": model_fp32, "x": sample}).timeit(100)
t_int8 = benchmark.Timer(stmt="m(x)", globals={"m": model_int8, "x": sample}).timeit(100)
print(f"FP32: {t_fp32.mean*1000:.2f}ms; INT8: {t_int8.mean*1000:.2f}ms")
৫ · Pruning
Many neural network weights ~zero — removing them no accuracy loss. Sparsity 70-90%-এ অনেক model-এ acceptable.
- Magnitude pruning: smallest absolute value weights remove.
- Structured pruning: entire neuron/channel remove — hardware-friendly.
- Lottery ticket hypothesis: small sub-network exists at init that trains as well.
৬ · Knowledge distillation
Large "teacher" model trained. Small "student" trained to match teacher's output (soft labels). DistilBERT — BERT-এর 40% size, 60% faster, 97% accuracy retained.
৭ · ONNX runtime optimization
PyTorch/TF model → ONNX → ONNX Runtime. Cross-platform, optimized kernels, often 2-3× speedup.
import torch
import onnxruntime as ort
import numpy as np
# Export PyTorch → ONNX
sample_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model,
sample_input,
"model.onnx",
input_names=["input"],
output_names=["output"],
dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}},
opset_version=17,
)
# Inference with ONNX Runtime
session = ort.InferenceSession(
"model.onnx",
providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
)
out = session.run(None, {"input": sample_input.numpy()})
# INT8 quantize ONNX model
from onnxruntime.quantization import quantize_dynamic, QuantType
quantize_dynamic(
"model.onnx",
"model_int8.onnx",
weight_type=QuantType.QInt8,
)
৮ · LLM quantization
- GPTQ: post-training INT4 — minimal accuracy loss, popular for LLaMA/Mistral.
- AWQ: Activation-aware Weight Quantization — better than GPTQ usually.
- GGUF (formerly GGML): CPU-optimized, llama.cpp ecosystem. 4-bit-এ phone-এ চলে।
- BitsAndBytes: easy 8-bit/4-bit loading via Hugging Face Transformers.
LLaMA-7B FP16 = 14 GB; INT4 GPTQ = 4 GB. Single GPU fit possible.
ভাবনার প্রশ্ন
প্র ০১"INT8 calibration data কী, কতটুকু লাগে?"
INT8 quantization-এ activation distribution-এর scale/zero-point compute করতে representative data দরকার।
Calibration purpose:
- Float-এর range [min, max] discover.
- INT8 [-128, 127] map করার scale calculate.
- Per-layer or per-channel.
How much data:
- Typical: ১০০-১০০০ samples enough.
- More — diminishing returns.
- Quality matter more than quantity — distribution-representative.
Strategies:
- MinMax: simplest — observed min/max use.
- Entropy/KL: minimize information loss; better accuracy.
- Percentile: ignore outliers (e.g., 99.99 percentile).
BD context — Bangla NLP:
- Bangla text variation high; cover formal + informal + dialect.
- Calibration set 500 sample diverse texts.
Pitfall:
- Calibration on training data — production drift mismatch.
- Better: real production sample (recent week).
মূল উপলব্ধি: Calibration accuracy-quantized model-এর key. Production-representative data; few hundred sample enough; quality matter most.
প্র ০২"Mobile (Bangla keyboard) — কোন quantization?"
On-device deployment unique constraints.
Constraints:
- App size — Bangla keyboard 30 MB target.
- RAM — budget Android 2-4 GB; model 50 MB max.
- Inference speed — type during keystroke, < 50ms required.
- Battery — heavy compute drains.
Approach:
- Distill large LM → small student.
- INT8 quantize via TF Lite.
- Model size 5-15 MB target.
- Latency 10-30ms typical.
Tools:
- TF Lite — Android first-class.
- TF Lite GPU delegate — newer phones GPU/NPU acceleration.
- ONNX Runtime mobile — alternative.
- MediaPipe — Google's prebuilt blocks.
Bangla-specific:
- Tokenization — Bangla ZWJ/ZWNJ tricky on small models.
- Character-level often better than subword for low-resource.
- Embedding sharing — input/output tied.
Update strategy:
- App store update slow; over-the-air model update via API.
- Fallback to bundled if download fails.
মূল উপলব্ধি: Mobile = aggressive optimization mandatory. Distill + INT8 + TF Lite. Bangla-specific tokenization care.
প্র ০৩"Pruning vs distillation — কোনটা কখন?"
দু'টি orthogonal techniques, complementary.
Pruning:
- Existing model weights remove.
- No retraining needed (sometimes fine-tune).
- Architecture intact, sparsity introduced.
- Hardware support varies (NVIDIA Ampere structured sparsity hardware-accelerated).
Distillation:
- New smaller architecture from scratch trained mimic teacher.
- Architecture-level optimization.
- Significant training cost.
- Better accuracy retention generally.
Combine:
- Distill first (architecture compression).
- Then quantize student (precision compression).
- Then prune within layers (sparsity compression).
- Compounded gains.
BD context:
- Distillation training-cost-heavy — only invest if model used long-term.
- Pruning quick win for existing models.
- Quantization easiest first try.
মূল উপলব্ধি: Order: quantize → prune → distill (cost ascending). Stop at sufficient gain.
প্র ০৪"LLM 4-bit quantization production-safe?"
LLM 4-bit (GPTQ/AWQ) — surprising effective, but caveats.
Accuracy retention:
- LLaMA-2 7B FP16 vs 4-bit GPTQ — perplexity ~1% increase.
- Most benchmarks (MMLU, HellaSwag) — within 1-2%.
- "User won't notice" generally.
Failure modes:
- Long-tail rare token — worse accuracy.
- Code generation — sometimes degraded.
- Multi-language — high-resource OK, low-resource (Bangla) more drop.
Production validation:
- Domain-specific eval set.
- Compare FP16 vs 4-bit side-by-side.
- If user-facing — A/B test.
Methods:
- GPTQ — original; calibration data needed.
- AWQ — newer, better; activation-aware.
- GGUF (llama.cpp) — CPU-optimized; phone-deployable.
- BitsAndBytes 4-bit — easy HF integration.
Hardware support:
- 4-bit native: H100, latest GPU.
- Older GPU: 4-bit-from-INT8 emulation; less benefit.
BD context — Bangla LLM:
- Self-hosted Bangla LLM — 4-bit GPU memory enable.
- Validation Bangla benchmark (LLM evaluation Lesson 30) essential.
- Quality drop tolerable for cost saving usually.
মূল উপলব্ধি: LLM 4-bit — generally production-safe with validation. Bangla underspecified low-resource — extra care. Not blanket apply; verify.
অনুশীলন
- Quantize: একটি sample sklearn/PyTorch model FP16/INT8-এ convert. Latency + accuracy compare.
উপরের code use. FP32 vs FP16 vs INT8 — table form.
- ONNX: Same model ONNX export + ONNX Runtime দিয়ে inference. Speedup measure.
torch.onnx.export;onnxruntime.InferenceSession. Generally 1.5-3× faster. - চিন্তা: bKash low-end phone fraud check — optimization stack design করুন।
- Distill heavy server model → small mobile model.
- INT8 quantize via TF Lite.
- Phone GPU delegate enable.
- Server fallback for low-confidence cases.