شعار زيفيرنت

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

التاريخ:

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

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

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

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

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

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

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

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

تنفيذ الحل

نستخدم نموذج لغة مُدرَّب مسبقًا (ديستيلبيرت) من عند عناق. يوفر Huggingface مجموعة متنوعة من نماذج اللغة المدربة مسبقًا ؛ ال نموذج نحن نستخدم 250 ميغا بايت كبيرة ويمكن استخدامها لبناء نقطة نهاية للإجابة على الأسئلة.

نستخدم AWS SAM CLI لإنشاء نقطة نهاية بدون خادم بامتداد بوابة أمازون API. الرسم البياني التالي يوضح هندستنا.

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

  1. على جهازك المحلي ، قم بتشغيل sam init.
  2. أدخل 1 لمصدر النموذج (قوالب البدء السريع لـ AWS)
  3. كنوع حزمة ، أدخل 2 للصورة.
  4. للصورة الأساسية ، أدخل 3 - amazon/python3.8-base.
  5. كاسم مشروع ، أدخل lambda-pytorch-example.
  6. تغيير الخاص بك workdir إلى lambda-pytorch-example وانسخ مقتطفات التعليمات البرمجية التالية في ملف hello_world المجلد.

الكود التالي هو مثال على ملف requirements.txt لتشغيل كود PyTorch في Lambda. Huggingface لها تبعية PyTorch لذلك لا نحتاج إلى إضافتها هنا بشكل منفصل. أضف المتطلبات إلى ملف requirements.txt الفارغ في المجلد hello_world.

# List all python libraries for the lambda
transformers[torch]==4.1.1

ما يلي هو رمز app.py ملف:

import json
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch tokenizer = AutoTokenizer.from_pretrained("model/")
model = AutoModelForQuestionAnswering.from_pretrained("model/") def lambda_handler(event, context): body = json.loads(event['body']) question = body['question'] context = body['context'] inputs = tokenizer.encode_plus(question, context,add_special_tokens=True, return_tensors="pt") input_ids = inputs["input_ids"].tolist()[0] output = model(**inputs) answer_start_scores = output.start_logits answer_end_scores = output.end_logits answer_start = torch.argmax(answer_start_scores) answer_end = torch.argmax(answer_end_scores) + 1 answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end])) print('Question: {0}, Answer: {1}'.format(question, answer)) return { 'statusCode': 200, 'body': json.dumps({ 'Question': question, 'Answer': answer }) }

يعد Dockerfile التالي مثالاً على Python 3.8 ، والذي يقوم بتنزيل واستخدام نموذج لغة DistilBERT الذي تم ضبطه بدقة لمهمة الإجابة على الأسئلة. لمزيد من المعلومات، راجع قاعدة DistilBERT المقطر غير المعامل SQuAD. يمكنك استخدام النماذج المخصصة عن طريق نسخها إلى مجلد الطراز والرجوع إليها في ملف app.py.

# Pull the base image with python 3.8 as a runtime for your Lambda
FROM public.ecr.aws/lambda/python:3.8 # 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 ./ # Load the BERT model from Huggingface and store it in the model directory
RUN mkdir model
RUN curl -L https://huggingface.co/distilbert-base-uncased-distilled-squad/resolve/main/pytorch_model.bin -o ./model/pytorch_model.bin
RUN curl https://huggingface.co/distilbert-base-uncased-distilled-squad/resolve/main/config.json -o ./model/config.json
RUN curl https://huggingface.co/distilbert-base-uncased-distilled-squad/resolve/main/tokenizer.json -o ./model/tokenizer.json
RUN curl https://huggingface.co/distilbert-base-uncased-distilled-squad/resolve/main/tokenizer_config.json -o ./model/tokenizer_config.json # Set the CMD to your handler
CMD ["app.lambda_handler"]

قم بتغيير دليل العمل الخاص بك مرة أخرى إلى lambda-pytorch-example وانسخ المحتوى التالي إلى ملف template.yaml ملف:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: > python3.8 Sample SAM Template for lambda-pytorch-example Resources: pytorchEndpoint: Type: AWS::Serverless::Function Properties: PackageType: Image MemorySize: 5000 Timeout: 300 Events: ApiEndpoint: Type: HttpApi Properties: Path: /inference Method: post TimeoutInMillis: 29000 Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: python3.8-v1 Outputs: InferenceApi: Description: "API Gateway endpoint URL for Prod stage for inference function" Value: !Sub "https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/inference"

نحتاج الآن إلى إنشاء مستودع Amazon ECR في AWS وتسجيل Docker المحلي فيه. ال repositoryUri يتم عرضه في الإخراج ؛ احتفظ بها لمدة لاحقة.

# Create an ECR repository
aws ecr create-repository --repository-name lambda-pytorch-example --image-scanning-configuration scanOnPush=true --region <REGION> # 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

نشر التطبيق

تنشر الخطوات التالية التطبيق في حساب AWS الخاص بك:

  1. يجري sam build && sam deploy –-guided.
  2. في حالة اسم المكدس، أدخل pytorch-lambda-example.
  3. اختر نفس المنطقة التي أنشأت فيها مستودع Amazon ECR.
  4. أدخل مستودع الصور للوظيفة (أدخل الملف المحفوظ مسبقًا repositoryUri من مستودع Amazon ECR).
  5. في حالة قم بتأكيد التغييرات قبل النشر و السماح بإنشاء دور SAM CLI IAM، احتفظ بالإعدادات الافتراضية.
  6. في حالة pytorchEndpoint قد لا يكون لديه تفويض محدد ، هل هذا جيد؟، حدد y.
  7. احتفظ بالإعدادات الافتراضية للمطالبات المتبقية.

تقوم AWS SAM بتحميل صور الحاوية إلى مستودع Amazon ECR وتنشر التطبيق. أثناء هذه العملية ، سترى تغييرًا تم تعيينه مع حالة النشر. للحصول على وصف أكثر تفصيلاً حول AWS SAM وصور حاوية Lambda ، راجع استخدام دعم صورة الحاوية لـ AWS Lambda مع AWS SAM.

عند اكتمال النشر ، يتم عرض إخراج المكدس. استخدم نقطة نهاية InferenceApi لاختبار التطبيق الذي تم نشره. يتم عرض عنوان URL لنقطة النهاية كإخراج أثناء توزيع المكدس.

التغلب على التشغيل البارد لوظيفة Lambda

نظرًا لأن نموذج اللغة العادية يبلغ بالفعل حوالي 250 ميجابايت ، يمكن أن يستغرق تشغيل الوظيفة الأولية ما يصل إلى 25 ثانية وقد يتجاوز مهلة API القصوى البالغة 29 ثانية. يمكن أيضًا الوصول إلى هذا الوقت عندما لم يتم استدعاء الوظيفة لبعض الوقت وبالتالي في وضع بدء التشغيل البارد. عندما تكون وظيفة Lambda في حالة ساخنة ، يستغرق تشغيل الاستدلال الواحد حوالي 150 مللي ثانية.

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

تأكد من التغييرAPI_GATEWAY_URL> إلى عنوان URL الخاص بنقطة نهاية API Gateway. في رمز المثال التالي ، يتم نسخ النص من ملف صفحة ويكيبيديا على السيارات. يمكنك تغيير السؤال والسياق كما تريد والتحقق من إجابات النموذج.

curl --header "Content-Type: application/json" --request POST --data '{"question": "When was the car invented?","context": "Cars came into global use during the 20th century, and developed economies depend on them. The year 1886 is regarded as the birth year of the modern car when German inventor Karl Benz patented his Benz Patent-Motorwagen. Cars became widely available in the early 20th century. One of the first cars accessible to the masses was the 1908 Model T, an American car manufactured by the Ford Motor Company. Cars were rapidly adopted in the US, where they replaced animal-drawn carriages and carts, but took much longer to be accepted in Western Europe and other parts of the world."}' <API_GATEWAY_URL>

تظهر الإجابة الإجابة الصحيحة على السؤال:

{"Question": "When was the car invented?", "Answer": "1886"}

وفي الختام

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

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


عن المؤلف

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

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

بقعة_صورة

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

بقعة_صورة