البرنامج التعليمي: نشر نموذج تصنيف الصور المدربين مسبقاً على Azure Functions مع PyTorch

ستتعلم في هذا البرنامج التعليمي كيفية استخدام Python وPyTorch وAzure Functions لتحميل نموذج مدرب مسبقاً لتصنيف صورة بناءً على محتوياتها. نظرا لأنك تقوم بكل العمل محليا ولا تنشئ موارد Azure في السحابة، فلا توجد تكلفة لإكمال هذا البرنامج التعليمي.

  • تهيئة بيئة محلية لتطوير دوال Azure بلغة Python.
  • استيراد نموذج التعلم الآلي PyTorch الذي تم تدريبه مسبقاً إلى تطبيق وظيفي.
  • أنشئ واجهة برمجة تطبيقات "HTTP" بلا خادم لتصنيف صورة كواحدة من فئات 1000 ImageNet.
  • استخدام واجهة برمجة التطبيقات من تطبيق ويب.

المتطلبات الأساسية

التحقق من المتطلبات الأساسية

  1. شغل، في المحطة الطرفية أو نافذة أوامر، func --version للتحقق من توافق الأدوات الأساسية لدوال Azure مع الإصدار 2.7.1846.x. أو أي إصدار أحدث.
  2. شغلpython --version(Linux/macOS) أو py --version (Windows) للتحقق من أن تقارير إصدار لغة بايثون الخاص بك هو 3.7. 3.7.x أو 3.6.x.

استنساخ مستودع البرنامج التعليمي

  1. انُسخ، في المحطة الطرفية أو نافذة الأوامر، المستودع التالي باستخدام Git:

    git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
    
  2. انتقل إلى المجلد وافحص محتوياته.

    cd functions-python-pytorch-tutorial
    
    • البدءيمثل مجلد العمل الخاص بك للبرنامج التعليمي.
    • النهاية تمثل النتيجة النهائية والتنفيذ الكامل للرجوع إليه.
    • الموارد تحتوي على نموذج التعلم الآلي ومكتبات المساعد.
    • الواجهة الأمامية بمثابة موقع على شبكة الانترنت يستخدم تطبيق الدالة.

إنشاء البيئة الافتراضية وتنشيطها

انتقل إلى "start" وشغل الأوامر التالية لإنشاء وتفعيل البيئة الافتراضية باسم.venv.

cd start
python -m venv .venv
source .venv/bin/activate

إذا لم يثبت Python حزمة venv على توزيع Linux الخاص بك، فشغل الأمر التالي:

sudo apt-get install python3-venv

شغل جميع الأوامر اللاحقة في هذه البيئة الافتراضية النشطة. (لإنهاء البيئة الافتراضية، شغلdeactivate.)

إنشاء مشروع دوال محلية

يمثل مشروع الدالة، في دوال Azure، حاوية للدوال الفردية واحدة أو أكثر والتي يستجيب كل منها إلى مشغل معين. تتشارك جميع الدوال في أي مشروع نفس التهيئات المحلية وتهيئات الاستضافة ذاتها. يمكنك، في هذا القسم إنشاء مشروع دالة يحتوي على دالة نص متداول مفردة باسمclassify والذي يوفر نقطة نهاية بروتوكول نقل النص الفائق. إضافة التعليمات البرمجية الأكثر تحديدا في أي قسم لاحق.

  1. في مجلدالبدء، استخدم الأدوات الأساسية لدوال Azure لتهيئة تطبيق دالة بلغة بايثون:

    func init --worker-runtime python
    

    وبعد البدء، سيحتوي مجلد البدء على ملفات مختلفة للمشروع، بما في ذلك ملفات التهيئة باسمlocal.settings.jsonوhost.json. ونظراً لاحتواء ملفات local.settings.json على الأسرار التي تم تنزيلها من Azure، يُستبعد الملف من التحكم في المصدر افتراضيا في ملف .gitignore.

    تلميح

    ونظراً لربط مشروع الدالة بوقت التشغيل المحددة، يجب كتابة جميع الدوال في المشروع بنفس اللغة.

  2. اضف دالة إلى مشروعك باستخدام الأمر التالي، حيث تمثل الوسيطة --name الاسم المميز للدالة خاصتك فيما تُحدد الوسيطة--template مشغل الدالة. func new ينشئ مجلداً فرعياً يطابق اسم الوظيفة الذي يحتوي على ملف تعليمات برمجية مناسب للغة المختارة للمشروع وملف تكوين باسم function.json.

    func new --name classify --template "HTTP trigger"
    

    ينشئ هذا الأمر مجلدا مطابقا لاسم الدالة، ويُصنف. يرد في هذا المجلد ملفان: __init__.pynit .py، الذي يحتوي على تعليمة برمجية للدالة وfunction.json، الذي يصف مشغل الدالة وروابط الإدخال والإخراج الخاصة بها. للحصول على تفاصيل حول محتويات هذه الملفات، راجع نموذج البرمجة في دليل مطور Python.

تشغيل الدالة محليًا

  1. ابدأ تشغيل الدالة عن طريق بدء تشغيل مضيف وقت تشغيل دوال Azure المحلية في مجلد البدء:

    func start
    
  2. بمجرد ظهور classify نقطة النهاية في المخرجات، انتقل إلى عنوان URLhttp://localhost:7071/api/classify?name=Azure. يجب أن تظهر الرسالة "Hello Azure!" في الإخراج.

  3. استخدم Ctrl-C لإيقاف المضيف.

استيراد نموذج PyTorch وإضافة الرموز المساعدة

لتعديل الدالة classify لتصنيف صورة استناداً إلى محتوياتها، يمكنك استخدام نموذج ResNet مدرب مسبقاً. النموذج مدرب مسبقاً، والذي يأتي من PyTorch، يصنف صورة إلى 1 من 1000 فئات ImageNet. أضف بعد ذلك بعض الرموز المساعدة والتبعيات إلى المشروع الخاص بك.

  1. في المجلد "Start" تشغيل الأمر التالي لنسخ رمز التوقع والتسميات في المجلد التصنيف.

    cp ../resources/predict.py classify
    cp ../resources/labels.txt classify
    
  2. تحقق من أن المجلد تصنيف يحتوي على ملفات تسمى predict.py وlabels.txt. إذا لم يكن كذلك، تحقق من تشغيل الأمر في مجلد البدء.

  3. افتح البدء/requirements.txt في محرر نصوص وأضف التبعيات المطلوبة بواسطة التعليمات البرمجية للمساعد، والتي يجب أن تبدو كما يلي:

    azure-functions
    requests
    -f https://download.pytorch.org/whl/torch_stable.html
    torch==1.13.0+cpu
    torchvision==0.14.0+cpu
    

    تلميح

    يجب أن تتطابق إصدارات torch و torchvision مع القيم المدرجة في جدول الإصدار من مستودع رؤية PyTorch.

  4. حفظ requirements.txt، ثم قم بتشغيل الأمر التالي من مجلد البدء لتثبيت التبعيات.

    pip install --no-cache-dir -r requirements.txt
    

قد يستغرق التثبيت بضع دقائق، وخلال هذه الفترة يمكنك المتابعة مع تعديل الدالة في القسم التالي.

تلميح

قد تواجه على Windows خطأ "تعذر تثبيت الحزم بسبب EnvironmentError: [Errno 2] لا يوجد ملف أو دليل" متبوعا باسم مسار طويل إلى ملف مثل sharded_mutable_dense_hashtable.cpython-37.pyc. يحدث هذا الخطأ بشكل عام لأن عمق مسار المجلد طويل جدا. في هذه الحالة، اضبط مفتاح التسجيل HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled1 لتمكين مسارات طويلة. وتحقق من مكان تثبيت مترجم لغة بايثون بالتناوب. إذا كان هذا الموقع يحتوي على مسار طويل، حاول إعادة تثبيته في مجلد ذي مسار أقصر.

تحديث الدالة لتشغيل التوقعات

  1. افتح "classify/__init__.py" في محرر نص وأضف الأسطر التالية بعد العبارات الموجودة import لاستيراد مكتبة JSON القياسية ومساعدي التوقع:

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. استبدل محتويات الملف بالكامل بالتعليمات البرمجيةmain التالية:

    def main(req: func.HttpRequest) -> func.HttpResponse:
        image_url = req.params.get('img')
        logging.info('Image URL received: ' + image_url)
    
        results = predict_image_from_url(image_url)
    
        headers = {
            "Content-type": "application/json",
            "Access-Control-Allow-Origin": "*"
        }
    
        return func.HttpResponse(json.dumps(results), headers = headers)
    

    تستلم هذه الدالة صورة بعنوان "URL" في معلمة سلسلة استعلام باسم.img ثم يتصل predict_image_from_url من مكتبة المساعد لتحميل وتصنيف الصورة باستخدام نموذج PyTorch. تُعيد الدالة استجابة "HTTP" مع النتائج.

    هام

    ونظراً لطلب نقطة نهاية بروتوكول نقل النص الفائق بواسطة صفحة ويب مستضافة على نطاق آخر، تتضمن الاستجابة Access-Control-Allow-Origin رأس الرسالة لتلبية متطلبات اشتراك المصادر في موارد المتصفح.

    قم أثناء تطبيق الإنتاج، بتغيير * إلى الأصل المحدد لصفحة الويب لمزيد من الأمان.

  3. احفظ التغييرات الخاصة بك، ثم افترض انتهاء تثبيت التبعيات وابدأ مضيف الدالة المحلية مرة أخرى معfunc start. تأكد من تشغيل المضيف في مجلد البدء مع تفعيل البيئة الافتراضية. وإلا سيبدأ المضيف، ولكنك سترى أخطاء عند استدعاء الدالة.

    func start
    
  4. افتح في المتصفح عنوان "URL" التالي لطلب الدالة مع عنوان "URL" لصورة Bernese Mountain Dog وتأكد من تصنيف ملف JSON المسترد للصورة على أنها Bernese Mountain Dog.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    
  5. حافظ على تشغيل المضيف لأنك ستستخدمه في الخطوة التالية.

شغل الواجهة الأمامية لتطبيق الويب المحلية لاختبار دالة

لاختبار طلب نقطة نهاية الدالة من تطبيق ويب آخر، سيظهر لك تطبيق بسيط في المجلد الأمامي للمستودع.

  1. افتح وحدة طرفية أو طلب أمر جديد ونشط البيئة الافتراضية (حسب المنصوص عليه بموجب وأنشأ البيئة الافتراضية Python وفعله).

  2. انتقل إلى المجلد الأمامي للمستودع.

  3. بدء تشغيل خادم "HTTP" مع Python:

    python -m http.server
    
  4. انتقل في المتصفح إلى localhost:8000، ثم أدخل أحد عناوين "URL" التالية للصور في مربع النص، أو استخدم عنوان "URL" لأي صورة يمكن الوصول إليها بشكل عام.

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    • https://github.com/Azure-Samples/functions-python-pytorch-tutorial/blob/master/resources/assets/bald-eagle.jpg?raw=true
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/penguin.jpg
  5. حدد "Submit" لطلب نقطة نهاية الدالة لتصنيف الصورة.

    لقطة شاشة للمشروع النهائي

    إذا أبلغ المتصفح عن خطأ عند إرسال عنوان "URL" للصورة، تحقق من المحطة الطرفية التي تقوم بتشغيل تطبيق الدوال فيها. إذا رأيت خطأ مثل "لم يتم العثور على وحدة نمطية 'PIL'"، فقد تكون قد بدأت تطبيق الدوال في مجلد "start" دون تنشيط البيئة الافتراضية التي أنشأتها في وقت سابق. إذا كنت لا تزال ترى أخطاء، شغل pip install -r requirements.txt مرة أخرى مع تنشيط البيئة الافتراضية والبحث عن الأخطاء.

تنظيف الموارد

ونظرا لأن البرنامج التعليمي بأكمله يعمل محلياً على جهازك، فلا توجد موارد أو خدمات Azure لتنظيفها.

الخطوات التالية

في هذا البرنامج التعليمي، تعلمت كيفية إنشاء وتخصيص نقطة نهاية واجهة التطبيق "HTTP" مع Azure Functions لتصنيف الصور باستخدام نموذج PyTorch. تعلمت كذلك كيفية الاتصال بواجهة برمجة التطبيقات من تطبيق ويب. يمكنك استخدام التقنيات المذكورة في هذا البرنامج التعليمي لبناء واجهات برمجة التطبيقات من أي مجال تعقيد، كل ذلك أثناء التشغيل على نموذج الحوسبة بلا خادم الذي توفره Azure Functions.

راجع أيضاً: