نشر نموذج التعلم الآلي باستخدام Docker - الجزء الثاني



. OTUS Machine Learning: . , -, : « ML» « ».
في الجزء الأول من هذا البرنامج التعليمي ، نجحنا في حفظ نموذج التصنيف الخاص بك في دليل محلي وأكملنا جميع أعمال تطوير النموذج المتعلقة بـ Jupyter Notebook. من الآن فصاعدًا ، سيكون التركيز على نشر نموذجنا. لإعادة استخدام النموذج للتنبؤ ، يمكنك ببساطة تحميله واستدعاء الطريقة predict()كما تفعل عادةً في دفتر Jupyter.



لاختبار النموذج ، في نفس المجلد مثل الملف model.pkl، قم بإنشاء ملف main.pyبهذا الرمز:



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))


إعادة استخدام نموذج التنبؤ.



يمكنك استدعاء طريقة التوقع عدة مرات في الملاحظات غير المعروفة دون إعادة بدء عملية التدريب. ومع ذلك ، عند تشغيل ملف py هذا في الجهاز ، فقد تواجه خطأً كالتالي:



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


هذا لأن الحزمة التي نستخدمها غير متوفرة في البيئة التي تقوم بتشغيل الملف فيها. هذا يعني أن البيئة المستخدمة لتطوير النموذج (conda) ليست متطابقة مع وقت التشغيل (بيئة python خارج conda) ويمكن اعتبار ذلك مشكلة محتملة عند تشغيل الكود الخاص بنا في بيئات أخرى. أردت تحديدًا أن ترى هذا الخطأ ، لمساعدتك على فهم المشكلة ، وإعادة التأكيد على أهمية استخدام الحاويات لنشر الكود الخاص بنا لتجنب مثل هذه المشاكل. في الوقت الحالي ، يمكنك ببساطة تثبيت جميع الحزم المطلوبة يدويًا باستخدام الأمر "pip install". سنعود إلى هنا لاحقًا للقيام بذلك تلقائيًا.



بعد تثبيت جميع الحزم وتشغيل الملف بنجاح ، يجب أن يقوم النموذج بإرجاع الرسالة التالية بسرعة:



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


كما ترون هنا ، نستخدم بيانات غير معروفة مضمنة لاختبار النموذج. تمثل هذه الأرقام طول السبال وعرضه وطول البتلة وعرضها على التوالي. ومع ذلك ، نظرًا لأننا نريد تقديم نموذجنا كخدمة ، فيجب الكشف عنه كدالة تقبل الطلبات التي تحتوي على هذه المعلمات الأربعة وتعيد نتيجة التوقع. يمكن بعد ذلك استخدام هذه الوظيفة لخادم واجهة برمجة التطبيقات (الواجهة الخلفية) أو نشرها في وقت تشغيل بدون خادم مثل وظائف Google Cloud . في هذا البرنامج التعليمي ، سنحاول بناء خادم API معًا ووضعه في حاوية Docker.






كيف تعمل API؟



لنتحدث عن كيفية عمل تطبيقات الويب اليوم. تحتوي معظم تطبيقات الويب على مكونين رئيسيين يغطيان جميع الوظائف التي يحتاجها التطبيق تقريبًا: الواجهة الأمامية والخلفية. تركز الواجهة الأمامية على خدمة الواجهة (صفحة الويب) للمستخدم ، بينما يقوم خادم الواجهة الأمامية غالبًا بتخزين ملفات HTML و CSS و JS وغيرها من الملفات الثابتة مثل الصور والأصوات. من ناحية أخرى ، سيتعامل خادم الواجهة الخلفية مع منطق الأعمال الذي يستجيب لأي طلبات يتم إرسالها من الواجهة الأمامية.





رسم توضيحي لهيكل تطبيقات الويب .



هذا ما يحدث عندما تفتح ميديوم في متصفحك.



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


بالطبع ، قد لا تكون هذه بالضبط نفس العملية التي تحدث عند استخدام تطبيق الويب المتوسط ​​، وفي الواقع سيكون الأمر أكثر تعقيدًا من ذلك بكثير ، ولكن هذه العملية المبسطة يمكن أن تساعدك على فهم كيفية عمل تطبيق الويب.



الآن أريدك أن تركز على الأسهم الزرقاء في الصورة أعلاه. هذه طلبات HTTP (يتم إرسالها من المتصفح) واستجابات HTTP (يتم استلامها بواسطة المتصفح أو إرسالها إلى المتصفح). تسمى المكونات التي تعالج الطلبات من المتصفح وتعيد الاستجابات إلى خادم الواجهة "APIs".



فيما يلي تعريف API:





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

API!



هناك العديد من الأطر التي تساعدنا في إنشاء واجهات برمجة التطبيقات باستخدام Python ، بما في ذلك Flask و Django و Pyramid و Falcon و Tornado. يتم سرد المزايا والعيوب ، بالإضافة إلى مقارنة هذه الهياكل هنا . سأستخدم Flask لهذا البرنامج التعليمي ، لكن الأسلوب وسير العمل يظلان كما هو بالنسبة للآخرين ، وبدلاً من ذلك ، يمكنك استخدام إطار العمل المفضل لديك في هذه المرحلة.



يمكن تثبيت أحدث إصدار من Flask عبر نقطة باستخدام هذا الأمر:



pip install Flask


كل ما عليك فعله الآن هو تحويل الكود من الخطوة السابقة إلى وظيفة وتسجيل نقطة نهاية API لها بعد تهيئة تطبيق Flask الخاص بك. بشكل افتراضي ، يتم تشغيل تطبيق Flask على المضيف المحلي (127.0.0.1) وسوف يستمع إلى الطلبات على المنفذ 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()


تمثيل النموذج الخاص بك كواجهة برمجة تطبيقات



في الجهاز ، يجب أن ترى ما يلي:



* 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)


افتح المستعرض الخاص بك وأدخل الاستعلام التالي في شريط العناوين:



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


إذا ظهر شيء كهذا في متصفحك ، فتهانينا! أنت الآن تعرض نموذج التعلم الآلي الخاص بك كخدمة بنقطة نهاية API.



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


اختبار API مع ساعي البريد



استخدمنا متصفحنا مؤخرًا لإجراء اختبار سريع لواجهة برمجة التطبيقات ، ولكن هذه ليست طريقة فعالة للغاية. على سبيل المثال ، لم نتمكن من استخدام طريقة GET ، ولكن بدلاً من ذلك ، استخدم طريقة POST مع رمز المصادقة في الرأس ، وليس من السهل جعل المتصفح يرسل مثل هذا الطلب. في تطوير البرمجيات ، يستخدم Postman على نطاق واسع لاختبار واجهات برمجة التطبيقات وهو مجاني تمامًا للاستخدام الأساسي.





واجهة مستخدم ساعي البريد (من صفحة تنزيل Postman )

بعد تنزيل وتثبيت Postman ، افتح الأداة واتبع الإرشادات أدناه لإرسال طلبك.





إرسال طلب GET مع ساعي البريد



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


الآن بعد أن عرفت كيفية عرض نموذج التعلم الآلي الخاص بك كخدمة من خلال نقطة نهاية API واختبار نقطة النهاية هذه مع Postma ، فإن الخطوة التالية هي تعبئة تطبيقك باستخدام Docker ، حيث سنلقي نظرة فاحصة على كيفية عمل Docker وكيف يمكن أن تساعدنا. حل جميع مشاكل التبعية التي واجهناها من قبل.



اقرأ الجزء الأول.



All Articles