Tutorial 16: Celery + Redis untuk Antrian Tugas ML
Daftar Isi
Pendahuluan
Inferensi machine learning dapat berkisar dari milidetik untuk model scikit-learn sederhana hingga bermenit-menit untuk pipeline deep learning kompleks yang melibatkan pemrosesan gambar, ekstraksi fitur, dan prediksi ensemble. Ketika inferensi membutuhkan lebih dari beberapa ratus milidetik, menanganinya secara sinkron dalam permintaan web menciptakan pengalaman pengguna yang buruk dan berisiko timeout.
Antrian tugas (task queue) menyelesaikan masalah ini dengan memindahkan pekerjaan yang memakan waktu lama ke worker latar belakang. Klien mengirimkan tugas, menerima ID segera, dan melakukan polling untuk hasil kemudian. Pola ini memungkinkan API Anda tetap responsif, mendukung penskalaan horizontal untuk beban kerja yang intensif komputasi, dan menyediakan logika retry bawaan untuk tugas yang gagal.
Celery adalah antrian tugas terdistribusi yang paling banyak digunakan untuk Python, dan Redis adalah message broker yang paling populer untuknya. Bersama-sama, mereka membentuk fondasi yang teruji untuk inferensi ML asinkron, pemrosesan batch, pekerjaan pelatihan model, dan orkestrasi pipeline data.
Tutorial ini memandu Anda melalui pembangunan sistem inferensi ML asinkron lengkap dengan Celery, Redis, dan FastAPI — dari pengaturan dasar hingga deployment siap produksi.
Prasyarat
- Python 3.9 atau lebih tinggi
- Server Redis (lokal atau Docker)
- Pemahaman dasar REST API dan pemrograman asinkron
- Instal paket yang diperlukan:
pip install celery[redis] redis fastapi uvicorn scikit-learn joblib numpy pandas flower pydantic
Jalankan Redis dengan Docker:
docker run -d --name redis -p 6379:6379 redis:7-alpine
Memahami Antrian Tugas untuk ML
Gambaran Arsitektur
Arsitektur Celery terdiri dari tiga komponen utama:
Producer (Klien): Aplikasi web Anda (misalnya FastAPI) yang mengirimkan tugas. Ia mengirim pesan tugas ke broker dan kembali segera, memberikan pemanggil ID tugas untuk pengambilan hasil nanti. Broker (Redis): Antrian pesan yang menyimpan tugas sampai worker mengambilnya. Redis berperan ganda sebagai broker (antrian tugas) dan result backend (tempat hasil tugas yang selesai disimpan). Worker: Proses terpisah (atau sekumpulan proses) yang mengkonsumsi tugas dari broker, mengeksekusinya, dan menyimpan hasilnya. Untuk ML, setiap worker memuat model ke memori dan memproses permintaan inferensi.Klien (FastAPI) --> Redis Broker --> Worker 1 (Model ML)
--> Worker 2 (Model ML)
--> Worker 3 (Model ML)
|
Redis Result Backend
|
Klien polling untuk hasil
Kapan Menggunakan Antrian Tugas untuk ML
| Kasus Penggunaan | API Sinkron | Antrian Tugas |
|-------------------|-------------|---------------|
| Model sederhana, inferensi < 100ms | Lebih baik | Berlebihan |
| Pipeline kompleks, inferensi 1-30 detik | Berisiko (timeout) | Lebih baik |
| Prediksi batch (1000+ item) | Tidak memungkinkan | Diperlukan |
| Inferensi GPU dengan antrian | Tidak praktis | Ideal |
| Memicu pelatihan model | Tidak mungkin | Diperlukan |
Menyiapkan Celery dengan Redis
Struktur Proyek
proyek-ml-celery/
celeryapp.py # Konfigurasi aplikasi Celery
tasks.py # Definisi tugas