Home Машинное обучение Разверните бессерверную конечную точку вывода машинного обучения для больших языковых моделей с помощью FastAPI, AWS Lambda и AWS CDK. | DeepTech

Разверните бессерверную конечную точку вывода машинного обучения для больших языковых моделей с помощью FastAPI, AWS Lambda и AWS CDK. | DeepTech

0
Разверните бессерверную конечную точку вывода машинного обучения для больших языковых моделей с помощью FastAPI, AWS Lambda и AWS CDK.
 | DeepTech

Для специалистов по данным перенос моделей машинного обучения (ML) от проверки концепции к производству часто представляет собой серьезную проблему. Одной из основных проблем может быть развертывание хорошо работающей, локально обученной модели в облаке для вывода и использования в других приложениях. Управлять процессом может быть обременительно, но с помощью правильного инструмента вы можете значительно сократить требуемые усилия.

Инфраструктура Amazon SageMaker, которая стала общедоступной в апреле 2022 г., упрощает развертывание моделей машинного обучения в рабочей среде для прогнозирования в масштабе, предоставляя широкий выбор инфраструктуры машинного обучения и вариантов развертывания моделей для удовлетворения всех потребностей в области логических выводов машинного обучения. . Вы можете использовать конечные точки SageMaker Serverless Inference для рабочих нагрузок, которые имеют периоды простоя между скачками трафика и допускают холодный запуск. Конечные точки автоматически масштабируются в зависимости от трафика и устраняют тяжелую работу по выбору серверов и управлению ими. Кроме того, вы можете напрямую использовать AWS Lambda для предоставления своих моделей и развертывания приложений машинного обучения с использованием предпочтительной платформы с открытым исходным кодом, которая может оказаться более гибкой и экономичной.

FastAPI — это современная высокопроизводительная веб-инфраструктура для создания API с помощью Python. Он выделяется, когда речь идет о разработке бессерверных приложений с микросервисами RESTful и сценариях использования, требующих вывода ML в масштабе нескольких отраслей. Его простота и встроенные функции, такие как автоматическое документирование API, делают его популярным выбором среди инженеров машинного обучения для развертывания высокопроизводительных API-интерфейсов логического вывода. Вы можете определять и организовывать свои маршруты, используя готовые функции FastAPI, чтобы масштабировать и обрабатывать растущую бизнес-логику по мере необходимости, тестировать локально и размещать ее на Lambda, а затем предоставлять ее через единый шлюз API, что позволяет вам внедрите веб-фреймворк с открытым исходным кодом в Lambda без тяжелой работы или рефакторинга кода.

В этом посте показано, как легко развертывать и запускать бессерверные выводы машинного обучения, предоставляя модель машинного обучения в качестве конечной точки с помощью FastAPI, Docker, Lambda и Amazon API Gateway. Мы также покажем вам, как автоматизировать развертывание с помощью AWS Cloud Development Kit (AWS CDK).

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

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

Объем решения

Предпосылки

У вас должны быть следующие предпосылки:

  • Python3 установлен вместе с virtualenv для создания и управления виртуальными средами в Python
  • aws-cdk v2, установленный в вашей системе, чтобы иметь возможность использовать интерфейс командной строки AWS CDK
  • Докер установлен и работает на вашем локальном компьютере

Проверьте, установлено ли все необходимое программное обеспечение:

  1. Необходим интерфейс командной строки AWS (AWS CLI). Войдите в свою учетную запись и выберите регион, в котором вы хотите развернуть решение.
  2. Используйте следующий код, чтобы проверить версию Python:
  3. Проверить, если virtualenv устанавливается для создания и управления виртуальными средами в Python. Строго говоря, это не является жестким требованием, но оно облегчит вам жизнь и поможет легче следовать этому посту. Используйте следующий код:
    python3 -m virtualenv --version

  4. Проверьте, установлен ли CDK. Это будет использоваться для развертывания нашего решения.
  5. Проверьте, установлен ли Докер. Наше решение сделает вашу модель доступной через образ Docker для Lambda. Чтобы собрать этот образ локально, нам понадобится Docker.
  6. Убедитесь, что Docker запущен и работает с помощью следующего кода:

Как структурировать проект FastAPI с помощью AWS CDK

Мы используем следующую структуру каталогов для нашего проекта (игнорируя некоторый шаблонный код AWS CDK, который не имеет значения в контексте этого поста):

```

fastapi_model_serving
│
└───.venv
│
└───fastapi_model_serving
│   │   __init__.py
│   │   fastapi_model_serving_stack.py
│   │
│   └───model_endpoint
│       └───docker
│       │      Dockerfile
│       │      serving_api.tar.gz
│
│
│       └───runtime
│            └───serving_api
│                    requirements.txt
│                    serving_api.py
│                └───custom_lambda_utils
│                     └───model_artifacts
│                            ...
│                     └───scripts
│                            inference.py
│
└───templates
│   └───api
│   │     api.py
│   └───dummy
│         dummy.py
│
│ app.py
│   cdk.json
│   README.md
│   requirements.txt
│   init-lambda-code.sh

```

Каталог соответствует рекомендуемой структуре проектов AWS CDK для Python.

Наиболее важной частью этого репозитория является fastapi_model_serving каталог. Он содержит код, определяющий стек AWS CDK, и ресурсы, которые будут использоваться для обслуживания модели.

fastapi_model_serving каталог содержит model_endpoint подкаталог, который содержит все необходимые активы, составляющие нашу бессерверную конечную точку, а именно файл Dockerfile для создания образа Docker, который будет использовать Lambda, код функции Lambda, использующий FastAPI для обработки запросов вывода и маршрутизации их к правильной конечной точке, и модель артефакты модели, которую мы хотим развернуть. model_endpoint также содержит следующее:

  • Docker– Этот подкаталог содержит следующее:
  • Dockerfile — Это используется для создания образа для лямбда-функции со всеми артефактами (кодом лямбда-функции, артефактами модели и т. д.) в нужном месте, чтобы их можно было использовать без проблем.
  • serving.api.tar.gz – Это архив, содержащий все ресурсы из папки среды выполнения, необходимые для сборки образа Docker. Мы обсуждаем, как создать .tar.gz файл позже в этом посте.
  • runtime– Этот подкаталог содержит следующее:
  • serving_api – Код функции Lambda и ее зависимостей указан в файле requirements.txt.
  • custom_lambda_utils – Это включает в себя сценарий вывода, который загружает необходимые артефакты модели, чтобы модель могла быть передана в serving_api который затем выставит его как конечную точку.

Кроме того, у нас есть каталог шаблонов, который предоставляет шаблон структур папок и файлов, где вы можете определить свои собственные коды и API-интерфейсы, следуя примеру, который мы рассмотрели ранее. Каталог шаблонов содержит фиктивный код, который можно использовать для создания новых функций Lambda:

  • dummy – Содержит код, реализующий структуру обычной лямбда-функции с использованием среды выполнения Python.
  • api – Содержит код, реализующий функцию Lambda, которая оборачивает конечную точку FastAPI вокруг существующего шлюза API.

Развернуть решение

По умолчанию код развертывается внутри региона eu-west-1. Если вы хотите изменить регион, вы можете изменить контекстную переменную DEPLOYMENT_REGION в cdk.json файл.

Однако имейте в виду, что решение пытается развернуть функцию Lambda поверх архитектуры arm64, и что эта функция может быть доступна не во всех регионах. В этом случае вам нужно изменить параметр архитектуры в fastapi_model_serving_stack.py файл, а также первую строку файла Dockerfile внутри каталога Docker, чтобы разместить это решение на архитектуре x86.

Чтобы развернуть решение, выполните следующие действия:

  1. Выполните следующую команду, чтобы клонировать репозиторий GitHub: git clone https://github.com/aws-samples/lambda-serverless-inference-fastapiПоскольку мы хотим продемонстрировать, что решение может работать с артефактами модели, которые вы обучаете локально, мы приводим образец артефакта модели предварительно обученного ДистилБЕРТ модель в концентраторе модели Hugging Face для задания на ответ на вопрос в serving_api.tar.gz файл. Время загрузки может занять около 3–5 минут. Теперь настроим окружение.
  2. Загрузите предварительно обученную модель, которая будет развернута, из концентратора моделей Hugging Face в ./model_endpoint/runtime/serving_api/custom_lambda_utils/model_artifacts каталог. Он также создает виртуальную среду и устанавливает все необходимые зависимости. Вам нужно запустить эту команду только один раз: make prep. Эта команда может занять около 5 минут (в зависимости от пропускной способности вашего интернета), поскольку ей необходимо загрузить артефакты модели.
  3. Упакуйте артефакты модели в .tar.gz архив, который будет использоваться внутри образа Docker, встроенного в стек AWS CDK. Вам нужно запускать этот код всякий раз, когда вы вносите изменения в артефакты модели или сам API, чтобы всегда иметь самую последнюю версию упакованной обслуживающей конечной точки: make package_model. Артефакты все на месте. Теперь мы можем развернуть стек AWS CDK в вашей учетной записи AWS.
  4. Запустите cdk bootstrap, если вы впервые развертываете приложение AWS CDK в среде (комбинация учетная запись + регион):

    Этот стек включает ресурсы, необходимые для работы инструментария. Например, в стек входит корзина Amazon Simple Storage Service (Amazon S3), которая используется для хранения шаблонов и ресурсов в процессе развертывания.

    Поскольку мы создаем образы Docker локально в этом развертывании AWS CDK, нам необходимо убедиться, что демон Docker запущен, прежде чем мы сможем развернуть этот стек через интерфейс командной строки AWS CDK.

  5. Чтобы проверить, запущен ли в вашей системе демон Docker, используйте следующую команду:

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

  6. Разверните решение с помощью следующей команды:

    Этот шаг может занять около 5–10 минут из-за сборки и отправки образа Docker.

Поиск неисправностей

Если вы являетесь пользователем Mac, вы можете столкнуться с ошибкой при входе в Amazon Elastic Container Registry (Amazon ECR) с помощью входа в Docker, например Error saving credentials ... not implemented. Например:

exited with error code 1: Error saving credentials: error storing credentials - err: exit status 1,...dial unix backend.sock: connect: connection refused

Прежде чем вы сможете использовать Lambda поверх контейнеров Docker внутри AWS CDK, вам может потребоваться изменить ~/docker/config.json файл. В частности, вам, возможно, придется изменить параметр credsStore в ~/.docker/config.json в osxkeychain. Это решает проблемы входа в Amazon ECR на Mac.

Запуск логического вывода в реальном времени

После успешного развертывания стека AWS CloudFormation перейдите к Выходы вкладку для вашего стека в консоли AWS CloudFormation и откройте URL-адрес конечной точки. Теперь наша модель доступна через URL-адрес конечной точки, и мы готовы выполнять вывод в реальном времени.

Перейдите по URL-адресу, чтобы увидеть, видите ли вы сообщение «hello world», и добавьте /docs по адресу, чтобы увидеть, можете ли вы успешно увидеть интерактивную страницу пользовательского интерфейса swagger. Может быть некоторое время холодного запуска, поэтому вам может потребоваться подождать или обновить несколько раз.

Веб-страница документов FastAPI

После того, как вы войдете на целевую страницу страницы пользовательского интерфейса FastAPI swagger, вы можете запустить через корень / или через /question.

От /вы можете запустить API и получить сообщение «hello world».

От /question, вы можете запустить API и выполнить вывод машинного обучения для модели, которую мы развернули для случая ответа на вопрос. Например, мы используем вопрос Какого цвета сейчас моя машина? и контекст Моя машина раньше была синей, но я покрасил ее в красный цвет.

Вопрос о веб-странице FastAPI

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

Выполнить результат

В тексте ответа вы можете увидеть ответ с оценкой достоверности модели. Вы также можете поэкспериментировать с другими примерами или встроить API в существующее приложение.

Кроме того, вы можете запустить вывод с помощью кода. Вот один пример, написанный на Python с использованием requests библиотека:

import requests

url = "https://<YOUR_API_GATEWAY_ENDPOINT_ID>.execute-api.<YOUR_ENDPOINT_REGION>.amazonaws.com/prod/question?question=\"What is the color of my car now?\"&context=\"My car used to be blue but I painted red\""

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

Код выводит строку, похожую на следующую:

'{"score":0.6947233080863953,"start":38,"end":41,"answer":"red"}'

Если вам интересно узнать больше о развертывании генеративного ИИ и больших языковых моделей в AWS, ознакомьтесь со статьей здесь:

Очистить

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

Заключение

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

Вы можете попробовать это сами, и мы рады услышать ваши отзывы!


Об авторах

Тинджи Ли является архитектором корпоративных решений из AWS, базирующейся в Стокгольме, Швеция, и поддерживает клиентов из Скандинавии. Ей нравится помогать клиентам с архитектурой, проектированием и разработкой инфраструктурных решений, оптимизированных для облачных вычислений. Она специализируется на искусственном интеллекте и машинном обучении и заинтересована в том, чтобы предоставить клиентам интеллектуальные возможности в их приложениях искусственного интеллекта и машинного обучения. В свободное время она также работает иллюстратором, пишет романы и играет на пианино.

demir_headshotДемир Катович — инженер по машинному обучению из AWS, базирующийся в Цюрихе, Швейцария. Он взаимодействует с клиентами и помогает им внедрять масштабируемые и полнофункциональные приложения машинного обучения. Он увлечен созданием и производством приложений машинного обучения для клиентов и всегда стремится исследовать новые тенденции и передовые технологии в мире AI/ML.

LEAVE A REPLY

Please enter your comment!
Please enter your name here