Mengoptimalkan API dengan service streamer

By | July 14, 2024
296 Views

Service streamer di PyTorch adalah mekanisme yang digunakan untuk mengelola streaming data secara efisien dalam konteks aplikasi machine learning. Konsep ini penting dalam skenario di mana model machine learning harus mengkonsumsi data yang datang secara terus-menerus atau dalam batch besar, seperti dalam analisis video langsung, pemrosesan data sensor real-time, atau aplikasi serupa lainnya. Berikut adalah penjelasan lengkap mengenai service streamer di PyTorch:

1. Pengertian dan Fungsi

Service streamer adalah sebuah layanan atau komponen yang mengelola aliran data (streaming data) dari satu titik ke titik lain dalam pipeline pemrosesan machine learning. Fungsi utamanya adalah untuk memastikan bahwa data yang masuk dapat diproses secara efisien dan tanpa hambatan, dengan meminimalkan latensi dan memastikan throughput yang tinggi.

2. Arsitektur dan Komponen Utama

Service streamer dalam konteks PyTorch biasanya terdiri dari beberapa komponen utama:

  • Data Producer: Komponen ini bertanggung jawab untuk menghasilkan atau mengambil data dari sumbernya, seperti kamera, sensor, atau layanan web.
  • Buffer atau Queue: Buffer berfungsi untuk menyimpan data sementara sebelum diproses lebih lanjut. Ini membantu dalam mengelola lonjakan data dan memastikan aliran data yang stabil.
  • Data Consumer: Komponen ini mengambil data dari buffer dan memprosesnya menggunakan model machine learning yang telah dilatih.

3. Implementasi di PyTorch

Implementasi service streamer di PyTorch sering melibatkan penggunaan DataLoader, yang adalah komponen PyTorch untuk memuat data secara efisien.

Berikut adalah contoh sederhana bagaimana service streamer dapat diimplementasikan di PyTorch. Sebelum menggunakannya dalam produksi, kita perlu menyelesaikan dua masalah berikut:

  1. Hanya satu permintaan yang dilayani pada satu waktu, yang jauh lebih lambat dibandingkan prediksi batch lokal.
  2. Hal ini akan menyebabkan kesalahan CUDA out-of-memory pada GPU ketika terdapat banyak permintaan bersamaan.
See also  PandasGUI: Lupakan excel pakai ini saja untuk bikin pivot!

Sebelum melanjutkan mengenai API, kalian bisa belajar dulu API menggunakan FLASK Membuat API menggunakan Flask. Saya anggap kalian telah paham cara kerja API, kemudian kita akan membuat API yang bertujuan untuk pengenalan object yaitu https://pytorch.org/tutorials/intermediate/flask_rest_api_tutorial.html

Kita bisa panggil menggunakan curl untuk mencari tahu jenis apakah kucing dibawah ini

curl -F "file=@cat.jpg" http://localhost:5005/predict

hasilnya

{"class_id":"n02123045","class_name":"tabby"}

Uji Kehandalan menggunakan tools wrk

Mari kita uji kehandalan server tersebut menggunakan tools wrk . Bagi kalian pengguna mac, bisa menggunakan perintah berikut

brew install wrk

https://formulae.brew.sh/formula/wrk

Mari kita uji saja server nya (predict3) tanpa menggunakan streamer

wrk -c 128 -d 20s --timeout=20s -s "1. raw.jpg" http://127.0.0.1:5000/predict3

hasilnya

Running 20s test @ http://127.0.0.1:5000/predict3
  2 threads and 128 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   165.81ms   15.85ms 304.07ms   96.34%
    Req/Sec   386.78     32.36   444.00     75.88%
  15370 requests in 20.03s, 5.35MB read
  Non-2xx or 3xx responses: 15370
Requests/sec:    767.35
Transfer/sec:    273.52KB

Menggunakan Streamer

Kalian bisa baca https://github.com/ShannonAI/service-streamer/wiki/Vision-Recognition-Service-with-Flask-and-service-streamer menggunakan predict2

wrk -c 128 -d 20s --timeout=20s -s "1. raw.jpg" http://127.0.0.1:5000/predict2

hasilnya

Running 20s test @ http://127.0.0.1:5000/predict2
  2 threads and 128 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   188.86ms   50.85ms 453.74ms   86.82%
    Req/Sec   339.01     79.87   434.00     79.75%
  13527 requests in 20.09s, 4.71MB read
  Non-2xx or 3xx responses: 13527
Requests/sec:    673.45
Transfer/sec:    240.05KB

hemm… nampaknya streamer tidak bekerja dengan baik bila menggunakan CPU

dimana latency nya malah naik dari semula 165.81 ms menjadi 188.86 ms dan request/sec turun dari semula 767.35 menjadi 673.45