شعار زيفيرنت

استخدام صور الحاوية لتشغيل نماذج TensorFlow في AWS Lambda

التاريخ:

TensorFlow هي مكتبة مفتوحة المصدر للتعلم الآلي (ML) تستخدم على نطاق واسع لتطوير الشبكات العصبية ونماذج ML. عادةً ما يتم تدريب هذه النماذج على مثيلات GPU متعددة لتسريع التدريب ، مما ينتج عنه وقت تدريب باهظ وأحجام نماذج تصل إلى بضعة غيغابايت. بعد أن يتم تدريبهم ، يتم نشر هذه النماذج في الإنتاج لإنتاج الاستدلالات. يمكن أن تكون أحمال عمل متزامنة أو غير متزامنة أو قائمة على الدُفعات. يجب أن تكون نقاط النهاية هذه قابلة للتطوير بدرجة عالية ومرنة من أجل معالجة من صفر إلى ملايين الطلبات. هذا هو المكان AWS لامدا يمكن أن تكون خدمة حوسبة مقنعة لاستنتاج ML المتزامن وغير المتزامن القابل للتطوير والفعالية من حيث التكلفة والموثوق به. تقدم Lambda مزايا مثل التدرج التلقائي ، وتقليل النفقات التشغيلية ، ودفع فواتير الاستدلال.

يوضح لك هذا المنشور كيفية استخدام أي نموذج TensorFlow مع Lambda للاستدلالات القابلة للتطوير في الإنتاج مع ما يصل إلى 10 جيجابايت من الذاكرة. يتيح لنا ذلك استخدام نماذج ML في وظائف Lambda حتى بضعة غيغابايت. في هذا المنشور ، نستخدم TensorFlow-Keras المدربة مسبقًا ريسنت 50 لتصنيف الصور.

نظرة عامة على الحل

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

يوضح الرسم البياني التالي بنية الحل الذي نقدمه.

يمكنك حزم التعليمات البرمجية والاعتماديات كملف صورة الحاوية باستخدام أدوات مثل Docker CLI. الحد الأقصى لحجم الحاوية 10 جيجا بايت. بعد أن يتم Dockerized نموذج الاستدلال ، يمكنك تحميل الصورة إلى سجل الأمازون المرنة للحاويات (أمازون ECR). يمكنك بعد ذلك إنشاء وظيفة Lambda من الحاوية المصورة المخزنة في Amazon ECR.

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

في هذا الدليل ، يجب أن يكون لديك المتطلبات الأساسية التالية:

تنفيذ الحل

نستخدم نموذجًا مُدرَّبًا مسبقًا من TensorFlow Hub لتصنيف الصور. عندما يتم تحميل صورة إلى ملف خدمة تخزين أمازون البسيطة (Amazon S3) ، يتم استدعاء وظيفة Lambda لاكتشاف الصورة وطباعتها في ملف الأمازون CloudWatch السجلات. يوضح الرسم التخطيطي التالي سير العمل هذا.

يوضح الرسم البياني التالي سير العمل هذا.

لتنفيذ الحل ، أكمل الخطوات التالية:

  1. على جهازك المحلي ، قم بإنشاء مجلد بالاسم lambda-tensorflow-example.
  2. إنشاء requirements.txt ملف في هذا الدليل.
  3. أضف جميع المكتبات المطلوبة لنموذج ML الخاص بك. بالنسبة لهذا المنشور ، نستخدم TensorFlow 2.4.
  4. خلق app.py البرنامج النصي الذي يحتوي على رمز وظيفة Lambda.
  5. قم بإنشاء Dockerfile في نفس الدليل.

النص التالي هو مثال على ملف requirements.txt لتشغيل كود TensorFlow لحالة الاستخدام الخاصة بنا:

# List all python libraries for the lambda
tensorflow==2.4.0
tensorflow_hub==0.11
Pillow==8.0.1

نحن نستخدم إصدار TensorFlow 2.4 مع دعم وحدة المعالجة المركزية فقط لأنه ، حتى كتابة هذه السطور ، لا تقدم Lambda سوى دعم وحدة المعالجة المركزية. لمزيد من المعلومات حول إصدارات وحدة المعالجة المركزية فقط من TensorFlow ، راجع موقع العبوة.

يتم وضع كود Python في app.py. تحتاج وظيفة الاستنتاج في app.py إلى اتباع بنية محددة ليتم استدعاؤها بواسطة وقت تشغيل Lambda. لمزيد من المعلومات حول معالجات Lambda ، راجع معالج وظائف AWS Lambda في Python. انظر الكود التالي:

import json
import boto3
import numpy as np
import PIL.Image as Image import tensorflow as tf
import tensorflow_hub as hub IMAGE_WIDTH = 224
IMAGE_HEIGHT = 224 IMAGE_SHAPE = (IMAGE_WIDTH, IMAGE_HEIGHT)
model = tf.keras.Sequential([hub.KerasLayer("model/")])
model.build([None, IMAGE_WIDTH, IMAGE_HEIGHT, 3]) imagenet_labels= np.array(open('model/ImageNetLabels.txt').read().splitlines())
s3 = boto3.resource('s3') def lambda_handler(event, context): bucket_name = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] img = readImageFromBucket(key, bucket_name).resize(IMAGE_SHAPE) img = np.array(img)/255.0 prediction = model.predict(img[np.newaxis, ...]) predicted_class = imagenet_labels[np.argmax(prediction[0], axis=-1)] print('ImageName: {0}, Prediction: {1}'.format(key, predicted_class)) def readImageFromBucket(key, bucket_name): bucket = s3.Bucket(bucket_name) object = bucket.Object(key) response = object.get() return Image.open(response['Body'])

يستخدم Dockerfile التالي لـ Python 3.8 المصدر المفتوح المقدم من AWS الصور الأساسية التي يمكن استخدامها لإنشاء صور حاوية. يتم تحميل الصور الأساسية مسبقًا بأوقات تشغيل اللغة والمكونات الأخرى المطلوبة لتشغيل صورة حاوية على Lambda.

# Pull the base image with python 3.8 as a runtime for your Lambda
FROM public.ecr.aws/lambda/python:3.8 # Install tar and gzip
RUN yum -y install tar gzip zlib # Copy the earlier created requirements.txt file to the container
COPY requirements.txt ./ # Install the python requirements from requirements.txt
RUN python3.8 -m pip install -r requirements.txt # Copy the earlier created app.py file to the container
COPY app.py ./ # Download ResNet50 and store it in a directory
RUN mkdir model
RUN curl -L https://tfhub.dev/google/imagenet/resnet_v1_50/classification/4?tf-hub-format=compressed -o ./model/resnet.tar.gz
RUN tar -xf model/resnet.tar.gz -C model/
RUN rm -r model/resnet.tar.gz # Download ImageNet labels
RUN curl https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt -o ./model/ImageNetLabels.txt # Set the CMD to your handler
CMD ["app.lambda_handler"]

يجب أن تبدو بنية المجلد الخاص بك مثل لقطة الشاشة التالية.

يجب أن تبدو بنية المجلد الخاص بك مثل لقطة الشاشة التالية.

يمكنك إنشاء صورة الحاوية ودفعها إلى Amazon ECR باستخدام أوامر bash التالية. استبدل ملف باستخدام معرف حساب AWS الخاص بك وتحديد ملف .

# Build the docker image
docker build -t lambda-tensorflow-example . # Create a ECR repository
aws ecr create-repository --repository-name lambda-tensorflow-example --image-scanning-configuration scanOnPush=true --region <REGION> # Tag the image to match the repository name
docker tag lambda-tensorflow-example:latest <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/lambda-tensorflow-example:latest # Register docker to ECR
aws ecr get-login-password --region <REGION> | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com # Push the image to ECR
docker push <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/lambda-tensorflow-example:latest

إذا كنت ترغب في اختبار نموذج الاستدلال محليًا ، فإن الصور الأساسية لـ Lambda تتضمن Runtime Interface Emulator (RIE) الذي يسمح لك أيضًا اختبار محلي يتم تجميع وظيفة Lambda كصورة حاوية لتسريع دورات التطوير.

إنشاء دلو S3

كخطوة تالية ، نقوم بإنشاء حاوية S3 لتخزين الصور المستخدمة للتنبؤ بفئة الصورة.

  1. في وحدة تحكم Amazon S3 ، اختر إنشاء دلو.
  2. امنح حاوية S3 اسمًا ، مثل tensorflow-images-for-inference-<Random_String> واستبدال بقيمة عشوائية.
  3. اختار إنشاء دلو.

إنشاء وظيفة Lambda باستخدام كود TensorFlow

لإنشاء وظيفة Lambda الخاصة بك ، أكمل الخطوات التالية:

  1. في وحدة تحكم لامدا ، اختر وظائف.
  2. اختار خلق وظيفة.
  3. أختار صورة الحاوية.
  4. في حالة اسم وظيفة، أدخل اسمًا ، مثل tensorflow-endpoint.
  5. في حالة عنوان URI لصورة الحاوية، أدخل ما تم إنشاؤه مسبقًا lambda-tensorflow-example مستودع.

  1. اختار تصفح الصور لاختيار أحدث صورة.
  2. انقر خلق وظيفة لتهيئة إنشائها.
  3. لتحسين وقت تشغيل Lambda ، قم بزيادة ذاكرة الوظيفة إلى 6 جيجا بايت على الأقل والمهلة إلى 5 دقائق في ملف الإعدادات الأساسية.

لمزيد من المعلومات حول ذاكرة الوظيفة وضبط المهلة ، انظر جديد لـ AWS Lambda - وظائف مع ما يصل إلى 10 جيجابايت من الذاكرة و 6 وحدات معالجة مركزية (vCPU).

توصيل دلو S3 بوظيفة Lambda

بعد الإنشاء الناجح لوظيفة Lambda ، نحتاج إلى إضافة مشغل إليها بحيث يتم استدعاء الوظيفة كلما تم تحميل ملف إلى حاوية S3.

  1. في وحدة تحكم لامدا ، اختر وظيفتك.
  2. اختار إضافة الزناد.

اختر إضافة مشغل.

  1. اختار S3.
  2. في حالة دلو، اختر الحاوية التي أنشأتها سابقًا.

بالنسبة إلى الجرافة ، اختر الحاوية التي أنشأتها سابقًا.

بعد إضافة المشغل ، تحتاج إلى السماح لوظيفة Lambda بالاتصال بحاوية S3 عن طريق ضبط الإعداد المناسب إدارة الهوية والوصول AWS حقوق (IAM) لدورها التنفيذي.

  1. على أذونات علامة التبويب لوظيفتك ، اختر دور IAM.
  2. اختار إرفاق السياسات.
  3. البحث عن AmazonS3ReadOnlyAccess وإرفاقه بدور IAM.

لقد قمت الآن بتهيئة جميع الخدمات الضرورية لاختبار وظيفتك. قم بتحميل صورة JPG إلى حاوية S3 التي تم إنشاؤها عن طريق فتح الحاوية في وحدة تحكم إدارة AWS والنقر تحميل. بعد بضع ثوانٍ ، يمكنك رؤية نتيجة التنبؤ في سجلات CloudWatch. كخطوة متابعة ، يمكنك تخزين التنبؤات في ملف الأمازون DynamoDB الجدول.

بعد تحميل صورة JPG إلى حاوية S3 ، سنحصل على فئة الصورة المتوقعة نتيجة طباعتها على CloudWatch. سيتم تشغيل وظيفة Lambda بواسطة EventBridge وسحب الصورة من الحاوية. كمثال ، سوف نستخدم صورة هذا ببغاء ليتم توقعها من خلال نقطة نهاية الاستدلال.

في سجلات CloudWatch ، تتم طباعة الفئة المتوقعة. في الواقع ، يتنبأ النموذج بالفئة الصحيحة للصورة (الببغاء):

الأداء

من أجل تحقيق الأداء الأمثل ، يمكنك تجربة مستويات مختلفة من إعدادات الذاكرة (التي تغير خطيًا وحدة المعالجة المركزية الافتراضية المعينة ، لمعرفة المزيد ، اقرأ هذا مدونة أخبار AWS). في حالة نموذجنا الذي تم نشره ، نحقق معظم مكاسب الأداء عند حوالي 3 جيجابايت - 4 جيجابايت (~ 2 وحدة معالجة مركزية) والمكاسب التي تتجاوز ذلك منخفضة نسبيًا. ترى النماذج المختلفة مستوى مختلفًا من تحسين الأداء من خلال زيادة كمية وحدة المعالجة المركزية ، لذا من الأفضل تحديد ذلك بشكل تجريبي لنموذجك الخاص. بالإضافة إلى ذلك ، يوصى بشدة أن تقوم بتجميع شفرة المصدر الخاصة بك للاستفادة منها ملحقات Vector المتقدمة 2 (AVX2) على Lambda الذي يزيد من الأداء عن طريق السماح لوحدات المعالجة المركزية الافتراضية بتشغيل عدد أكبر من عمليات الأعداد الصحيحة والفاصلة العائمة لكل دورة ساعة.

وفي الختام

يتيح لك دعم صورة الحاوية لـ Lambda تخصيص وظيفتك بشكل أكبر ، مما يفتح الكثير من حالات الاستخدام الجديدة لـ ML بدون خادم. يمكنك إحضار النماذج المخصصة الخاصة بك ونشرها على Lambda باستخدام ما يصل إلى 10 جيجا بايت لحجم صورة الحاوية. بالنسبة للنماذج الأصغر التي لا تحتاج إلى قدر كبير من القدرة الحاسوبية ، يمكنك إجراء تدريب واستدلال عبر الإنترنت في Lambda فقط. عندما يزيد حجم النموذج ، تصبح مشكلات البدء البارد أكثر أهمية ويجب أن تكون كذلك التخفيف. لا توجد أيضًا قيود على الإطار أو اللغة مع صور الحاوية ؛ أطر ML الأخرى مثل PyTorch, أباتشي MXNet, XGBoostالطرق أو Scikit تعلم يمكن استخدامها كذلك!

إذا كنت تحتاج إلى GPU لاستنتاجك ، فيمكنك التفكير في استخدام خدمات الحاويات مثل خدمة الأمازون المرنة للحاويات (Amazon ECS) أو Kubernetes أو نشر النموذج في ملف الأمازون SageMaker نقطة النهاية.


عن المؤلف

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

المصدر: https://aws.amazon.com/blogs/machine-learning/using-container-images-to-run-tensorflow-models-in-aws-lambda/

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة

الدردشة معنا

أهلاً! كيف يمكنني مساعدك؟