بهینه سازی هزینه استقرار مدل های پایه آمازون SageMaker JumpStart با نقاط پایانی ناهمزمان Amazon SageMaker | خدمات وب آمازون

بهینه سازی هزینه استقرار مدل های پایه آمازون SageMaker JumpStart با نقاط پایانی ناهمزمان Amazon SageMaker | خدمات وب آمازون

موفقیت برنامه‌های هوش مصنوعی مولد در طیف گسترده‌ای از صنایع، توجه و علاقه شرکت‌هایی را در سراسر جهان به خود جلب کرده است که به دنبال بازتولید و پیشی گرفتن از دستاوردهای رقبا یا حل موارد استفاده جدید و هیجان‌انگیز هستند. این مشتریان به دنبال مدل های پایه مانند TII Falcon، Stable Diffusion XL یا GPT-3.5 OpenAI هستند، به عنوان موتورهایی که نوآوری مولد هوش مصنوعی را تامین می کنند.

مدل‌های بنیادی، دسته‌ای از مدل‌های هوش مصنوعی مولد هستند که به لطف حجم وسیعی از داده‌های بدون ساختار که روی آن‌ها آموزش دیده‌اند، قادر به درک و تولید محتوای مشابه انسان هستند. این مدل‌ها انقلابی در وظایف مختلف بینایی کامپیوتر (CV) و پردازش زبان طبیعی (NLP) از جمله تولید تصویر، ترجمه و پاسخ‌گویی به سؤالات ایجاد کرده‌اند. آنها به عنوان بلوک های ساختمانی برای بسیاری از برنامه های کاربردی هوش مصنوعی عمل می کنند و به یک جزء حیاتی در توسعه سیستم های هوشمند پیشرفته تبدیل شده اند.

با این حال، استقرار مدل‌های پایه می‌تواند با چالش‌های مهمی همراه باشد، به‌ویژه از نظر هزینه و نیاز به منابع. این مدل‌ها به دلیل اندازه‌شان شناخته می‌شوند که اغلب از صدها میلیون تا میلیاردها پارامتر متغیر است. اندازه بزرگ آنها به منابع محاسباتی گسترده ای از جمله سخت افزار قدرتمند و ظرفیت حافظه قابل توجه نیاز دارد. در واقع، استقرار مدل‌های پایه معمولاً به حداقل یک (اغلب بیشتر) GPU نیاز دارد تا بار محاسباتی را به طور مؤثر مدیریت کند. به عنوان مثال، مدل TII Falcon-40B Instruct به حداقل یک نمونه ml.g5.12xlarge نیاز دارد تا با موفقیت در حافظه بارگذاری شود، اما بهترین عملکرد را با نمونه های بزرگتر دارد. در نتیجه، بازگشت سرمایه (ROI) از استقرار و نگهداری این مدل‌ها می‌تواند برای اثبات ارزش کسب‌وکار بسیار کم باشد، به‌ویژه در طول چرخه‌های توسعه یا برای بارهای کاری شدید. این به دلیل هزینه‌های جاری داشتن نمونه‌های مجهز به GPU برای جلسات طولانی، احتمالاً 24/7 است.

اوایل سال جاری اعلام کردیم بستر آمازون، یک API بدون سرور برای دسترسی به مدل های پایه آمازون و شرکای هوش مصنوعی ما. اگرچه در حال حاضر در پیش‌نمایش خصوصی است، API بدون سرور آن به شما امکان می‌دهد از مدل‌های پایه آمازون، Anthropic، Stability AI و AI21 استفاده کنید، بدون اینکه نیازی به استقرار هیچ نقطه پایانی داشته باشید. با این حال، مدل‌های منبع باز از جوامعی مانند Hugging Face بسیار رشد کرده‌اند و هر یک از آنها از طریق Amazon Bedrock در دسترس قرار نگرفته‌اند.

در این پست، ما این موقعیت ها را هدف قرار می دهیم و با استقرار مدل های فونداسیون بزرگ، مشکل ریسک هزینه های بالا را حل می کنیم. آمازون SageMaker نقاط انتهایی ناهمزمان از جانب Amazon SageMaker JumpStart. این می‌تواند به کاهش هزینه‌های معماری کمک کند، و به نقطه پایانی اجازه می‌دهد فقط زمانی که درخواست‌ها در صف هستند و برای مدت کوتاهی اجرا می‌شوند، در حالی که وقتی هیچ درخواستی منتظر سرویس نیست، به صفر می‌رسد. این برای بسیاری از موارد استفاده عالی به نظر می رسد. با این حال، نقطه پایانی که به صفر کاهش یافته است، قبل از ارائه استنتاج، زمان شروع سرد را معرفی می کند.

بررسی اجمالی راه حل

نمودار زیر معماری راه حل ما را نشان می دهد.

بهینه سازی هزینه استقرار مدل های پایه آمازون SageMaker JumpStart با نقاط پایانی ناهمزمان آمازون SageMaker | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

معماری ما بسیار ساده است:

  • رابط کاربری یک نوت بوک است که می تواند با یک رابط کاربری وب ساخته شده بر روی Streamlit یا فناوری مشابه جایگزین شود. در مورد ما، نوت بوک یک Amazon SageMaker Studio نوت بوک، که روی یک نمونه ml.m5.large با هسته CPU PyTorch 2.0 Python 3.10 اجرا می شود.
  • این نوت بوک به سه طریق نقطه پایانی را جستجو می کند: SageMaker Python SDK، AWS SDK برای Python (Boto3) و LangChain.
  • نقطه پایانی به صورت ناهمزمان در SageMaker اجرا می شود، و در نقطه پایانی، مدل Falcon-40B Instruct را مستقر می کنیم. این در حال حاضر از نظر مدل‌های آموزشی پیشرفته است و در SageMaker JumpStart موجود است. یک فراخوانی API به ما امکان می دهد مدل را در نقطه پایانی مستقر کنیم.

استنتاج ناهمزمان SageMaker چیست

استنتاج ناهمزمان SageMaker یکی از چهار گزینه استقرار در SageMaker به همراه نقاط پایانی بلادرنگ، استنتاج دسته ای و استنتاج بدون سرور است. برای کسب اطلاعات بیشتر در مورد گزینه های مختلف استقرار، مراجعه کنید استقرار مدل ها برای استنتاج.

استنتاج ناهمزمان SageMaker درخواست‌های دریافتی را صف می‌کشد و آنها را به‌صورت ناهمزمان پردازش می‌کند، که این گزینه را برای درخواست‌هایی با حجم بار بزرگ تا 1 گیگابایت، زمان‌های پردازش طولانی و الزامات تأخیر در زمان واقعی ایده‌آل می‌کند. با این حال، مزیت اصلی که هنگام برخورد با مدل‌های فونداسیون بزرگ، به‌ویژه در حین اثبات مفهوم (POC) یا در حین توسعه، ارائه می‌کند، قابلیت پیکربندی استنتاج ناهمزمان برای مقیاس‌پذیری تا تعداد نمونه‌های صفر در زمانی است که هیچ درخواستی وجود ندارد. فرآیند، در نتیجه صرفه جویی در هزینه ها. برای اطلاعات بیشتر در مورد استنتاج ناهمزمان SageMaker، به استنتاج ناهمزمان. نمودار زیر این معماری را نشان می دهد.

بهینه سازی هزینه استقرار مدل های پایه آمازون SageMaker JumpStart با نقاط پایانی ناهمزمان آمازون SageMaker | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

برای استقرار یک نقطه پایانی استنتاج ناهمزمان، باید یک یک ایجاد کنید 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 را نشان می دهد.

بهینه سازی هزینه استقرار مدل های پایه آمازون SageMaker JumpStart با نقاط پایانی ناهمزمان آمازون SageMaker | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

مدل را مستقر کنید

اولین قدم ما این است که مدل را در 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، تأیید کنید که این خط‌مشی با موفقیت تنظیم شده است نقاط پایان زیر استنباط در صفحه ناوبری، و به دنبال نقطه پایانی که به تازگی مستقر کرده ایم می گردیم.

بهینه سازی هزینه استقرار مدل های پایه آمازون SageMaker JumpStart با نقاط پایانی ناهمزمان آمازون SageMaker | خدمات وب آمازون هوش داده پلاتو بلاک چین. جستجوی عمودی Ai.

نقطه پایانی ناهمزمان را فراخوانی کنید

برای فراخوانی نقطه پایانی، باید بار درخواست را در آن قرار دهید سرویس ذخیره سازی ساده آمازون (Amazon S3) و یک اشاره گر به این محموله به عنوان بخشی از InvokeEndpointAsync درخواست. پس از فراخوانی، SageMaker درخواست را برای پردازش در صف قرار می دهد و یک شناسه و مکان خروجی را به عنوان پاسخ برمی گرداند. پس از پردازش، SageMaker نتیجه را در محل آمازون S3 قرار می دهد. شما می توانید به صورت اختیاری انتخاب کنید که اعلان های موفقیت یا خطا را دریافت کنید سرویس اطلاع رسانی ساده آمازون (Amazon SNS).

SageMaker Python 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)

Boto3

حال بیایید به بررسی آن بپردازیم invoke_endpoint_async روش از Boto3 sagemaker-runtime مشتری. این برنامه توسعه دهندگان را قادر می سازد تا به صورت ناهمزمان یک نقطه پایانی SageMaker را فراخوانی کنند و رمزی برای ردیابی پیشرفت و بازیابی پاسخ در آینده ارائه کنند. Boto3 راهی برای انتظار برای تکمیل استنتاج ناهمزمان مانند SageMaker Python SDK ارائه نمی دهد. get_result() عمل. بنابراین، ما از این واقعیت استفاده می کنیم که Boto3 خروجی استنتاج را در آمازون 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

LangChain یک چارچوب متن باز است که در اکتبر 2022 توسط هریسون چیس راه اندازی شد. توسعه برنامه های کاربردی با استفاده از مدل های زبان بزرگ (LLM) را با ارائه یکپارچه سازی با سیستم ها و منابع داده های مختلف ساده می کند. LangChain امکان تجزیه و تحلیل اسناد، خلاصه سازی، ایجاد چت بات، تجزیه و تحلیل کد و موارد دیگر را فراهم می کند. با مشارکت صدها توسعه‌دهنده و سرمایه‌گذاری قابل توجه از سوی شرکت‌های مخاطره‌آمیز، محبوبیت پیدا کرده است. LangChain اتصال LLM ها را با منابع خارجی امکان پذیر می کند و ایجاد برنامه های کاربردی پویا و پاسخگو به داده ها را ممکن می سازد. این کتابخانه ها، API ها و اسناد را برای ساده کردن فرآیند توسعه ارائه می دهد.

LangChain کتابخانه ها و مثال هایی را برای استفاده از نقاط پایانی SageMaker با چارچوب خود ارائه می دهد و استفاده از مدل های ML میزبانی شده در SageMaker را به عنوان "مغز" زنجیره آسان تر می کند. برای کسب اطلاعات بیشتر در مورد نحوه ادغام LangChain با SageMaker، به ادامه مطلب مراجعه کنید SageMaker Endpoint در مستندات 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 است. او در بروکسل مستقر است و از نزدیک با مشتریان در سرتاسر بنلوکس کار می کند. او از زمانی که خیلی جوان بود یک توسعه دهنده بوده و از سن ۷ سالگی شروع به کدنویسی کرد. او یادگیری AI/ML را در دانشگاه شروع کرد و از آن زمان عاشق آن شد.

تمبر زمان:

بیشتر از آموزش ماشین AWS