تحسين تكلفة نشر نماذج Amazon SageMaker JumpStart الأساسية باستخدام نقاط النهاية غير المتزامنة من Amazon SageMaker | خدمات الويب الأمازون

تحسين تكلفة نشر نماذج Amazon SageMaker JumpStart الأساسية باستخدام نقاط النهاية غير المتزامنة من Amazon SageMaker | خدمات الويب الأمازون

لقد اجتذب نجاح تطبيقات الذكاء الاصطناعي التوليدية عبر مجموعة واسعة من الصناعات انتباه واهتمام الشركات في جميع أنحاء العالم التي تتطلع إلى إعادة إنتاج إنجازات المنافسين وتجاوزها أو حل حالات استخدام جديدة ومثيرة. ويتطلع هؤلاء العملاء إلى النماذج الأساسية، مثل TII Falcon، أو Stable Diffusion XL، أو GPT-3.5 من OpenAI، باعتبارها المحركات التي تدعم ابتكار الذكاء الاصطناعي التوليدي.

النماذج الأساسية هي فئة من نماذج الذكاء الاصطناعي التوليدية القادرة على فهم وإنشاء محتوى يشبه الإنسان، وذلك بفضل الكميات الهائلة من البيانات غير المنظمة التي تم تدريبها عليها. لقد أحدثت هذه النماذج ثورة في العديد من مهام الرؤية الحاسوبية (CV) ومعالجة اللغة الطبيعية (NLP)، بما في ذلك إنشاء الصور والترجمة والإجابة على الأسئلة. إنها بمثابة اللبنات الأساسية للعديد من تطبيقات الذكاء الاصطناعي وأصبحت عنصرًا حاسمًا في تطوير الأنظمة الذكية المتقدمة.

ومع ذلك، فإن نشر نماذج الأساس يمكن أن يأتي مع تحديات كبيرة، لا سيما من حيث التكلفة ومتطلبات الموارد. تُعرف هذه النماذج بحجمها الذي يتراوح غالبًا من مئات الملايين إلى مليارات المعلمات. ويتطلب حجمها الكبير موارد حسابية واسعة النطاق، بما في ذلك أجهزة قوية وسعة ذاكرة كبيرة. في الواقع، يتطلب نشر النماذج الأساسية عادةً وحدة معالجة رسومات واحدة على الأقل (في كثير من الأحيان أكثر) للتعامل مع الحمل الحسابي بكفاءة. على سبيل المثال، يتطلب نموذج TII Falcon-40B Instruct تحميل مثيل ml.g5.12xlarge على الأقل في الذاكرة بنجاح، ولكنه يعمل بشكل أفضل مع المثيلات الأكبر حجمًا. ونتيجة لذلك، فإن عائد الاستثمار (ROI) لنشر هذه النماذج وصيانتها يمكن أن يكون منخفضًا جدًا بحيث لا يمكن إثبات قيمة الأعمال، خاصة أثناء دورات التطوير أو لأعباء العمل المتصاعدة. ويرجع ذلك إلى تكاليف تشغيل وجود مثيلات مدعومة بوحدة معالجة الرسومات لجلسات طويلة، ربما على مدار الساعة طوال أيام الأسبوع.

أعلنا في وقت سابق من هذا العام أمازون بيدروك، واجهة برمجة تطبيقات بدون خادم للوصول إلى النماذج الأساسية من أمازون وشركائنا في مجال الذكاء الاصطناعي. على الرغم من أنه موجود حاليًا في معاينة خاصة، إلا أن واجهة برمجة التطبيقات بدون خادم تسمح لك باستخدام النماذج الأساسية من Amazon وAnthropic وStability AI وAI21، دون الحاجة إلى نشر أي نقاط نهاية بنفسك. ومع ذلك، فإن النماذج مفتوحة المصدر من مجتمعات مثل Hugging Face تشهد نموًا كبيرًا، ولم يتم توفير كل واحدة منها من خلال Amazon Bedrock.

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

حل نظرة عامة

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

تحسين تكلفة نشر نماذج Amazon SageMaker JumpStart الأساسية باستخدام نقاط النهاية غير المتزامنة من Amazon SageMaker | أمازون ويب سيرفيسز PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.

البنية التي ننشرها واضحة جدًا:

  • واجهة المستخدم عبارة عن جهاز كمبيوتر محمول يمكن استبداله بواجهة مستخدم ويب مبنية على تقنية Streamlit أو تقنية مشابهة. في حالتنا، دفتر الملاحظات هو أمازون ساجميكر ستوديو دفتر ملاحظات، يعمل على مثيل ml.m5.large مع نواة وحدة المعالجة المركزية PyTorch 2.0 Python 3.10.
  • يستعلم دفتر الملاحظات عن نقطة النهاية بثلاث طرق: SageMaker Python SDK، وAWS SDK for Python (Boto3)، وLangChain.
  • تعمل نقطة النهاية بشكل غير متزامن على SageMaker، وعلى نقطة النهاية، نقوم بنشر نموذج Falcon-40B Instruct. إنه حاليًا أحدث ما توصل إليه العلم من حيث نماذج التعليمات ومتوفر في SageMaker JumpStart. يسمح لنا استدعاء API واحد بنشر النموذج على نقطة النهاية.

ما هو الاستدلال غير المتزامن SageMaker

يعد الاستدلال غير المتزامن لـ SageMaker أحد خيارات النشر الأربعة في SageMaker، جنبًا إلى جنب مع نقاط النهاية في الوقت الفعلي والاستدلال الدفعي والاستدلال بدون خادم. لمعرفة المزيد حول خيارات النشر المختلفة، راجع نشر نماذج للاستدلال.

يقوم الاستدلال غير المتزامن SageMaker بوضع الطلبات الواردة في قائمة الانتظار ومعالجتها بشكل غير متزامن، مما يجعل هذا الخيار مثاليًا للطلبات ذات أحجام الحمولة الكبيرة التي تصل إلى 1 جيجابايت، وأوقات المعالجة الطويلة، ومتطلبات زمن الاستجابة في الوقت الفعلي تقريبًا. ومع ذلك، فإن الميزة الرئيسية التي توفرها عند التعامل مع نماذج الأساس الكبيرة، خاصة أثناء إثبات المفهوم (POC) أو أثناء التطوير، هي القدرة على تكوين الاستدلال غير المتزامن للتوسيع إلى عدد مثيلات صفر عندما لا تكون هناك طلبات لـ العملية، وبالتالي توفير التكاليف. لمزيد من المعلومات حول الاستدلال غير المتزامن لـ SageMaker، راجع الاستدلال غير المتزامن. الرسم البياني التالي يوضح هذه العمارة.

تحسين تكلفة نشر نماذج Amazon SageMaker JumpStart الأساسية باستخدام نقاط النهاية غير المتزامنة من Amazon SageMaker | أمازون ويب سيرفيسز PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.

لنشر نقطة نهاية الاستدلال غير المتزامنة، تحتاج إلى إنشاء AsyncInferenceConfig هدف. إذا قمت بإنشاء AsyncInferenceConfig دون تحديد الحجج الخاصة به، الافتراضي S3OutputPath سوف يكون s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} و S3FailurePath سوف يكون s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

ما هو برنامج SageMaker JumpStart

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

تعرض لقطة الشاشة التالية مثالاً لبعض النماذج المتوفرة على SageMaker JumpStart UI.

تحسين تكلفة نشر نماذج Amazon SageMaker JumpStart الأساسية باستخدام نقاط النهاية غير المتزامنة من Amazon SageMaker | أمازون ويب سيرفيسز PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.

انشر النموذج

خطوتنا الأولى هي نشر النموذج في SageMaker. للقيام بذلك، يمكننا استخدام واجهة المستخدم الخاصة بـ SageMaker JumpStart أو SageMaker Python SDK، والتي توفر واجهة برمجة تطبيقات يمكننا استخدامها لنشر النموذج إلى نقطة النهاية غير المتزامنة:

%%time
from sagemaker.jumpstart.model import JumpStartModel, AsyncInferenceConfig
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer model_id, model_version = "huggingface-llm-falcon-40b-instruct-bf16", "*"
my_model = JumpStartModel(model_id=model_id)
predictor = my_model.deploy( initial_instance_count=0, instance_type="ml.g5.12xlarge", async_inference_config=AsyncInferenceConfig()
)

يمكن أن تستغرق هذه المكالمة حوالي 10 دقائق حتى تكتمل. خلال هذا الوقت، يتم تشغيل نقطة النهاية، ويتم تنزيل الحاوية مع عناصر النموذج إلى نقطة النهاية، ويتم تحميل تكوين النموذج من SageMaker JumpStart، ثم يتم الكشف عن نقطة النهاية غير المتزامنة عبر نقطة نهاية DNS. للتأكد من أن نقطة النهاية الخاصة بنا يمكن تصغيرها إلى الصفر، نحتاج إلى تكوين القياس التلقائي على نقطة النهاية غير المتزامنة باستخدام Application Auto Scaling. يتعين عليك أولاً تسجيل متغير نقطة النهاية الخاصة بك باستخدام Application Auto Scaling، وتحديد سياسة القياس، ثم تطبيق سياسة القياس. في هذا التكوين، نستخدم مقياسًا مخصصًا باستخدام CustomizedMetricSpecificationودعا ApproximateBacklogSizePerInstance، كما هو موضح في الكود التالي. للحصول على قائمة مفصلة من الأمازون CloudWatch المقاييس المتوفرة مع نقطة نهاية الاستدلال غير المتزامن، راجع المراقبة باستخدام CloudWatch.

import boto3 client = boto3.client("application-autoscaling")
resource_id = "endpoint/" + my_model.endpoint_name + "/variant/" + "AllTraffic" # Configure Autoscaling on asynchronous endpoint down to zero instances
response = client.register_scalable_target( ServiceNamespace="sagemaker", ResourceId=resource_id, ScalableDimension="sagemaker:variant:DesiredInstanceCount", MinCapacity=0, # Miminum number of instances we want to scale down to - scale down to 0 to stop incurring in costs MaxCapacity=1, # Maximum number of instances we want to scale up to - scale up to 1 max is good enough for dev
) response = client.put_scaling_policy( PolicyName="Invocations-ScalingPolicy", ServiceNamespace="sagemaker", # The namespace of the AWS service that provides the resource. ResourceId=resource_id, # Endpoint name ScalableDimension="sagemaker:variant:DesiredInstanceCount", # SageMaker supports only Instance Count PolicyType="TargetTrackingScaling", # 'StepScaling'|'TargetTrackingScaling' TargetTrackingScalingPolicyConfiguration={ "TargetValue": 5.0, # The target value for the metric. - here the metric is - SageMakerVariantInvocationsPerInstance "CustomizedMetricSpecification": { "MetricName": "ApproximateBacklogSizePerInstance", "Namespace": "AWS/SageMaker", "Dimensions": [{"Name": "EndpointName", "Value": my_model.endpoint_name}], "Statistic": "Average", }, "ScaleInCooldown": 600, # The amount of time, in seconds, after a scale in activity completes before another scale in activity can start. "ScaleOutCooldown": 300, # ScaleOutCooldown - The amount of time, in seconds, after a scale out activity completes before another scale out activity can start. # 'DisableScaleIn': True|False - indicates whether scale in by the target tracking policy is disabled. # If the value is true, scale in is disabled and the target tracking policy won't remove capacity from the scalable resource. },
)

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

تحسين تكلفة نشر نماذج Amazon SageMaker JumpStart الأساسية باستخدام نقاط النهاية غير المتزامنة من Amazon SageMaker | أمازون ويب سيرفيسز PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.

استدعاء نقطة النهاية غير المتزامنة

لاستدعاء نقطة النهاية، يجب عليك وضع حمولة الطلب فيها خدمة تخزين أمازون البسيطة (Amazon S3) وقم بتوفير مؤشر لهذه الحمولة كجزء من InvokeEndpointAsync طلب. عند الاستدعاء، يقوم SageMaker بوضع طلب المعالجة في قائمة الانتظار وإرجاع المعرف وموقع الإخراج كاستجابة. بعد المعالجة، يضع SageMaker النتيجة في موقع Amazon S3. يمكنك اختياريًا اختيار تلقي إشعارات النجاح أو الخطأ من خلال خدمة إعلام أمازون البسيطة (أمازون SNS).

SageMaker بيثون SDK

بعد اكتمال النشر، سيعود AsyncPredictor هدف. لإجراء الاستدلال غير المتزامن، تحتاج إلى تحميل البيانات إلى Amazon S3 واستخدام predict_async() الطريقة مع S3 URI كمدخل. سوف يعود ا AsyncInferenceResponse كائن، ويمكنك التحقق من النتيجة باستخدام get_response() الأسلوب.

وبدلاً من ذلك، إذا كنت ترغب في التحقق من النتيجة بشكل دوري وإعادتها عند الإنشاء، فاستخدم الملف predict() طريقة. نستخدم هذه الطريقة الثانية في الكود التالي:

import time # Invoking the asynchronous endpoint with the SageMaker Python SDK
def query_endpoint(payload): """Query endpoint and print the response""" response = predictor.predict_async( data=payload, input_path="s3://{}/{}".format(bucket, prefix), ) while True: try: response = response.get_result() break except: print("Inference is not ready ...") time.sleep(5) print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {response[0]['generated_text']}") query_endpoint(payload)

بوتو 3

دعنا الآن نستكشف invoke_endpoint_async الطريقة من Boto3 sagemaker-runtime عميل. فهو يمكّن المطورين من استدعاء نقطة نهاية SageMaker بشكل غير متزامن، مما يوفر رمزًا مميزًا لتتبع التقدم واسترجاع الاستجابة لاحقًا. لا يقدم Boto3 طريقة لانتظار اكتمال الاستدلال غير المتزامن مثل SageMaker Python SDK's get_result() عملية. ولذلك، فإننا نستفيد من حقيقة أن Boto3 سيقوم بتخزين مخرجات الاستدلال في Amazon S3 في ملف response["OutputLocation"]. يمكننا استخدام الوظيفة التالية لانتظار كتابة ملف الاستدلال إلى Amazon S3:

import json
import time
import boto3
from botocore.exceptions import ClientError s3_client = boto3.client("s3") # Wait until the prediction is generated
def wait_inference_file(bucket, prefix): while True: try: response = s3_client.get_object(Bucket=bucket, Key=prefix) break except ClientError as ex: if ex.response['Error']['Code'] == 'NoSuchKey': print("Waiting for file to be generated...") time.sleep(5) next else: raise except Exception as e: print(e.__dict__) raise return response

باستخدام هذه الوظيفة، يمكننا الآن الاستعلام عن نقطة النهاية:

# Invoking the asynchronous endpoint with the Boto3 SDK
import boto3 sagemaker_client = boto3.client("sagemaker-runtime") # Query the endpoint function
def query_endpoint_boto3(payload): """Query endpoint and print the response""" response = sagemaker_client.invoke_endpoint_async( EndpointName=my_model.endpoint_name, InputLocation="s3://{}/{}".format(bucket, prefix), ContentType="application/json", Accept="application/json" ) output_url = response["OutputLocation"] output_prefix = "/".join(output_url.split("/")[3:]) # Read the bytes of the file from S3 in output_url with Boto3 output = wait_inference_file(bucket, output_prefix) output = json.loads(output['Body'].read())[0]['generated_text'] # Emit output print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {output}") query_endpoint_boto3(payload)

لانجشين

LangChain هو إطار عمل مفتوح المصدر تم إطلاقه في أكتوبر 2022 بواسطة Harrison Chase. إنه يبسط تطوير التطبيقات باستخدام نماذج اللغات الكبيرة (LLMs) من خلال توفير التكامل مع الأنظمة ومصادر البيانات المختلفة. يسمح LangChain بتحليل المستندات وتلخيصها وإنشاء روبوتات الدردشة وتحليل التعليمات البرمجية والمزيد. لقد اكتسبت شعبية، بمساهمات من مئات المطورين وتمويل كبير من الشركات الاستثمارية. يتيح LangChain إمكانية ربط LLMs بالمصادر الخارجية، مما يجعل من الممكن إنشاء تطبيقات ديناميكية تستجيب للبيانات. فهو يوفر المكتبات وواجهات برمجة التطبيقات والوثائق لتبسيط عملية التطوير.

توفر LangChain مكتبات وأمثلة لاستخدام نقاط نهاية SageMaker مع إطار العمل الخاص بها، مما يسهل استخدام نماذج تعلم الآلة المستضافة على SageMaker باعتبارها "عقل" السلسلة. لمعرفة المزيد حول كيفية تكامل LangChain مع SageMaker، راجع نقطة النهاية لـ SageMaker في وثائق LangChain.

أحد حدود التنفيذ الحالي لـ LangChain هو أنه لا يدعم نقاط النهاية غير المتزامنة أصلاً. لاستخدام نقطة نهاية غير متزامنة لـ LangChain، يتعين علينا تحديد فئة جديدة، SagemakerAsyncEndpoint، الذي يمتد إلى SagemakerEndpoint الفصل متاح بالفعل في LangChain. بالإضافة إلى ذلك، نحن نقدم المعلومات التالية:

  • مجموعة S3 والبادئة حيث سيقوم الاستدلال غير المتزامن بتخزين المدخلات (والمخرجات)
  • الحد الأقصى لعدد الثواني للانتظار قبل انتهاء المهلة
  • An updated _call() وظيفة للاستعلام عن نقطة النهاية مع invoke_endpoint_async() بدلا من invoke_endpoint()
  • طريقة لتنبيه نقطة النهاية غير المتزامنة إذا كانت في بداية باردة (تصغيرها إلى الصفر)

لمراجعة المنشأة حديثا SagemakerAsyncEndpoint، يمكنك إجراء فحص sagemaker_async_endpoint.py ملف متاح على جيثب.

from typing import Dict
from langchain import PromptTemplate
from langchain.llms.sagemaker_endpoint import LLMContentHandler
from langchain.chains import LLMChain
from sagemaker_async_endpoint import SagemakerAsyncEndpoint class ContentHandler(LLMContentHandler): content_type:str = "application/json" accepts:str = "application/json" len_prompt:int = 0 def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes: self.len_prompt = len(prompt) input_str = json.dumps({"inputs": prompt, "parameters": {"max_new_tokens": 100, "do_sample": False, "repetition_penalty": 1.1}}) return input_str.encode('utf-8') def transform_output(self, output: bytes) -> str: response_json = output.read() res = json.loads(response_json) ans = res[0]['generated_text'] return ans chain = LLMChain( llm=SagemakerAsyncEndpoint( input_bucket=bucket, input_prefix=prefix, endpoint_name=my_model.endpoint_name, region_name=sagemaker.Session().boto_region_name, content_handler=ContentHandler(), ), prompt=PromptTemplate( input_variables=["query"], template="{query}", ),
) print(chain.run(payload['inputs']))

تنظيف

عند الانتهاء من اختبار إنشاء الاستدلالات من نقطة النهاية، تذكر حذف نقطة النهاية لتجنب تكبد رسوم إضافية:

predictor.delete_endpoint()

وفي الختام

عند نشر نماذج أساسات كبيرة مثل TII Falcon، يعد تحسين التكلفة أمرًا بالغ الأهمية. تتطلب هذه النماذج أجهزة قوية وسعة ذاكرة كبيرة، مما يؤدي إلى ارتفاع تكاليف البنية التحتية. يعمل الاستدلال غير المتزامن SageMaker، وهو خيار نشر يعالج الطلبات بشكل غير متزامن، على تقليل النفقات عن طريق رفع عدد المثيلات إلى الصفر في حالة عدم وجود طلبات معلقة. في هذا المنشور، أوضحنا كيفية نشر نماذج SageMaker JumpStart الأساسية الكبيرة إلى نقاط النهاية غير المتزامنة لـ SageMaker. لقد قدمنا ​​أمثلة للتعليمات البرمجية باستخدام SageMaker Python SDK وBoto3 وLangChain لتوضيح الطرق المختلفة لاستدعاء نقاط النهاية غير المتزامنة واسترداد النتائج. تتيح هذه التقنيات للمطورين والباحثين تحسين التكاليف مع استخدام قدرات النماذج الأساسية لأنظمة فهم اللغة المتقدمة.

لمعرفة المزيد حول الاستدلال غير المتزامن وSageMaker JumpStart، راجع المنشورات التالية:


عن المؤلف

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

الطابع الزمني:

اكثر من التعلم الآلي من AWS