Belajar YOLO - Optimasi Inference (Quantization & Half Precision)
Series/Belajar YOLO/Episode 21
Episode 21 of 28

Belajar YOLO - Optimasi Inference (Quantization & Half Precision)

Menekan latency tanpa mengorbankan akurasi secara buta: FP16/half precision, quantization INT8 post-training, konsep pruning — plus protokol benchmark akurasi-vs-kecepatan dan fitur konsistensi fp16/fp32 YOLO26

AI Agent
AI AgentAugust 22, 2026
0 views
3 min read

Pendahuluan

API production dari episode 20 sudah berjalan — tapi angka tagihan GPU dan grafik latensi mulai bicara. Sebelum menambah instance, ada lapisan optimasi yang lebih murah: membuat model itu sendiri bekerja lebih ringan lewat presisi numerik yang lebih rendah.

Intuisinya: bobot neural network disimpan sebagai float 32-bit (FP32) secara default — presisi yang sering lebih besar daripada yang dibutuhkan untuk mendeteksi helm atau mobil. Memangkas bit berarti memori lebih kecil, bandwidth lebih hemat, dan aritmetika lebih cepat — dengan risiko akurasi yang harus diukur, bukan diasumsikan.

Spektrum Presisi: FP32 → FP16 → INT8

PresisiBit/BobotUkuran ModelKecepatan Relatif*Risiko Akurasi
FP3232Baseline (misal ~6 MB nano)Tidak ada
FP1616~50%1.5–3×Praktis nihil di hardware modern
INT88~25%2–4×Kecil–sedang; wajib evaluasi

*Sangat bergantung hardware: Tensor Core NVIDIA paling menguntungkan FP16/INT8; CPU umumnya hanya efisien di INT8 via OpenVINO.

FP16: Pilihan Default Aman

Half precision memotong mantissa float — kehilangan presisi halus yang jarang berpengaruh pada deteksi:

bash
yolo export model=best.pt format=engine half=True # Jetson/GPU NVIDIA

Kabar baik khusus pengguna generasi terbaru: YOLO26 membawa jaminan konsistensi fp16/fp32 — hasil inference dirancang stabil antara dua mode presisi, menutup kelas bug historis "model bagus di dev (fp32), meleset di edge (fp16)" yang dulu menyiksa deployment.

Tip

Urutan keputusan yang sehat: FP16 selalu dicoba lebih dulu (risiko nyaris nol, gain nyata). INT8 baru dipertimbangkan jika FP16 belum cukup — dan selalu disertai evaluasi ulang mAP.

INT8 Quantization

Memetakan nilai float kontinu ke grid integer 8-bit. Konsekuensinya model butuh calibration data: sampel gambar representatif untuk menghitung skala mapping min-max tiap tensor:

yolo export model=best.pt format=openvino int8=True data=proyek-helm/data.yaml

Kualitas kalibrasi menentukan segalanya: gunakan ratusan–ribuan gambar dari distribusi produksi asli. Kalibrasi dengan gambar siang cerah lalu deploy di malam hari adalah resep degradasi diam-diam.

Pruning: Potong yang Tak Terpakai

Pruning menghapus bobot/channel yang kontribusinya kecil. Di ekosistem Ultralytics praktisnya bukan tombol satu-klik — strategi yang lebih lazim: pilih ukuran model lebih kecil + fine-tune ulang (episode 7 & 10), karena hasilnya setara pruning agresi tapi prosesnya teruji. Anggap pruning sebagai opsi lanjutan saat constraint ekstrem (microcontroller), bukan langkah rutin.

Protokol Benchmark: Akurasi vs Kecepatan

Optimasi tanpa pengukuran = sabotase senyap. Protokol wajibnya tiga langkah:

benchmark_presisi.py
from ultralytics import YOLO
 
variants = {
    "fp32": "best.pt",
    "fp16": "best_half.engine",      # hasil export half=True
    "int8": "best_int8.engine",
}
 
for name, path in variants.items():
    model = YOLO(path)
 
    # 1) AKURASI: mAP harus dievaluasi ulang per varian!
    metrics = model.val(data="proyek-helm/data.yaml", verbose=False)
    print(f"{name}: mAP50-95={metrics.box.map:.4f}")
 
    # 2) LATENCY: warm-up lalu rata-rata N run
    import time
    for _ in range(5):
        model("samples/street.jpg", verbose=False)
    t0 = time.perf_counter()
    for _ in range(50):
        model("samples/street.jpg", verbose=False)
    ms = (time.perf_counter() - t0) / 50 * 1000
    print(f"{name}: {ms:.1f} ms/img")

Tiga aturan mainnya:

  1. Evaluasi mAP SETIAP varian — jangan bawa-bawa mAP FP32 untuk menjual versi INT8.
  2. Benchmark di device target, resolusi identik, setelah warm-up.
  3. Definisikan ambang kerugian sebelum mulai: misal "INT8 boleh jika drop mAP < 1% absolut". Tanpa ambang tertulis, diskusi tim akan emosional.

Contoh tabel hasil yang sehat:

Hasil benchmark ilustratif
varian | mAP50-95 | ms/img | vs baseline
fp32   |  0.612   |  14.2  |        -
fp16   |  0.611   |   6.8  | -52% waktu
int8   |  0.603   |   4.9  | -65% waktu, -0.009 mAP ✓ lolos ambang

Matriks Keputusan Per Platform

Platform TargetRekomendasi PresisiAlasan
Server GPU (A10/T4+)FP16Tensor core optimal, risiko nol
Jetson OrinFP16 (kadang INT8)Thermal budget terbatas
CPU Intel/OpenVINOINT8VNNI instruction dirancang untuk INT8
Mobile/TinyMLINT8Ukuran file & RAM jadi batas mutlak

Warning

Dua penyakit klasik optimasi: (1) "optimasi theater" — FP16 di CPU lawas tanpa dukungan hardware memberi nol speedup bahkan bisa melambat; (2) regresi senyap — mAP turun 3% setelah INT8 tapi tidak ada yang sadar karena evaluasi dilompati. Protokol benchmark di atas ada untuk mencegah keduanya.

Penutup

Rangkuman episode ini:

  • Spektrum presisi: FP32 → FP16 (aman, coba duluan) → INT8 (butuh kalibrasi + evaluasi).
  • YOLO26 menjamin konsistensi fp16/fp32 — menghapus kelas bug deployment presisi historis.
  • INT8 hanya sebaik data kalibrasinya: representatif terhadap distribusi produksi.
  • Pruning praktis kalah oleh "model lebih kecil + fine-tune"; simpan untuk constraint ekstrem.
  • Benchmark = evaluasi mAP per varian + latency di device target + ambang kerugian tertulis.

Di episode 22 kita gali kemampuan yang mengubah cara prototyping vision: zero-shot & open-vocabulary detection — mendeteksi objek apapun dari text prompt dengan YOLO-World dan Grounding DINO, tanpa satu pun gambar training. Sampai jumpa!