Concurrency
Sesi 10.3 · ~5 menit baca
Masalah Kecepatan
Satu API call butuh 3 sampai 15 detik tergantung model, panjang prompt, dan panjang output. Chain tiga agent butuh 9 sampai 45 detik. Jalanin 100 chain secara sequential, dan kamu nunggu 15 sampai 75 menit. Itu bukan bottleneck kualitas konten, tapi bottleneck waktu kamu. Kamu duduk nganggur, nonton progress bar, padahal bisa review output.
Concurrency menyelesaikan ini. Daripada jalanin satu chain pada satu waktu, kamu jalanin beberapa chain bersamaan. Total waktu processing turun dari N * waktu_per_chain ke kira-kira N / concurrency_limit * waktu_per_chain.
Cara Kerja asyncio
Library asyncio Python memungkinkan kamu jalanin beberapa task secara concurrent tanpa thread atau process. Konsep intinya: waktu satu task nunggu respons API (yang butuh detik-an), task lain bisa mulai API call-nya. Ga ada task yang nge-block yang lain.
Tiga komponen yang bikin ini jalan:
| Komponen | Fungsinya | Analogi |
|---|---|---|
async def |
Mendeklarasikan fungsi yang bisa pause dan resume | Stasiun dapur yang bisa pause di tengah resep sambil nunggu oven |
await |
Pause fungsi sampai hasil datang | "Tunggu oven" tanpa nge-block stasiun lain |
asyncio.gather |
Jalanin beberapa async function secara concurrent | Jalanin 5 stasiun dapur sekaligus, masing-masing masak hidangan beda |
Pola Semaphore
Jalanin 100 API call bersamaan bakal trigger rate limit dan bisa overwhelm sistem kamu. Semaphore membatasi jumlah operasi concurrent.
(maks 10 concurrent)"] B --> C["10 task berjalan"] C --> D["Task selesai"] D --> E["Semaphore lepas slot"] E --> F["Task antrian berikutnya masuk"] F --> C D --> G["Hasil disimpan"] style A fill:#222221,stroke:#c8a882,color:#ede9e3 style B fill:#222221,stroke:#c47a5a,color:#ede9e3 style C fill:#222221,stroke:#6b8f71,color:#ede9e3 style D fill:#222221,stroke:#8a8478,color:#ede9e3 style E fill:#222221,stroke:#c8a882,color:#ede9e3 style F fill:#222221,stroke:#6b8f71,color:#ede9e3 style G fill:#222221,stroke:#8a8478,color:#ede9e3
Nilai semaphore tergantung rate limit API kamu. Kalo provider kamu mengizinkan 60 request per menit dan setiap chain bikin 3 request, semaphore 10 menjaga kamu di sekitar 30 active request, jauh di dalam batas.
Angka Performa Nyata
Diuji dengan chain tiga agent (research, write, edit) yang generate artikel 1.000 kata. Rata-rata waktu chain: 25 detik.
| Ukuran Batch | Sequential | 5 Concurrent | 10 Concurrent | 25 Concurrent |
|---|---|---|---|---|
| 10 artikel | 4 mnt 10d | 1 mnt 15d | 40d | 30d |
| 25 artikel | 10 mnt 25d | 2 mnt 45d | 1 mnt 30d | 40d |
| 50 artikel | 20 mnt 50d | 5 mnt 25d | 2 mnt 55d | 1 mnt 15d |
| 100 artikel | 41 mnt 40d | 10 mnt 50d | 5 mnt 45d | 2 mnt 30d |
Di 25 concurrent chain, 100 artikel selesai di-generate dalam waktu kurang dari 3 menit. Bottleneck berpindah sepenuhnya dari generation ke human review, yang emang seharusnya begitu.
Error Handling di Batch Concurrent
Waktu satu chain gagal di batch concurrent, ga boleh ikut menjatuhkan chain lain. Bungkus setiap chain dalam blok try/except. Waktu gagal, log error-nya dan ID baris yang gagal. Setelah batch selesai, retry cuma baris yang gagal.
async def safe_chain(topic, semaphore):
async with semaphore:
try:
return await run_chain(topic)
except Exception as e:
log_error(topic, e)
return {"id": topic.id, "status": "failed", "error": str(e)}
Setelah batch selesai, filter hasil untuk status "failed" dan jalanin ulang cuma baris itu. Ini memberikan kamu batch lengkap dengan komputasi terbuang yang minimal.
Connection Pooling
Setiap API call membuka koneksi HTTP. Membuka 25 koneksi bersamaan dan menutupnya setelah setiap call itu boros. Connection pooling me-reuse koneksi antar call, mengurangi overhead. Library aiohttp Python menangani ini otomatis dengan session object.
Buat satu session di awal batch. Passing ke semua chain. Tutup waktu batch selesai. Perubahan tunggal ini bisa mengurangi latency per call sebesar 100 sampai 200 milidetik, yang menumpuk di ratusan call.
Concurrency itu throughput multiplier, bukan quality multiplier. Pipeline kamu menghasilkan output yang sama entah kamu jalanin satu chain atau 25. Concurrency cuma berarti kamu nunggu 2 menit bukan 40. Gunakan waktu yang dihemat untuk tahap yang beneran penting: human review.
Bacaan Lanjutan
- Asynchronous LLM API Calls in Python, Unite.AI
- Mastering asyncio.gather for LLM Processing, Instructor
- LLM Parallel Processing in Practice, Dev.to
- Python Asyncio for LLM Concurrency, Newline
Tugas
Tulis (atau minta AI coding assistant kamu tulis) script yang mendemonstrasikan concurrency:
- Buat 10 API call secara sequential. Catat total waktu.
- Buat 10 API call secara concurrent dengan semaphore yang membatasi 5 call bersamaan. Catat total waktu.
- Hitung faktor speedup-nya.
Lalu terapkan ke pipeline kamu yang sesungguhnya: jalanin batch manifest dari Sesi 10.2 dengan concurrent processing. Bandingkan total waktu batch dengan sequential processing. Dokumentasikan masalah apa pun: rate limit error, connection timeout, atau perbedaan kualitas antara output sequential dan concurrent.