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

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

Успех приложений генеративного искусственного интеллекта в широком спектре отраслей привлек внимание и интерес компаний по всему миру, которые стремятся воспроизвести и превзойти достижения конкурентов или решить новые интересные варианты использования. Эти клиенты рассматривают базовые модели, такие как TII Falcon, Stable Diffusion XL или GPT-3.5 от OpenAI, в качестве двигателей, обеспечивающих инновации в области генеративного искусственного интеллекта.

Базовые модели — это класс генеративных моделей искусственного интеллекта, которые способны понимать и генерировать контент, подобный человеческому, благодаря огромному количеству неструктурированных данных, на которых они обучались. Эти модели произвели революцию в различных задачах компьютерного зрения (CV) и обработки естественного языка (NLP), включая генерацию изображений, перевод и ответы на вопросы. Они служат строительными блоками для многих приложений искусственного интеллекта и стали важнейшим компонентом в разработке передовых интеллектуальных систем.

Однако внедрение моделей фундамента может столкнуться с серьезными проблемами, особенно с точки зрения затрат и требований к ресурсам. Эти модели известны своим размером, часто варьирующимся от сотен миллионов до миллиардов параметров. Их большой размер требует обширных вычислительных ресурсов, включая мощное оборудование и значительный объем памяти. Фактически, для развертывания базовых моделей обычно требуется как минимум один (часто больше) графический процессор для эффективной обработки вычислительной нагрузки. Например, модель TII Falcon-40B Instruct требует для успешной загрузки в память как минимум экземпляра ml.g5.12xlarge, но лучше всего работает с экземплярами большего размера. В результате окупаемость инвестиций (ROI) в развертывание и поддержку этих моделей может оказаться слишком низкой, чтобы доказать ценность для бизнеса, особенно во время циклов разработки или при резких рабочих нагрузках. Это связано с эксплуатационными расходами на использование экземпляров с графическим процессором для длительных сеансов, возможно, круглосуточно, 24 дней в неделю.

Ранее в этом году мы объявили Коренная порода Амазонки, бессерверный API для доступа к базовым моделям от Amazon и наших партнеров по генеративному ИИ. Хотя в настоящее время он находится в режиме Private Preview, его бессерверный API позволяет использовать базовые модели от Amazon, Anthropic, Stability AI и AI21 без необходимости самостоятельного развертывания каких-либо конечных точек. Однако модели с открытым исходным кодом от таких сообществ, как Hugging Face, стремительно растут, и не каждая из них доступна через Amazon Bedrock.

В этом посте мы рассматриваем такие ситуации и решаем проблему риска высоких затрат путем развертывания крупных моделей фундамента для Создатель мудреца Амазонки асинхронные конечные точки от Amazon SageMaker JumpStart. Это может помочь сократить затраты на архитектуру, позволяя конечной точке работать только тогда, когда запросы находятся в очереди и в течение короткого времени жизни, а масштабирование сокращается до нуля, когда запросы не ожидают обслуживания. Это звучит отлично для многих случаев использования; однако конечная точка, масштаб которой уменьшен до нуля, введет время холодного запуска, прежде чем сможет обслуживать выводы.

Обзор решения

На следующей диаграмме показана архитектура нашего решения.

Оптимизируйте затраты на развертывание базовых моделей Amazon SageMaker JumpStart с помощью асинхронных конечных точек Amazon SageMaker | Веб-сервисы Amazon PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Архитектура, которую мы развертываем, очень проста:

  • Пользовательский интерфейс представляет собой блокнот, который можно заменить веб-интерфейсом, созданным на основе Streamlit или аналогичной технологии. В нашем случае блокнот представляет собой Студия Amazon SageMaker ноутбук, работающий на экземпляре ml.m5.large с ядром ЦП PyTorch 2.0 Python 3.10.
  • Блокнот запрашивает конечную точку тремя способами: с помощью SageMaker Python SDK, AWS SDK для Python (Boto3) и LangChain.
  • Конечная точка работает асинхронно в SageMaker, и на конечной точке мы развертываем модель Instruct Falcon-40B. В настоящее время это самый современный вариант моделей инструкций, доступный в SageMaker JumpStart. Один вызов API позволяет нам развернуть модель на конечной точке.

Что такое асинхронный вывод SageMaker

Асинхронный вывод SageMaker — это один из четырех вариантов развертывания в SageMaker, наряду с конечными точками в реальном времени, пакетным выводом и бессерверным выводом. Дополнительные сведения о различных вариантах развертывания см. Развертывание моделей для вывода.

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

Оптимизируйте затраты на развертывание базовых моделей Amazon SageMaker JumpStart с помощью асинхронных конечных точек Amazon SageMaker | Веб-сервисы Amazon 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 вы можете сократить время и усилия, необходимые для запуска проектов машинного обучения, за счет запуска решений одним щелчком мыши и обширных ресурсов для практического опыта машинного обучения.

На следующем снимке экрана показан пример лишь некоторых моделей, доступных в пользовательском интерфейсе SageMaker JumpStart.

Оптимизируйте затраты на развертывание базовых моделей Amazon SageMaker JumpStart с помощью асинхронных конечных точек Amazon SageMaker | Веб-сервисы Amazon 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. Чтобы убедиться, что наша конечная точка может масштабироваться до нуля, нам необходимо настроить автоматическое масштабирование на асинхронной конечной точке с помощью автоматического масштабирования приложения. Вам необходимо сначала зарегистрировать вариант конечной точки с помощью автоматического масштабирования приложения, определить политику масштабирования, а затем применить политику масштабирования. В этой конфигурации мы используем специальную метрику, используя 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, выбрав Endpoints под вывод в панели навигации и ищем конечную точку, которую мы только что развернули.

Оптимизируйте затраты на развертывание базовых моделей Amazon SageMaker JumpStart с помощью асинхронных конечных точек Amazon SageMaker | Веб-сервисы Amazon PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Вызвать асинхронную конечную точку

Чтобы вызвать конечную точку, вам необходимо поместить полезную нагрузку запроса в Простой сервис хранения Amazon (Amazon S3) и укажите указатель на эту полезную нагрузку как часть InvokeEndpointAsync запрос. При вызове SageMaker ставит запрос в очередь на обработку и возвращает идентификатор и местоположение вывода в качестве ответа. После обработки SageMaker помещает результат в местоположение Amazon S3. При желании вы можете выбрать получение уведомлений об успехе или ошибках с помощью Amazon Простая служба уведомлений (Амазон СНС).

SDK для SageMaker Python

После завершения развертывания он вернет AsyncPredictor объект. Чтобы выполнить асинхронный вывод, вам необходимо загрузить данные в Amazon S3 и использовать predict_async() метод с URI S3 в качестве входных данных. Он вернет 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 — это платформа с открытым исходным кодом, запущенная в октябре 2022 года Харрисоном Чейзом. Он упрощает разработку приложений с использованием больших языковых моделей (LLM), обеспечивая интеграцию с различными системами и источниками данных. LangChain позволяет анализировать документы, обобщать, создавать чат-ботов, анализировать код и многое другое. Он приобрел популярность благодаря вкладу сотен разработчиков и значительному финансированию венчурных фирм. LangChain позволяет подключать LLM к внешним источникам, что позволяет создавать динамические приложения, реагирующие на данные. Он предлагает библиотеки, API и документацию для оптимизации процесса разработки.

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 файл доступно на 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