Оптимізуйте вартість розгортання базових моделей Amazon SageMaker JumpStart за допомогою асинхронних кінцевих точок Amazon SageMaker | Веб-сервіси Amazon

Оптимізуйте вартість розгортання базових моделей Amazon SageMaker JumpStart за допомогою асинхронних кінцевих точок Amazon SageMaker | Веб-сервіси Amazon

Успіх генеративних програм штучного інтелекту в багатьох галузях привернув увагу та інтерес компаній у всьому світі, які прагнуть відтворити та перевершити досягнення конкурентів або розв’язати нові та захоплюючі випадки використання. Ці клієнти шукають базові моделі, такі як TII Falcon, Stable Diffusion XL або OpenAI GPT-3.5, як механізми, що забезпечують генеративні інновації ШІ.

Основні моделі — це клас генеративних моделей штучного інтелекту, які здатні розуміти та генерувати людський вміст завдяки величезній кількості неструктурованих даних, на яких їх навчали. Ці моделі революціонізували різні завдання комп’ютерного зору (CV) і обробки природної мови (NLP), включаючи створення зображень, переклад і відповіді на запитання. Вони служать будівельними блоками для багатьох додатків AI і стали вирішальним компонентом у розробці передових інтелектуальних систем.

Однак розгортання базових моделей може стикатися зі значними труднощами, особливо з точки зору витрат і вимог до ресурсів. Ці моделі відомі своїм розміром, який часто варіюється від сотень мільйонів до мільярдів параметрів. Їхній великий розмір вимагає великих обчислювальних ресурсів, включаючи потужне апаратне забезпечення та значний обсяг пам’яті. Насправді для розгортання основних моделей зазвичай потрібен принаймні один (часто більше) графічний процесор для ефективної обробки обчислювального навантаження. Наприклад, модель TII Falcon-40B Instruct вимагає принаймні екземпляра ml.g5.12xlarge для успішного завантаження в пам’ять, але найкраще працює з більшими екземплярами. Як наслідок, рентабельність інвестицій (ROI) від розгортання та підтримки цих моделей може бути занадто низькою, щоб підтвердити цінність для бізнесу, особливо під час циклів розробки або при різких навантаженнях. Це пов’язано з експлуатаційними витратами на наявність екземплярів із живленням графічного процесора для тривалих сеансів, потенційно 24/7.

На початку цього року ми оголосили Amazon Bedrock, безсерверний API для доступу до базових моделей від Amazon і наших партнерів із створення AI. Незважаючи на те, що наразі він знаходиться в режимі приватного попереднього перегляду, його безсерверний API дозволяє використовувати базові моделі від Amazon, Anthropic, Stability AI та AI21, не розгортаючи будь-які кінцеві точки самостійно. Однак моделі з відкритим кодом від таких спільнот, як Hugging Face, значно розширюються, і не кожна з них стала доступною через Amazon Bedrock.

У цьому дописі ми розглянемо ці ситуації та вирішимо проблему ризику високих витрат шляхом розгортання великих фундаментальних моделей для Amazon SageMaker асинхронні кінцеві точки від Amazon SageMaker JumpStart. Це може допомогти скоротити витрати на архітектуру, дозволяючи кінцевій точці працювати лише тоді, коли запити знаходяться в черзі та протягом короткого часу життя, одночасно зменшуючи масштаб до нуля, коли жодних запитів не чекає на обслуговування. Це звучить чудово для багатьох випадків використання; однак кінцева точка, яка зменшена до нуля, запровадить час холодного запуску, перш ніж вона зможе обслуговувати висновки.

Огляд рішення

Наступна схема ілюструє нашу архітектуру рішення.

Оптимізуйте вартість розгортання базових моделей Amazon SageMaker JumpStart за допомогою асинхронних кінцевих точок Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Архітектура, яку ми розгортаємо, дуже проста:

  • Інтерфейс користувача — це блокнот, який можна замінити веб-інтерфейсом, створеним на основі Streamlit або подібної технології. У нашому випадку це зошит Студія Amazon 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 разом із кінцевими точками реального часу, пакетним висновком і безсерверним висновком. Щоб дізнатися більше про різні варіанти розгортання, див Розгортання моделей для висновків.

Асинхронний висновок SageMaker ставить вхідні запити в чергу та обробляє їх асинхронно, що робить цей параметр ідеальним для запитів із великими розмірами корисного навантаження до 1 ГБ, тривалим часом обробки та вимогами до затримки майже в реальному часі. Однак основною перевагою, яку він надає при роботі з великими базовими моделями, особливо під час перевірки концепції (POC) або під час розробки, є можливість налаштувати асинхронний висновок для масштабування до нульової кількості екземплярів, коли немає запитів до процесу, тим самим заощаджуючи витрати. Додаткову інформацію про асинхронний висновок SageMaker див Асинхронний висновок. Наступна діаграма ілюструє цю архітектуру.

Оптимізуйте вартість розгортання базових моделей Amazon SageMaker JumpStart за допомогою асинхронних кінцевих точок Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Вертикальний пошук. 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.

Оптимізуйте вартість розгортання базових моделей Amazon SageMaker JumpStart за допомогою асинхронних кінцевих точок Amazon SageMaker | Amazon Web Services PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Розгортання моделі

Наш перший крок — це розгортання моделі в SageMaker. Для цього ми можемо використати UI для 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. Щоб переконатися, що наша кінцева точка може зменшити масштаб до нуля, нам потрібно налаштувати автоматичне масштабування на асинхронній кінцевій точці за допомогою автоматичного масштабування програми. Спершу вам потрібно зареєструвати свій варіант кінцевої точки в програмі Auto Scaling, визначити політику масштабування, а потім застосувати політику масштабування. У цій конфігурації ми використовуємо спеціальну метрику за допомогою CustomizedMetricSpecification, Називаний ApproximateBacklogSizePerInstance, як показано в наступному коді. Для детального переліку Amazon 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. Вертикальний пошук. Ai.

Викликати асинхронну кінцеву точку

Щоб викликати кінцеву точку, потрібно розмістити корисне навантаження запиту Служба простого зберігання Amazon (Amazon S3) і надайте вказівник на це корисне навантаження як частину InvokeEndpointAsync запит. Після виклику SageMaker ставить запит у чергу на обробку та повертає ідентифікатор і місце виведення як відповідь. Після обробки SageMaker розміщує результат у розташуванні Amazon S3. Додатково можна вибрати сповіщення про успіх або помилку Служба простих сповіщень Amazon (Amazon SNS).

SageMaker Python SDK

Після завершення розгортання він поверне AsyncPredictor об'єкт. Щоб виконати асинхронний висновок, вам потрібно завантажити дані в Amazon S3 і використовувати predict_async() метод із S3 URI як вхід. Він поверне an 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 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

LangChain — це фреймворк із відкритим вихідним кодом, запущений Харрісоном Чейзом у жовтні 2022 року. Він спрощує розробку додатків з використанням великих мовних моделей (LLM), забезпечуючи інтеграцію з різними системами та джерелами даних. LangChain дозволяє аналізувати документи, підсумовувати, створювати чат-ботів, аналізувати код тощо. Він набув популярності завдяки внескам сотень розробників і значному фінансуванню венчурними фірмами. LangChain дозволяє підключати LLM до зовнішніх джерел, що дозволяє створювати динамічні додатки, що реагують на дані. Він пропонує бібліотеки, 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. Ми надали приклади коду з використанням SDK SageMaker Python, Boto3 і LangChain, щоб проілюструвати різні методи виклику асинхронних кінцевих точок і отримання результатів. Ці методи дозволяють розробникам і дослідникам оптимізувати витрати, використовуючи можливості базових моделей для передових систем розуміння мови.

Щоб дізнатися більше про асинхронний висновок і SageMaker JumpStart, перегляньте такі публікації:


Про автора

Зображення ДавидаДавіде Галлітеллі є спеціалістом архітектора рішень для AI/ML у регіоні EMEA. Він базується в Брюсселі і тісно співпрацює з клієнтами по всьому Бенілюксу. Він був розробником з самого дитинства, почавши кодувати у віці 7 років. Він почав вивчати AI/ML в університеті і з тих пір закохався в нього.

Часова мітка:

Більше від AWS Машинне навчання