PHẦN 1: TỐI ƯU HÓA "THẦN TỐC" YOLO – NGHỆ THUẬT ÉP CÂN TỪ FP32 XUỐNG INT8 VÀ GIẢI MÃ CẤU TRÚC ĐỒ THỊ TÍNH TOÁN
Lời mở đầu: Trận chiến sống còn trên thiết bị Edge
Hãy tưởng tượng bạn vừa huấn luyện xong một mô hình YOLOv8 hoặc YOLO11 "vực sâu không đáy" với độ chính xác (mAP) cao ngất ngưởng. Bạn tự hào mang nó đi deploy lên các thiết bị phần cứng giới hạn (Edge Devices) như NVIDIA Jetson, camera thông minh, hay thiết bị nhúng. Nhưng... Bùm! FPS tụt dốc không phanh, thiết bị nóng rực, và độ trễ (latency) tính bằng giây.
Trong thế giới Computer Vision thực chiến, một mô hình chính xác nhưng quá chậm là một mô hình "chết". Để giải quyết bài toán này, Quantization (Lượng tử hóa) xuất hiện như một cứu cánh, giúp tăng tốc inference từ 2x đến 4x. Nhưng làm sao để ép cân mô hình từ dấu phẩy động 32-bit (FP32) xuống số nguyên 8-bit (INT8) mà không biến AI của bạn thành một kẻ "mất trí tuệ"?
Bài viết này sẽ khai phóng toàn bộ tư duy nền tảng về Quantization và mổ xẻ cấu trúc YOLO dưới lăng kính lượng tử hóa.
1. Bản chất của Lượng tử hóa: FP32 vs INT8
Thông thường, các trọng số (weights) và giá trị kích hoạt (activations) của mạng neural được biểu diễn dưới dạng Floating Point 32-bit (FP32), bao gồm các số mũ âm (). Bản chất của Quantize là giảm không gian biểu diễn này xuống số nguyên INT8 (chỉ có 256 mức giá trị từ -128 đến 127).
Mục tiêu tối thượng: Giảm thiểu chi phí tính toán và dung lượng bộ nhớ bằng cách chuyển các phép toán nhân ma trận phức tạp về số nguyên, trong khi vẫn bảo toàn tối đa hiệu suất (accuracy) ban đầu của mô hình.
Sau khi tính toán xong ở miền INT8, mô hình sẽ thực hiện bước Dequantize để đưa giá trị về lại miền FP32 trước khi xuất kết quả.
2. Lựa chọn Vũ khí: Symmetric vs Asymmetric Quantization
Khi đưa các giá trị thực vào "chiếc hộp" 256 ngăn của INT8, chúng ta có hai chiến lược ánh xạ chính:
2.1. Symmetric Quantization (Lượng tử hóa đối xứng)
Trong chiến lược này, điểm số 0 của miền float luôn nằm chính giữa dải giá trị sau khi quantize.
- Đặc điểm: Thường dùng cho Weights (trọng số) vì trọng số của mô hình thường phân bố khá đều quanh giá trị 0.
- Công thức:
Trong đó là hệ số tỷ lệ (Scale - một giá trị float duy nhất).
- Ví dụ trực quan: Nếu dải float là và dải int8 là , ta tính được:
2.2. Asymmetric Quantization (Lượng tử hóa bất đối xứng)
Chiến lược này linh hoạt hơn, không yêu cầu điểm 0 phải nằm ở trung tâm dải.
- Đặc điểm: Thường dùng cho Activations (đầu ra các lớp) vì dữ liệu kích hoạt (như sau lớp ReLU, SiLU) hiếm khi đối xứng qua gốc 0.
- Công thức:
Trong đó là Zero-point (hệ số dịch chuyển/offset) giúp kéo giá trị float 0.0 về đúng vị trí trong dải nguyên.
- Ví dụ trực quan: Dải float là , dải uint8 là :
3. Phẫu thuật cấu trúc YOLO: Các Layer "Khóc thét" khi Quantize
Để quantize một mô hình YOLO phức tạp, ta không thể chỉ quan tâm đến các lớp Convolution. Toàn bộ các nút giao thông (operations) trên đồ thị tính toán đều phải được xử lý đồng bộ.
3.1. Các thành phần cơ bản trong YOLO:
- Conv (Convolution): Lớp trích xuất đặc trưng chính, chiếm ~95% lượng tính toán (FLOPs). Phép nhân tích chập INT8 tại đây mang lại mức tăng tốc FPS lớn nhất.
- Add (Cộng element-wise): Xuất hiện ở các nhánh Skip-connection trong Bottleneck. Nó cộng hai luồng tensor lại với nhau để tránh mất mát gradient.
- Concat (Nối tensor): Gom các đặc trưng từ các tầng khác nhau (ví dụ: tầng nông bắt vật thể nhỏ, tầng sâu bắt vật thể lớn) dọc theo chiều channel.
- Split (Tách tensor): Chia một tensor thành nhiều phần để đi các nhánh khác nhau (đặc trưng của khối C2f/C3k2).
- Upsample (Tăng kích thước không gian): Phóng to feature map (thường dùng chế độ
nearest) để chuẩn bị thực hiện phép Concat trong PAN/FPN Neck.
Vấn đề thực chiến: Tại sao phải Quantize "sạch sành sanh"?
Nếu bạn chỉ quantize lớp Conv mà bỏ quên Add, Concat hay Split, TensorRT sẽ buộc phải chèn các node chuyển đổi trung gian (FP32 <-> INT8) liên tục. Hệ quả là mô hình không những không nhanh hơn mà còn bị tụt giảm độ chính xác nghiêm trọng do lỗi tích lũy scale.
4. Cuộc đối đầu Activation: ReLU vs SiLU trong Lượng tử hóa
YOLOv8 và YOLO11 mặc định sử dụng SiLU (Swish) thay vì ReLU. Dưới góc độ lượng tử hóa, sự thay đổi này mang lại lợi ích khổng lồ:
- Hạn chế "Vùng chết" (Dead Zone): ReLU cắt phăng toàn bộ giá trị âm về 0, tạo ra sự phân bố lệch và lãng phí các mức biểu diễn INT8. SiLU giữ lại một vùng âm nhỏ mượt mà (), giúp phân bố dữ liệu compact (gọn gàng) hơn.
- Mượt mà hơn khi Fine-tune: Đạo hàm của SiLU là liên tục, không bị gãy khúc tại điểm 0 như ReLU. Khi chạy QAT (Quantization-Aware Training), dòng gradient mượt mà này giúp thuật toán tối ưu dễ dàng tinh chỉnh trọng số để bù đắp sai số lượng tử.
5. Tiến hóa kiến trúc: Khối C2f (YOLOv8) vs Khối C3k2 (YOLO11)
Hiểu rõ cấu trúc các block cốt lõi này là chìa khóa vàng để thiết lập các luật đồng bộ (custom rules) khi làm QAT.
Khối C2f (YOLOv8): Split - Process - Concat
C2f đi qua 2 lớp Conv chính (cv1 và cv2). Output của cv1 được Split làm đôi. Một phần đi thẳng tới khối Concat cuối cùng, một phần đi xuyên qua chuỗi các Bottleneck rồi mới Concat.
- Ý nghĩa: Tái sử dụng feature đa mức và tạo dòng luân chuyển gradient cực tốt.
Khối C3k2 (YOLO11): Nâng cấp lõi không gian
C3k2 kế thừa trọn vẹn "khung xương" Split-Concat của C2f nhưng cho phép thay đổi cấu trúc lõi linh hoạt hơn (có thể cấu hình dùng khối C3k hoặc tích hợp thêm Attention như PSABlock).
- Ý nghĩa: Giúp bắt các pattern không gian (spatial features) tốt hơn hẳn, đặc biệt hữu ích cho vật thể nhỏ mà không làm bùng nổ số lượng tham số.
Lời kết Phần 1
Chúng ta đã đi qua phần lý thuyết nền tảng cốt lõi và hiểu được "nội công tâm pháp" cấu trúc mạng YOLO ảnh hưởng thế nào đến bài toán lượng tử hóa. Tuy nhiên, từ lý thuyết đến code chạy thực tế là một khoảng cách lớn.
Hãy cùng đón đọc PHẦN 2: MASTERCLASS QAT PIPELINE – TUYỆT KỸ ĐẠT HIỆU NĂNG INT8 "VÔ HAO TỔN" CHO YOLOv8 / YOLO11, nơi chúng ta sẽ trực tiếp mổ xẻ pipeline 5 bước thực chiến, cách sử dụng triệt để cơ chế Knowledge Distillation và cấu hình Quantizer Consistency để ép TensorRT hoạt động ở công suất tối đa!
All Rights Reserved
