Menerapkan Model Machine Learning dengan Docker - Bagian 2



. OTUS Machine Learning: . , -, : « ML» « ».
Di bagian pertama tutorial ini, kami berhasil menyimpan model klasifikasi Anda ke direktori lokal dan menyelesaikan semua pekerjaan pengembangan model yang terkait dengan Notebook Jupyter. Mulai sekarang, fokusnya adalah menerapkan model kami. Untuk menggunakan kembali model untuk prediksi, Anda cukup memuatnya dan memanggil metode predict()seperti biasa di Jupyter Notebook.



Untuk menguji model, di folder yang sama dengan file model.pkl, buat file main.pydengan kode ini:



import pickle
#   ,     
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

#    
with open('./model.pkl', 'rb') as model_pkl:
   knn = pickle.load(model_pkl)

#   (    )
unseen = np.array([[3.2, 1.1, 1.5, 2.1]])
result = knn.predict(unseen)

#    
print('Predicted result for observation ' + str(unseen) + ' is: ' + str(result))


Menggunakan kembali model untuk perkiraan.



Anda dapat memanggil metode prediktor beberapa kali pada pengamatan yang tidak diketahui tanpa memulai ulang proses pelatihan. Namun, ketika Anda menjalankan file py ini di terminal, Anda mungkin mengalami kesalahan seperti ini:



Traceback (most recent call last):
 File "main.py", line 4, in <module>
   from sklearn.neighbors import KNeighborsClassifier
ImportError: No module named sklearn.neighbors


Ini karena paket yang kami gunakan tidak tersedia di lingkungan tempat Anda menjalankan file. Ini berarti bahwa lingkungan yang digunakan untuk mengembangkan model (conda) tidak identik dengan runtime (lingkungan python di luar conda) dan ini dapat dilihat sebagai masalah potensial saat menjalankan kode kita di lingkungan lain. Saya secara khusus ingin Anda melihat kesalahan ini, untuk membantu Anda memahami masalahnya, dan untuk menekankan kembali pentingnya menggunakan container untuk menerapkan kode kami guna menghindari masalah tersebut. Untuk saat ini, Anda cukup menginstal secara manual semua paket yang diperlukan menggunakan perintah "pip install". Kami akan kembali ke sini nanti untuk melakukannya secara otomatis.



Setelah menginstal semua paket dan berhasil menjalankan file, model akan segera mengembalikan pesan berikut:



Predicted result for observation [[3.2 1.1 1.5 2.1]] is: [1]


Seperti yang Anda lihat di sini, kami menggunakan data tidak dikenal yang di-hardcode untuk menguji model. Angka-angka ini masing-masing mewakili panjang sepal, lebarnya, panjang kelopak dan lebarnya. Namun, karena kami ingin mengekspos model kami sebagai layanan, model tersebut harus diekspos sebagai fungsi yang menerima permintaan yang berisi empat parameter ini dan mengembalikan hasil prediksi. Fungsi ini kemudian dapat digunakan untuk server API (backend) atau diterapkan dalam runtime tanpa server seperti Google Cloud Functions . Dalam tutorial ini, kita akan mencoba membangun server API bersama dan meletakkannya di wadah Docker.






Bagaimana cara kerja API?



Mari berbicara tentang cara kerja aplikasi web saat ini. Sebagian besar aplikasi web memiliki dua komponen utama yang mencakup hampir semua fungsionalitas yang dibutuhkan aplikasi: frontend dan backend. Frontend difokuskan untuk melayani antarmuka (halaman web) untuk pengguna, sedangkan server frontend sering menyimpan HTML, CSS, JS, dan file statis lainnya seperti gambar dan suara. Di sisi lain, server backend akan menangani semua logika bisnis yang merespons setiap permintaan yang dikirim dari frontend.





Ilustrasi struktur aplikasi web .



Inilah yang terjadi saat Anda membuka Medium di browser Anda.



  1. HTTP- medium.com. DNS-, , . ., .
  2. * .html, * .css, * .js , - .
  3. Medium . , «clap» () .
  4. (javascript) HTTP- id . URL- , . id XXXXXXX.
  5. (, ) .
  6. .
  7. , .


Tentu saja, ini mungkin bukan proses yang persis sama yang terjadi saat menggunakan aplikasi web Medium, dan sebenarnya akan jauh lebih rumit dari ini, tetapi proses yang disederhanakan ini dapat membantu Anda memahami cara kerja aplikasi web.



Sekarang saya ingin Anda fokus pada panah biru pada gambar di atas. Ini adalah permintaan HTTP (dikirim dari browser) dan tanggapan HTTP (diterima oleh browser atau dikirim ke browser). Komponen yang memproses permintaan dari browser dan mengembalikan respons ke server backend disebut "API".



Di bawah ini adalah definisi API:





(API — application program interface) — , . , API , .

API!



Ada banyak kerangka kerja yang membantu kami membangun API menggunakan Python, termasuk Flask, Django, Pyramid, Falcon, dan Tornado. Keuntungan dan kerugian, serta perbandingan struktur ini, tercantum di sini . Saya akan menggunakan Flask untuk tutorial ini, tetapi teknik dan alur kerjanya tetap sama seperti yang lainnya, dan sebagai alternatif, Anda dapat menggunakan kerangka kerja favorit Anda pada saat ini.



Versi terbaru Flask dapat diinstal melalui pip menggunakan perintah ini:



pip install Flask


Yang perlu Anda lakukan sekarang adalah mengubah kode dari langkah sebelumnya menjadi sebuah fungsi dan mendaftarkan endpoint API untuknya setelah menginisialisasi aplikasi Flask Anda. Secara default, aplikasi Flask berjalan di localhost (127.0.0.1) dan akan mendengarkan permintaan pada port 5000.



import pickle
#   ,     
import numpy as np
import sys
from sklearn.neighbors import KNeighborsClassifier

#  Flask   API
from flask import Flask, request

#      
with open('./model.pkl', 'rb') as model_pkl:
   knn = pickle.load(model_pkl)

#   Flask
app = Flask(__name__)

#    API
@app.route('/predict')
def predict_iris():
   #     
   sl = request.args.get('sl')
   sw = request.args.get('sw')
   pl = request.args.get('pl')
   pw = request.args.get('pw')

#    predict 
#     
   unseen = np.array([[sl, sw, pl, pw]])
   result = knn.predict(unseen)
  #   
   return 'Predicted result for observation ' + str(unseen) + ' is: ' + str(result)
if __name__ == '__main__':
   app.run()


Mewakili model Anda sebagai API



Di terminal, Anda akan melihat yang berikut ini:



* Serving Flask app "main" (lazy loading)
* Environment: production
  WARNING: This is a development server. Do not use it in a production deployment.
  Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)


Buka browser Anda dan masukkan kueri berikut di bilah alamat:



http://localhost:5000/predict?sl=3.2&sw=1.1&pl=1.5&pw=2.1


Jika sesuatu seperti ini muncul di browser Anda, selamat! Anda sekarang mengekspos model pembelajaran mesin Anda sebagai layanan dengan titik akhir API.



Predicted result for observation [['3.2' '1.1' '1.5' '2.1']] is: [1]


Pengujian API dengan Postman



Kami baru-baru ini menggunakan browser kami untuk pengujian API cepat, tetapi ini bukan cara yang sangat efisien. Misalnya, kita tidak dapat menggunakan metode GET, tetapi menggunakan metode POST dengan token otentikasi di header, dan tidak mudah untuk mendapatkan browser untuk mengirim permintaan seperti itu. Dalam pengembangan perangkat lunak, Postman banyak digunakan untuk menguji API dan sepenuhnya gratis untuk penggunaan dasar.





Antarmuka pengguna tukang pos (dari halaman unduh Postman )

Setelah mengunduh dan menginstal Postman, buka alat dan ikuti petunjuk di bawah ini untuk mengirimkan permintaan Anda.





Mengirim permintaan GET dengan Postman



  1. , GET , API GET . , POST .
  2. URL .
  3. . , .
  4. «», API.
  5. .
  6. HTTP-. .


Sekarang setelah Anda mengetahui cara mengekspos model pembelajaran mesin Anda sebagai layanan melalui titik akhir API dan menguji titik akhir tersebut dengan Postma, langkah selanjutnya adalah memasukkan aplikasi Anda ke dalam container dengan Docker, di mana kita akan melihat lebih dekat cara kerja Docker dan bagaimana hal itu dapat membantu kami. menyelesaikan semua masalah ketergantungan yang kami temui sebelumnya.



Bacalah bagian pertama.



All Articles