Запустите несколько генеративных моделей искусственного интеллекта на графическом процессоре, используя многофункциональные конечные точки Amazon SageMaker с помощью TorchServe и сэкономьте до 75% расходов на вывод.

Запустите генеративные модели ИИ на графическом процессоре с помощью Amazon SageMaker и TorchServe, сэкономив до 75% расходов на вывод.

Многомодельные конечные точки (MME) – это мощная функция Amazon SageMaker, разработанная для упрощения развертывания и использования моделей машинного обучения (ML). С помощью MME вы можете размещать несколько моделей в одном контейнере обслуживания и размещать все модели за одной конечной точкой. Платформа SageMaker автоматически управляет загрузкой и выгрузкой моделей и масштабирует ресурсы в зависимости от трафика, снижая операционную нагрузку при управлении большим количеством моделей. Эта функция особенно полезна для моделей глубокого обучения и генеративного искусственного интеллекта, требующих ускоренных вычислений. Снижение затрат, достигаемое за счет совместного использования ресурсов и упрощенного управления моделями, делает SageMaker MME отличным выбором для размещения моделей в масштабе на AWS.

Недавно генеративные приложения искусственного интеллекта привлекли широкое внимание и воображение. Клиенты хотят развернуть модели генеративного искусственного интеллекта на GPU, но при этом сознательны в отношении затрат. SageMaker MME поддерживает экземпляры с GPU и является отличным вариантом для таких приложений. Сегодня мы с радостью анонсируем поддержку TorchServe для SageMaker MME. Эта новая поддержка модельного сервера предоставляет вам преимущества всех преимуществ MME, при этом используя стек обслуживания, с которым клиенты TorchServe наиболее знакомы. В этом посте мы продемонстрируем, как разместить модели генеративного искусственного интеллекта, такие как Stable Diffusion и Segment Anything Model, на SageMaker MME с использованием TorchServe и создадим решение с редактированием, основанным на языке, которое поможет художникам и создателям контента разрабатывать и итерировать свое произведение искусства быстрее.

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

Редактирование с помощью языка – это распространенный кросс-отраслевой случай использования генеративного искусственного интеллекта. Он может помочь художникам и создателям контента работать более эффективно, чтобы удовлетворить потребности в контенте путем автоматизации повторяющихся задач, оптимизации кампаний и предоставления гиперперсонализированного опыта для конечного потребителя. Бизнес могут получить выгоду от увеличения объема контента, сокращения затрат, улучшения персонализации и улучшения опыта клиентов. В этом посте мы продемонстрируем, как вы можете создать функции редактирования с помощью MME TorchServe, которые позволяют удалить нежелательный объект из изображения и изменить или заменить любой объект на изображении, указав текстовую инструкцию.

Поток пользовательского взаимодействия для каждого случая использования выглядит следующим образом:

  • Чтобы удалить нежелательный объект, выберите объект на изображении, чтобы выделить его. Это действие отправляет координаты пикселей и исходное изображение в модель генеративного искусственного интеллекта, которая генерирует маску сегментации для объекта. После подтверждения правильного выбора объекта вы можете отправить исходное и маскировочное изображения второй модели для удаления. Подробное объяснение этого потока пользовательского взаимодействия продемонстрировано ниже.
Шаг 1: Выберите объект (“собака”) на изображении Шаг 2: Подтвердите правильное выделение объекта Шаг 3: Стереть объект с изображения
  • Чтобы изменить или заменить объект, выберите и выделите желаемый объект, следуя тому же процессу, описанному выше. После подтверждения правильного выбора объекта вы можете изменить объект, предоставив исходное изображение, маску и текстовую подсказку. Затем модель изменит выделенный объект на основе предоставленных инструкций. Подробное объяснение этого второго потока пользовательского взаимодействия приведено ниже.
Шаг 1: Выберите объект (“ваза”) на изображении Шаг 2: Подтвердите правильное выделение объекта Шаг 3: Предоставьте текстовую подсказку (“футуристическая ваза”) для изменения объекта

Для функционирования этого решения мы используем три генеративные модели искусственного интеллекта: Модель сегментации любых объектов (SAM), Большая модель восстановления маски (LaMa) и Модель восстановления по диффузии (SD). Вот как эти модели используются в рабочем процессе пользовательского опыта:

Для удаления нежелательного объекта Для изменения или замены объекта
  1. Модель сегментации любых объектов (SAM) используется для создания сегментационной маски интересующего объекта. Разработанная компанией Meta Research, SAM является открытой моделью, которая может сегментировать любой объект на изображении. Эта модель обучена на огромном наборе данных под названием SA-1B, включающем более 11 миллионов изображений и 1,1 миллиарда сегментационных масок. Для получения дополнительной информации о SAM обратитесь к их веб-сайту и научной статье.
  2. LaMa используется для удаления нежелательных объектов с изображения. LaMa – это модель генеративно-состязательной сети (GAN), специализирующаяся на заполнении отсутствующих частей изображений с использованием нерегулярных масок. Архитектура модели включает глобальный контекст изображения и одношаговую архитектуру, использующую фурье-свертки, что позволяет ей достигать передовых результатов с более высокой скоростью. Для получения более подробной информации о LaMa посетите их веб-сайт и научную статью.
  3. Модель восстановления SD 2 от Stability AI используется для изменения или замены объектов на изображении. Эта модель позволяет редактировать объект в области маски, предоставляя текстовую подсказку. Модель восстановления основана на модели текст-изображение SD, которая может создавать высококачественные изображения с помощью простой текстовой подсказки. Она предоставляет дополнительные аргументы, такие как исходное изображение и изображение маски, что позволяет быстро изменять и восстанавливать существующий контент. Для получения дополнительной информации о моделях Stable Diffusion в AWS обратитесь к статье “Создание высококачественных изображений с помощью моделей Stable Diffusion и их эффективное развертывание с помощью Amazon SageMaker”.

Все три модели размещены на серверах SageMaker MME, что снижает операционную нагрузку при управлении несколькими конечными точками. Кроме того, использование MME устраняет проблему недостаточного использования определенных моделей, поскольку ресурсы распределяются. Вы можете наблюдать преимущества улучшенной насыщенности экземпляра, что в конечном итоге приводит к снижению затрат. Ниже приведена схема архитектуры, иллюстрирующая, как все три модели обслуживаются с использованием серверов SageMaker MME с помощью TorchServe.

Мы опубликовали код для реализации этой архитектуры решения в нашем репозитории GitHub. Чтобы следовать дальнейшим инструкциям, используйте файл блокнота. Рекомендуется запускать этот пример на экземпляре блокнота SageMaker с использованием ядра conda_python3 (Python 3.10.10).

Расширение контейнера TorchServe

Первый шаг – подготовить контейнер для размещения модели. SageMaker предоставляет управляемый контейнер глубокого обучения PyTorch (DLC), который можно получить с помощью следующего фрагмента кода:

# Используйте DLC PyTorch от SageMaker в качестве базового образа
baseimage = sagemaker.image_uris.retrieve(
    framework="pytorch",
    region=region,
    py_version="py310",
    image_scope="inference",
    version="2.0.0",
    instance_type="ml.g5.2xlarge",
)
print(baseimage)

Поскольку модели требуют ресурсов и дополнительных пакетов, которых нет в базовом DLC PyTorch, вам необходимо создать образ Docker. Затем этот образ загружается в реестр контейнеров Amazon Elastic Container Registry (Amazon ECR), чтобы мы могли получить к нему прямой доступ из SageMaker. В Docker-файле перечислены установленные пользовательские библиотеки:

ARG BASE_IMAGE

FROM $BASE_IMAGE

# Установка дополнительных библиотек
RUN pip install segment-anything-py==1.0
RUN pip install opencv-python-headless==4.7.0.68
RUN pip install matplotlib==3.6.3
RUN pip install diffusers
RUN pip install tqdm
RUN pip install easydict
RUN pip install scikit-image
RUN pip install xformers
RUN pip install tensorflow
RUN pip install joblib
RUN pip install matplotlib
RUN pip install albumentations==0.5.2
RUN pip install hydra-core==1.1.0
RUN pip install pytorch-lightning
RUN pip install tabulate
RUN pip install kornia==0.5.0
RUN pip install webdataset
RUN pip install omegaconf==2.1.2
RUN pip install transformers==4.28.1
RUN pip install accelerate
RUN pip install ftfy

Запустите файл с командой оболочки для создания пользовательского образа локально и отправки его в Amazon ECR:

%%capture build_output

reponame = "torchserve-mme-demo"
versiontag = "genai-0.1"

# Построение собственного образа Docker
!cd workspace/docker && ./build_and_push.sh {reponame} {versiontag} {baseimage} {region} {account}

Подготовка артефактов модели

Основное отличие новых MME с поддержкой TorchServe заключается в том, как подготовить артефакты модели. Репозиторий кода предоставляет каркасную папку для каждой модели (папка models), в которой находятся необходимые файлы для TorchServe. Мы следуем тому же четырехэтапному процессу для подготовки каждого файла .tar модели. Приведенный ниже код является примером каркасной папки для модели SD:

workspace
|--sd
   |-- custom_handler.py
   |-- model-config.yaml

Первый шаг – загрузить предварительно обученные контрольные точки модели в папку models:

import diffusers
import torch
import transformers

pipeline = diffusers.StableDiffusionInpaintPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-inpainting", torch_dtype=torch.float16
)

sd_dir = "workspace/sd/model"
pipeline.save_pretrained(sd_dir)

Следующий шаг – определить файл custom_handler.py. Это необходимо для определения поведения модели при получении запроса, такого как загрузка модели, предварительная обработка входных данных и постобработка выходных данных. Метод handle является основной точкой входа для запросов, он принимает объект запроса и возвращает объект ответа. Он загружает предварительно обученные контрольные точки модели и применяет методы preprocess и postprocess к входным и выходным данным. Приведенный ниже фрагмент кода иллюстрирует простую структуру файла custom_handler.py. Для получения более подробной информации см. документацию по API обработчика TorchServe.

def initialize(self, ctx: Context):

def preprocess(self, data):

def inference(self, data):

def handle(self, data, context):
    requests = self.preprocess(data)
    responses = self.inference(requests)

    return responses

Последний необходимый файл для TorchServe – model-config.yaml. В этом файле определяются настройки сервера модели, такие как количество рабочих и размер пакета. Конфигурация задается на уровне модели, и пример файла конфигурации приведен в следующем коде. Для полного списка параметров см. репозиторий на GitHub.

minWorkers: 1
maxWorkers: 1
batchSize: 1
maxBatchDelay: 200
responseTimeout: 300

Последний шаг – упаковать все артефакты модели в один файл .tar.gz с помощью модуля torch-model-archiver:

!torch-model-archiver --model-name sd --version 1.0 --handler workspace/sd/custom_handler.py --extra-files workspace/sd/model --config-file workspace/sam/model-config.yaml --archive-format no-archive!cd sd && tar cvzf sd.tar.gz .

Создание многофункциональной модели

Шаги по созданию SageMaker MME остаются прежними. В этом конкретном примере вы запускаете конечную точку с помощью SDK SageMaker. Начните с определения местоположения Amazon Simple Storage Service (Amazon S3) и контейнера размещения. В этом местоположении S3 SageMaker будет динамически загружать модели в соответствии с образцами вызова. Контейнер размещения – это пользовательский контейнер, который вы построили и отправили в Amazon ECR на предыдущем шаге. См. следующий код:

# Здесь наша MME будет читать модели из S3.
multi_model_s3uri = output_path

Затем вы хотите определить MulitDataModel, который содержит все атрибуты, такие как местоположение модели, контейнер размещения и доступ к разрешениям:

print(multi_model_s3uri)
model = Model(
    model_data=f"{multi_model_s3uri}/sam.tar.gz",
    image_uri=container,
    role=role,
    sagemaker_session=smsess,
    env={"TF_ENABLE_ONEDNN_OPTS": "0"},
)

mme = MultiDataModel(
    name="torchserve-mme-genai-" + datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
    model_data_prefix=multi_model_s3uri,
    model=model,
    sagemaker_session=smsess,
)
print(mme)

Функция deploy() создает конфигурацию конечной точки и размещает конечную точку:

mme.deploy(
    initial_instance_count=1,
    instance_type="ml.g5.2xlarge",
    serializer=sagemaker.serializers.JSONSerializer(),
    deserializer=sagemaker.deserializers.JSONDeserializer(),
)

В предоставленном нами примере мы также показываем, как вы можете перечислить модели и динамически добавлять новые модели с использованием SDK. Функция add_model() копирует ваши локальные модели .tar файлы в расположение MME S3:

# Виден только sam.tar.gz!
list(mme.list_models())

models = ["sd/sd.tar.gz", "lama/lama.tar.gz"]
for model in models:
    mme.add_model(model_data_source=model)

Вызов моделей

Теперь, когда у нас есть все три модели, размещенные на MME, мы можем вызывать каждую модель последовательно, чтобы создать наши функции редактирования с помощью языка. Чтобы вызвать каждую модель, укажите параметр target_model в функции predictor.predict(). Имя модели – это просто имя файла модели .tar, который мы загрузили. Вот пример кода для модели SAM, которая принимает координату пикселя, метку точки и размер размытия ядра и генерирует маску сегментации объекта в пиксельном местоположении:

img_file = "workspace/test_data/sample1.png"
img_bytes = None

with Image.open(img_file) as f:
    img_bytes = encode_image(f)

gen_args = json.dumps(dict(point_coords=[750, 500], point_labels=1, dilate_kernel_size=15))

payload = json.dumps({"image": img_bytes, "gen_args": gen_args}).encode("utf-8")

response = predictor.predict(data=payload, target_model="/sam.tar.gz")
encoded_masks_string = json.loads(response.decode("utf-8"))["generated_image"]
base64_bytes_masks = base64.b64decode(encoded_masks_string)

with Image.open(io.BytesIO(base64_bytes_masks)) as f:
    generated_image_rgb = f.convert("RGB")
    generated_image_rgb.show()

Чтобы удалить нежелательный объект из изображения, возьмите маску сегментации, сгенерированную из модели SAM, и подайте ее в модель LaMa вместе с исходным изображением. Ниже приведены примеры.

Пример изображения Маска сегментации от SAM Стереть собаку с помощью LaMa

Чтобы изменить или заменить любой объект на изображении текстовым подсказкой, возьмите маску сегментации от SAM и подайте ее в модель SD вместе с исходным изображением и текстовой подсказкой, как показано в следующем примере.

! !
Пример изображения Маска сегментации от SAM

Замена с использованием модели SD с текстовой подсказкой

«хомяк на скамейке»

Экономия затрат

Преимущества использования SageMaker MME возрастают с увеличением масштаба объединения моделей. В следующей таблице показано использование памяти GPU трех моделей в этом посте. Они развернуты на одном экземпляре g5.2xlarge, используя SageMaker MME.

Модель Использование памяти GPU (MiB)
Segment Anything Model 3,362
Stable Diffusion In Paint 3,910
Lama 852

Вы можете видеть экономию затрат при размещении трех моделей на одном эндпоинте, и для случаев использования с сотнями или тысячами моделей, эта экономия намного больше.

Например, рассмотрим 100 моделей Stable Diffusion. Каждая модель по отдельности может быть обслужена эндпоинтом ml.g5.2xlarge (4 GiB памяти), стоимостью $1.52 в час в регионе US East (N. Virginia). Обслуживание всех 100 моделей с использованием их отдельных эндпоинтов будет стоить $218,880 в месяц. С помощью SageMaker MME один эндпоинт, использующий экземпляры ml.g5.2xlarge, может разместить одновременно четыре модели. Это позволяет снизить затраты на вывод в производстве на 75% до $54,720 в месяц. В следующей таблице суммированы различия между эндпоинтами для одной модели и эндпоинтами для нескольких моделей в этом примере. При наличии конфигурации эндпоинта с достаточной памятью для целевых моделей, задержка вызова в установившемся состоянии после загрузки всех моделей будет аналогичной задержке эндпоинта для одной модели.

. Эндпоинт для одной модели Эндпоинт для нескольких моделей
Общая стоимость эндпоинта в месяц $218,880 $54,720
Тип экземпляра эндпоинта ml.g5.2xlarge ml.g5.2xlarge
Объем оперативной памяти CPU (GiB) 32 32
Объем памяти GPU (GiB) 24 24
Стоимость эндпоинта в час $1.52 $1.52
Количество экземпляров на эндпоинте 2 2
Количество необходимых эндпоинтов для 100 моделей 100 25

Очистка

По завершении работы, пожалуйста, следуйте инструкциям в разделе очистки блокнота, чтобы удалить ресурсы, созданные в этом посте, и избежать ненужных затрат. Дополнительные сведения о стоимости экземпляров вывода можно найти в разделе Ценообразование Amazon SageMaker.

Заключение

В этом посте демонстрируются возможности редактирования с использованием языка, которые становятся доступными благодаря использованию генеративных моделей искусственного интеллекта, размещенных на SageMaker MME с использованием TorchServe. Приведенный пример показывает, как мы можем использовать совместное использование ресурсов и упрощенное управление моделями с помощью SageMaker MME, при этом все еще используя TorchServe как нашу систему обслуживания моделей. Мы использовали три модели глубокого обучения: SAM, SD 2 Inpainting и LaMa. Эти модели позволяют нам создавать мощные возможности, такие как удаление нежелательных объектов с изображения и изменение или замена любого объекта на изображении с помощью текстовой инструкции. Эти функции могут помочь художникам и создателям контента работать более эффективно и удовлетворять требованиям к контенту, автоматизируя повторяющиеся задачи, оптимизируя кампании и обеспечивая гиперперсонализированный опыт. Приглашаем вас изучить предложенный пример в этом посте и создать собственный интерфейс пользователя, используя TorchServe на SageMaker MME.

Чтобы начать, ознакомьтесь с поддерживаемыми алгоритмами, фреймворками и экземплярами для мультимодельных конечных точек с использованием экземпляров, поддерживаемых GPU.