מטב את עלות הפריסה של דגמי היסוד של Amazon SageMaker JumpStart עם נקודות קצה אסינכרוניות של Amazon SageMaker | שירותי האינטרנט של אמזון

מטב את עלות הפריסה של דגמי היסוד של Amazon SageMaker JumpStart עם נקודות קצה אסינכרוניות של Amazon SageMaker | שירותי האינטרנט של אמזון

הצלחתם של יישומי בינה מלאכותית במגוון רחב של תעשיות משכה את תשומת הלב והעניין של חברות ברחבי העולם המחפשות לשכפל ולהתעלות על הישגי המתחרים או לפתור מקרי שימוש חדשים ומלהיבים. לקוחות אלה בוחנים דגמי יסוד, כגון TII Falcon, Stable Diffusion XL, או GPT-3.5 של OpenAI, כמנועים המניעים את חדשנות הבינה המלאכותית.

מודלים של בסיס הם סוג של מודלים מחוללים בינה מלאכותית המסוגלים להבין ולייצר תוכן דמוי אדם, הודות לכמויות העצומות של נתונים לא מובנים עליהם הוכשרו. מודלים אלה חוללו מהפכה במשימות שונות של ראייה ממוחשבת (CV) ועיבוד שפה טבעית (NLP), כולל יצירת תמונות, תרגום ומענה לשאלות. הם משמשים כאבני הבניין ליישומי AI רבים והפכו למרכיב מכריע בפיתוח מערכות חכמות מתקדמות.

עם זאת, פריסת מודלים של בסיס יכולה לבוא עם אתגרים משמעותיים, במיוחד במונחים של עלות ומשאבים. דגמים אלו ידועים בגודלם, לרוב נע בין מאות מיליונים למיליארדי פרמטרים. הגודל הגדול שלהם דורש משאבי חישוב נרחבים, כולל חומרה רבת עוצמה וקיבולת זיכרון משמעותית. למעשה, פריסת מודלים של בסיס בדרך כלל דורשת לפחות GPU אחד (לעיתים קרובות יותר) כדי להתמודד עם העומס החישובי ביעילות. לדוגמה, מודל TII Falcon-40B Instruct דורש לפחות מופע ml.g5.12xlarge כדי להיטען לזיכרון בהצלחה, אך מתפקד בצורה הטובה ביותר עם מופעים גדולים יותר. כתוצאה מכך, ההחזר על ההשקעה (ROI) של פריסה ותחזוקה של מודלים אלה עשוי להיות נמוך מכדי להוכיח ערך עסקי, במיוחד במהלך מחזורי פיתוח או עבור עומסי עבודה קפיציים. זה נובע מהעלויות השוטפות של קיום מופעים המופעלים על ידי GPU עבור הפעלות ארוכות, אולי 24/7.

מוקדם יותר השנה, הודענו סלע אמזון, API ללא שרת לגישה לדגמי יסוד מאמזון ומשותפי הבינה המלאכותית שלנו. למרות שהוא נמצא כרגע ב-Private Preview, ה-API שלו ללא שרת מאפשר לך להשתמש בדגמי יסוד מאמזון, Anthropic, Stability AI ו-AI21, מבלי שתצטרך לפרוס נקודות קצה כלשהן בעצמך. עם זאת, דגמי קוד פתוח מקהילות כמו Hugging Face גדלו מאוד, ולא כל אחד מהם הפך זמין דרך Amazon Bedrock.

בפוסט זה, אנו ממקדים את המצבים הללו ופותרים את בעיית הסיכון בעלויות גבוהות על ידי פריסת מודלים גדולים של יסודות אמזון SageMaker נקודות קצה אסינכרוניות החל מ- אמזון SageMaker JumpStart. זה יכול לעזור לקצץ בעלויות של הארכיטקטורה, ולאפשר לנקודת הקצה לפעול רק כאשר בקשות נמצאות בתור ולמשך זמן קצר עד לחייו, תוך ירידה לאפס כאשר אין בקשות ממתינות לטיפול. זה נשמע נהדר עבור הרבה מקרי שימוש; עם זאת, נקודת קצה שהצטמצמה לאפס תציג זמן התחלה קרה לפני שתוכל לשרת מסקנות.

סקירת פתרונות

התרשים הבא ממחיש את ארכיטקטורת הפתרונות שלנו.

מטב את עלות הפריסה של דגמי היסוד של Amazon SageMaker JumpStart עם נקודות קצה אסינכרוניות של Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

הארכיטקטורה שאנו פורסים היא פשוטה מאוד:

  • ממשק המשתמש הוא מחברת, אותה ניתן להחליף בממשק משתמש אינטרנטי הבנוי על טכנולוגיית Streamlit או דומה. במקרה שלנו, המחברת היא סטודיו SageMaker של אמזון מחברת, הפועלת על מופע ml.m5.large עם ליבת המעבד PyTorch 2.0 Python 3.10.
  • המחברת שואלת את נקודת הקצה בשלוש דרכים: SageMaker Python SDK, AWS SDK עבור Python (Boto3) ו-LangChain.
  • נקודת הקצה פועלת באופן אסינכרוני ב- SageMaker, ובנקודת הקצה, אנו פורסים את מודל Falcon-40B Instruct. נכון לעכשיו זה המצב החדש מבחינת דגמי הדרכה וזמין ב- SageMaker JumpStart. קריאת API בודדת מאפשרת לנו לפרוס את המודל בנקודת הקצה.

מהי מסקנות אסינכרוניות של SageMaker

מסקנות אסינכרוניות של SageMaker היא אחת מארבע אפשרויות הפריסה ב- SageMaker, יחד עם נקודות קצה בזמן אמת, הסקת אצווה והסקת שרת ללא שרת. למידע נוסף על אפשרויות הפריסה השונות, עיין ב פרוס מודלים עבור Inference.

מסקנות אסינכרוניות של SageMaker מעמידה בתור בקשות נכנסות ומעבדת אותן באופן אסינכרוני, מה שהופך את האפשרות הזו לאידיאלית עבור בקשות עם גדלים של עומס גדול של עד 1 GB, זמני עיבוד ארוכים ודרישות השהייה כמעט בזמן אמת. עם זאת, היתרון העיקרי שהוא מספק כאשר עוסקים במודלים גדולים של יסודות, במיוחד במהלך הוכחת קונספט (POC) או במהלך פיתוח, הוא היכולת להגדיר הסקה א-סינכרונית להכנס למספר מופעים של אפס כאשר אין בקשות תהליך, ובכך לחסוך בעלויות. למידע נוסף על מסקנות אסינכרוניות של SageMaker, עיין ב הסקה אסינכרונית. התרשים הבא ממחיש את הארכיטקטורה הזו.

מטב את עלות הפריסה של דגמי היסוד של Amazon SageMaker JumpStart עם נקודות קצה אסינכרוניות של Amazon SageMaker | Amazon Web Services 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.

מטב את עלות הפריסה של דגמי היסוד של Amazon SageMaker JumpStart עם נקודות קצה אסינכרוניות של Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

פרוס את הדגם

הצעד הראשון שלנו הוא לפרוס את המודל ל- SageMaker. לשם כך, אנו יכולים להשתמש בממשק המשתמש של SageMaker JumpStart או ב- SageMaker Python SDK, המספק API שבו נוכל להשתמש כדי לפרוס את המודל לנקודת הקצה האסינכרונית:

%%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. תחילה עליך לרשום את גרסת נקודת הקצה שלך עם קנה מידה אוטומטי של יישום, להגדיר מדיניות קנה מידה ולאחר מכן להחיל את מדיניות קנה המידה. בתצורה זו, אנו משתמשים במדד מותאם אישית באמצעות 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 | Amazon Web Services PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

הפעל את נקודת הקצה האסינכרונית

כדי להפעיל את נקודת הקצה, עליך להציב את מטען הבקשה שירות אחסון פשוט של אמזון (Amazon S3) וספק מצביע למטען זה כחלק מה- InvokeEndpointAsync בַּקָשָׁה. עם הפניה, SageMaker מעמיד את הבקשה בתור לעיבוד ומחזיר מזהה ומיקום פלט כתגובה. לאחר העיבוד, SageMaker ממקם את התוצאה במיקום Amazon S3. אתה יכול לבחור לקבל הודעות הצלחה או שגיאה עם שירות התראה פשוט של אמזון (Amazon SNS).

SageMaker Python SDK

לאחר השלמת הפריסה, הוא יחזיר an AsyncPredictor לְהִתְנַגֵד. כדי לבצע הסקה אסינכרונית, עליך להעלות נתונים לאמזון 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)

Boto3

כעת נחקור את invoke_endpoint_async שיטה של ​​Boto3 sagemaker-runtime לָקוּחַ. זה מאפשר למפתחים להפעיל באופן אסינכרוני נקודת קצה של SageMaker, ולספק אסימון למעקב אחר התקדמות ושליפה של התגובה מאוחר יותר. Boto3 אינו מציע דרך להמתין עד להשלמת ההסקה האסינכרונית כמו של SageMaker Python SDK get_result() מבצע. לכן, אנו מנצלים את העובדה שבוטו3 יאחסן את פלט ההסקה באמזון S3 ב- response["OutputLocation"]. אנו יכולים להשתמש בפונקציה הבאה כדי להמתין עד שקובץ ההסקה ייכתב לאמזון 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

LangChain היא מסגרת קוד פתוח שהושקה באוקטובר 2022 על ידי האריסון צ'ייס. זה מפשט את הפיתוח של יישומים באמצעות מודלים של שפה גדולה (LLMs) על ידי מתן אינטגרציות עם מערכות ומקורות נתונים שונים. LangChain מאפשרת ניתוח מסמכים, סיכום, יצירת צ'טבוט, ניתוח קוד ועוד. הוא צבר פופולריות, עם תרומות ממאות מפתחים ומימון משמעותי מחברות סיכון. LangChain מאפשרת חיבור של LLMs עם מקורות חיצוניים, מה שמאפשר ליצור יישומים דינמיים המגיבים לנתונים. הוא מציע ספריות, ממשקי API ותיעוד כדי לייעל את תהליך הפיתוח.

LangChain מספקת ספריות ודוגמאות לשימוש בנקודות קצה של SageMaker עם המסגרת שלה, מה שמקל על השימוש במודלים של ML המתארחים ב- SageMaker כ"מוח" של השרשרת. למידע נוסף על האופן שבו LangChain משתלב עם SageMaker, עיין ב- נקודת קצה של SageMaker בתיעוד של LangChain.

אחד המגבלות של היישום הנוכחי של LangChain הוא שהוא אינו תומך בנקודות קצה אסינכרוניות באופן מקורי. כדי להשתמש בנקודת קצה אסינכרונית ל-LangChain, עלינו להגדיר מחלקה חדשה, SagemakerAsyncEndpoint, שמרחיב את SagemakerEndpoint מחלקה כבר זמינה ב-LangChain. בנוסף, אנו מספקים את המידע הבא:

  • דלי S3 והקידומת שבהם היסק אסינכרוני יאחסן את הכניסות (והיציאות)
  • מספר שניות מקסימלי להמתנה לפני תום הזמן הקצוב
  • An updated _call() פונקציה לשאילתה של נקודת הקצה איתה invoke_endpoint_async() במקום invoke_endpoint()
  • דרך להעיר את נקודת הקצה האסינכרונית אם היא בהתחלה קרה (מוקטנת לאפס)

כדי לסקור את החדש שנוצר SagemakerAsyncEndpoint, אתה יכול לבדוק את sagemaker_async_endpoint.py פילה זמין ב- GitHub.

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, עיין בפוסטים הבאים:


על הסופר

תמונה של דוידדויד גליטלי הוא אדריכל פתרונות מומחה עבור AI/ML באזור EMEA. הוא מבוסס בבריסל ועובד בשיתוף פעולה הדוק עם לקוחות ברחבי בנלוקס. הוא מפתח מאז שהיה צעיר מאוד, התחיל לקוד בגיל 7. הוא התחיל ללמוד AI/ML באוניברסיטה, ומאז התאהב בזה.

בול זמן:

עוד מ למידת מכונות AWS