Разверните модель с помощью FastAPI и Heroku

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

  • FastAPI
  • Героку
  • Докер
  • Рабочий процесс на гитхабе
  • АМС

Наша модель будет классифицировать изображения собак и кошек.

Первое создание модели

Мы используем данные с https://www.kaggle.com/c/dogs-vs-cats. Модель создается с использованием предварительно обученной модели реснета. Блокнот Kaggle доступен по адресу https://github.com/njoysubho/datascience/blob/master/dog-vs-cat.ipynb. Не совсем модель SOTA, но для наших целей вполне подходит.

Мы сохранили модель в AWS S3. Мы будем использовать модель на нашем сервере FastAPI.

Служба FastAPI

Наш сервер FastAPI будет простым REST API. Он имеет одну точку `/pet`, которая принимает файл изображения и возвращает прогноз. Наш код выглядит так:

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

Полный код можно найти по адресу https://github.com/njoysubho/fastapi-dog-cat.

Теперь, когда у нас есть наша модель и служба FastApi, мы можем ее развернуть.

Развертывание

Сначала нужно создать приложение на героку. Я назвал приложение «dog-cat-fastapi».

Мы можем загрузить весь код как zip, и heroku автоматически развернет код, однако я решил использовать образ докера, так как я также хотел запускать код локально.

DockerFile выглядит так

Несколько вещей, на которые следует обратить внимание:

  • Команда `RUN aws s3 cp s3://datascience-sab/${MODEL_NAME}.pth .` извлечет файл модели из корзины S3.
  • Чтобы получить доступ к aws S3, ему нужны учетные данные, для этого рабочего процесса мы передаем учетные данные из секрета github и устанавливаем их в ENV.
  • Когда я впервые развернул приложение, я не смог к нему подключиться, оказалось, что Heroku не поддерживает команду «EXPOSE» и устанавливает случайный порт как переменную env с именем «PORT», и мы можем использовать это, чтобы открыть порт. команда belo сделает приложение доступным в порту
    `CMD gunicorn -k uvicorn.workers.UvicornWorker — bind 0.0.0.0:$PORT app.main:app`

Наконец, мы делаем наш рабочий процесс github ниже шагом для развертывания на героку.

мы передаем имя приложения, секреты имени модели в качестве аргументов сборки для команды `heroku container:push`.

После этого мы используем команду `heroku container:release`, чтобы выпустить приложение.

Полный рабочий процесс github можно найти https://github.com/njoysubho/fastapi-dog-cat/blob/main/.github/workflows/build-release-deploy.yml.

С этим мы можем развернуть наше приложение на героку.

Ниже приведены некоторые улучшения, которые можно сделать —

  • Улучшите модель.
  • Внедрить управление версиями модели.
  • Улучшено ведение журнала, трассировка и метрики для службы.
  • Также очистите образ докера и упорядочите все команды RUN и pip.

Вот и все на данный момент. Мне было очень приятно узнать о фреймворке fastapi и развернуть модель на героку.