Menurunkan latensi inference sampai memenuhi SLO: menetapkan dan mengukur p50/p95/p99, optimisasi model dengan ONNX dan TensorRT, caching hasil prediksi, serta urutan tuning yang berbasis data

Setelah episode 22 menekan biaya, kita berurusan dengan sisi lain dari keseimbangan: kecepatan. Model yang akurat dan murah tetapi lambat tidak akan dipakai — pengguna pergi sebelum jawaban tiba, dan SLO bisnis dilanggar. Latency adalah harga tiket untuk masuk ke produksi.
Mengapa latency tuning penting? Karena latensi yang buruk tidak selalu terlihat di p50 — ia meledak di p99: pengguna yang paling tidak beruntung, yang akhirnya paling vokal. Episode ini membahas menetapkan latency SLO, mengukurnya dengan benar, mengoptimalkan model, dan memakai caching — semuanya dengan pendekatan berbasis data, bukan intuisi.
Sebelum tuning, tentukan apa arti "cukup cepat" — dalam bentuk yang terukur:
SLO inference: p95 < 300ms (95% request selesai di bawah 300ms)
p99 < 600ms
error rate < 0.5%SLO yang baik memecah budget latensi ke setiap komponen — karena optimasi tidak mungkin dilakukan di "seluruh sistem" sekaligus:
request masuk → auth (2ms) → feature lookup (15ms) → preprocess (8ms)
→ inference (90ms) → postprocess (3ms) → total ~118msDengan breakdown ini, kalian tahu persis di mana bottleneck berada — dan di mana optimasi memberi dampak terbesar.
Ukur dengan load test yang mewakili traffic nyata, bukan permintaan tunggal di lokal. k6 adalah alat yang sederhana dan banyak dipakai:
import http from "k6/http";
export const options = {
vus: 20,
duration: "30s",
};
export default function () {
http.post(
"http://churn-svc:8080/predict",
JSON.stringify({ age: 45, charges: 89.9 }),
{ headers: { "Content-Type": "application/json" } },
);
}Ingat: ukur di environment yang mirip produksi — hasil di mesin lokal hampir selalu menipu.
Lapisan optimasi, dari yang paling umum:
import torch.onnx
torch.onnx.export(
model, dummy_input, "churn.onnx",
opset_version=17,
dynamic_axes={"input": {0: "batch"}},
)Banyak request itu berulang — query yang sama, pengguna yang sama. Cache hasil prediksi menghilangkan kerja inference yang seharusnya tidak perlu diulang.
redis-cli SETEX "pred:age45:charges89" 3600 '{"churn_prob":0.83}'Cache paling efektif ketika: input berulang tinggi, hasil tidak berubah sering, dan toleran terhadap sedikit basi. Fitur yang diambil dari online store (episode 14) juga memakai cache yang sama. Jangan lupa: cache harus di-invalidasi saat model baru dipromosikan.
Untuk LLM, ada dua teknik yang menonjol:
Dua teknik pertama sudah didukung bawaan oleh serving framework modern — cukup diaktifkan dan diukur.
Optimasi latency adalah iterasi berbasis data:
Note
Optimasi latency adalah iterasi berbasis data, bukan intuisi. Selalu ukur sebelum dan sesudah; jika SLO sudah tercapai di p99, berhentilah — optimasi lebih lanjut menambah kompleksitas tanpa nilai, dan sering berkonflik dengan cost (episode 22).
Pada episode 23 ini, kalian telah men-tuning latensi inference.
Inti yang harus dibawa pulang:
Di episode 24 selanjutnya kita akan membahas multi-model & multi-cloud — merancang serving platform multi-tenant, model router, dan strategi menjalankan model di banyak cloud. Sampai jumpa di episode 24!