Model Optimization: Quantization và Pruning
Giảm bộ nhớ hoặc chi phí tính toán nhưng luôn đo lại chất lượng và latency trên runtime đích.
Model optimization là một bài toán trade-off. Ít bit hoặc nhiều trọng số bằng 0 có thể giảm tài nguyên trong điều kiện phù hợp, nhưng không tự bảo đảm nhanh hơn trên mọi phần cứng.
Mục tiêu học tập
- Phân biệt quantization và pruning.
- Tính một ví dụ symmetric quantization nhỏ.
- Thiết kế so sánh quality–memory–latency đúng điều kiện.
Dùng ít mức số hơn
Quantization giống làm tròn số vào một tập mức hữu hạn. File có thể nhỏ hơn, nhưng giá trị xấp xỉ khác số gốc. Sai số nhỏ ở mỗi lớp có thể ảnh hưởng đầu ra theo cách khác nhau giữa các model.
Uniform affine quantization ánh xạ số thực qua scale và zero point rồi round/clamp về integer range. Post-training quantization dùng model đã học và có thể cần calibration data; quantization-aware training mô phỏng ảnh hưởng quantization trong quá trình học.
Weight-only, activation quantization, per-tensor và per-channel có trade-off khác nhau. Calibration cần đại diện input hợp lệ và không dùng test để chọn cách lượng tử hóa rồi báo test như độc lập.
Ví dụ affine: , . Với s dương, rounding gần nhất và không clipping, sai số tuyệt đối không vượt s/2.
Outlier có thể làm scale lớn và giảm độ phân giải vùng giá trị thường gặp. Integer representation chỉ đem lại tốc độ nếu runtime có kernel và layout hỗ trợ; thêm dequantize hoặc data movement có thể xóa lợi ích.
Bỏ trọng số hoặc cấu trúc
Pruning bỏ một phần kết nối hoặc một phần mạng. Nếu chỉ ghi số 0 vào bảng nhưng máy vẫn nhân đầy đủ, thời gian chạy có thể không giảm. Cắt bỏ cả cấu trúc phù hợp có cơ hội thay đổi phép tính thực hơn.
Unstructured pruning tạo sparsity ở trọng số riêng lẻ; structured pruning bỏ channel, head hoặc block theo phương pháp. Fine-tuning sau pruning có thể cần để phục hồi chất lượng. Mask trong framework và artifact cuối là hai trạng thái cần phân biệt.
Tài liệu PyTorch minh họa pruning bằng mask và reparameterization. Một layer đã gắn mask chưa tương đương một sparse inference engine; kiểm tra cách export và runtime xử lý nó.
Magnitude là heuristic: trọng số nhỏ không chứng minh đóng góp không đáng kể sau interactions. Khi thay cấu trúc, kiểm tra shapes và các dependency ở residual/normalization. Sparsity pattern như block hoặc N:M cần khớp kernel cụ thể.
So đúng budget retraining và tuning giữa các phương án. Nếu model nhỏ hơn được train lâu hơn, kết luận “pruning tốt hơn” có thể trộn hiệu ứng phương pháp với tài nguyên.
Đo trade-off thay vì chỉ nhìn kích thước
Đo cả thời gian thật và lỗi trên ví dụ mới. Model nhỏ hơn nhưng bỏ sót nhiều trường hợp quan trọng có thể không phù hợp. Các số trong mã là weights tự chọn để hiểu sai số làm tròn.
Cố định hardware, batch, input shape, threading và warm-up. Báo file size khác với peak memory. Giữ bộ quality regression theo subgroup và các trường hợp threshold-sensitive trước khi phát hành artifact tối ưu.
Đánh giá riêng ablation quantization, pruning và kết hợp để tránh gán lợi ích sai nguyên nhân. Không dùng một tỷ lệ compression để suy ra tỷ lệ speedup. Kernel support và precision accumulation thay đổi theo runtime version nên phải xác nhận lại lúc triển khai.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Thử giảm footprint của model trên thiết bị đích.
- Phân tích numerical error và operator support trước export.
Điểm mạnh
Có thể giảm tài nguyên khi precision, sparsity và kernels được phối hợp đúng.
Giới hạn cần nhớ
Có thể giảm chất lượng; compression không bảo đảm latency thấp và cần đánh giá lại theo phần cứng.
Thử trong một project nhỏ
Thêm một outlier 10.0 vào weights và quan sát scale đổi thế nào. Giải thích vì sao sai số của weight nhỏ có thể tăng và vì sao chưa thể suy ra accuracy.
weights = [-0.9, -0.1, 0.2, 0.8]
scale = max(abs(w) for w in weights) / 127
quantized = [max(-127, min(127, round(w/scale))) for w in weights]
restored = [q*scale for q in quantized]
error = max(abs(a-b) for a,b in zip(weights, restored))
assert error <= scale/2 + 1e-12
print({"integers": quantized, "max_rounding_error": error})Symmetric uniform quantization trên bốn weights tự chọn, zero point 0 và range −127…127; không đo speedup hoặc chất lượng model.
