Membuat Asynchronous Flask App dengan Gunicorn-Gevent

Salah satu masalah yang pernah saya hadapi ketika mencoba mengaplikasikan model machine learning ke produksi adalah model biasanya memerlukan beberapa waktu untuk melakukan perhitungan dan memberikan hasil.

Misalnya kita punya machine learning API untuk mengklasifikasi citra, dan butuh waktu kira-kira 2 detik untuk menghasilkan kelas yang sesuai (memprediksi), bisa dibayangkan apa yang terjadi jika kita letakkan itu di level produksi dengan 1000 permintaan prediksi perdetiknya! Yang ada server akan lambat sekali, user harus mengantri sangat lama untuk mendapatkan hasil prediksinya.

Asynchronous API

Solusi sederhana yang muncul di saya adalah membuat Asynchronous API. Apa itu? Penjelasan sederhananya bisa merujuk ke halaman stackoverflow ini: Bayangkan kamu sedang memasak di restoran, dan ada dua pesanan datang, yang satu memesan telur yang satu memesan roti.

  • Synchronous: kamu memasak telur, setelah itu kamu memasak roti
  • Asynchronous, single threaded: kamu mulai memasak telur, lalu sambil menunggu matang kamu mulai memasak roti. Ketika keduanya sedang menunggu matang kamu bisa mulai membersihkan dapur, dan keduanya akan matang dalam waktu yang hampir bersamaan.
  • Asynchronous, multithreaded: kamu mempekerjakan satu lagi orang untuk membantu memasak. Sekarang, satu orang bisa fokus memasak telur dan satu yang lain fokus memasak roti. Masalahnya sekarang kamu harus bisa mengkoordinirnya dengan baik agar tidak berebut alat dapur.

Nah, karenanya kita akan mencoba membuat API yang Asynchronous, sehingga proses pengerjaan bisa dilakukan dalam waktu hampir bersamaan. (Penjelasan lain : dari codewala)

Bagaimana cara membuatnya?

Ada banyak cara untuk mengimplementasikan Asynchronous API. Tapi karena saya membuat API menggunakan Python Flask. Salah satu cara yang paling simpel adalah menggunakan  Gunicorn dan Gevent. Pertama-tama instal terlebih dahulu Gunicorn dan Gevent, cara yang sederhana adalah menggunakan pip:

Normalnya jika kita akan menjalankan aplikasi Flask, kita melakukannya cukup dengan menjalankan perintah Python pada umumnya:

Tetapi untuk menjalankannya menggunakan Gunicorn kita akan menjalankan program tersebut dengan perintah yang berbeda, yakni:

myapp adalah nama file program kita, and app adalah flask app variable. Setelah perintah tersebut dijalankan, program akan berjalan di http://localhost:8000 (perhatikan pada perbedaan port program berjalan, jika menggunakan Flask, program akan berjalan pada port 5000, sedangkan jika menggunakan Gunicorn program berjalan pada port 8000).

Tapi ini belum selesai, jika hanya menjalankan dengan perintah di atas, maka program hanya akan berjalan synchronous. Untuk menjalankan secara asynchronous dengan Gunicorn kita tidak perlu mengubah isi dari program, cukup dengan menjalankan perintah berikut ini:

-k adalah opsi untuk menjalankan Gunicorn secara asynchronous, di sana kita akan menggunakan gevent service (ada beberapa services yang bisa digunakan untuk menjalankan secara asynchronous, contoh lainnya adalah eventlet). -w adalah opsi untuk menentukan berapa banyak worker yang akan digunakan untuk menjalankan program tersebut. Pada contoh ini kita menggunakan 5 worker (Penentuan jumlah worker, silakan baca: Workers).

Dan selamat! kita baru saja menjalankan program Flask kita secara asynchronous!

Testing

Untuk menguji API yang telah kita jalankan, yang paling sederhana kita bisa menggunakan apache benchmark. Dengan apache benchmark kita bisa melakukan simulasi pengaksesan ke API kita dengan banyak request secara simultan, perintahnya adalah berikut:

-n menunjukkan banyak request yang akan dikirimkan, dan -c adalah banyaknya concurency, atau request dalam satu waktu. Jika diperhatikan hasilnya akan tampak perbedaan ketika program dijalankan dengan Async dan tanpa Async.

Tapi perintah di atas, hanya untuk menjalankan GET request, artinya untku API machine learning, perinta di atas hanya menguji dalam mengaksesnya tidak untuk memprediksi. Untuk program machine learning, kita bisa melampirkan data “test” untuk mengujinya.

Misalnya API machine learning untuk proses sentimen movie review, kita bisa melampirkan data teks contoh untuk diprediksi. Pertama-tama Kita buat dulu datanya dengan format sesuai API yang telah dibuat (tidak ditunjukkan pada tutorial ini):

Setelah itu, simpan data tersebut pada sebuah file misalnya “tester.txt”. Nah untuk melampirkannya cukup kita tambahka tipe body dan nama file di perintah sebelumnya:

Maka API akan diuji untuk memprediksi data tersebut, dan kita dapat memperhitungkan waktu prosesnya.

Terima kasih 🙂 semoga bermanfaat

About the author

Rian Adam

View all posts

Leave a Reply

Your email address will not be published. Required fields are marked *