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

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

Вот что мы здесь освещаем:

  1. Краткий обзор функций FastAPI
  2. Создание API с помощью FastAPI
  3. Упаковка API с помощью Docker
  4. Создание простой страницы визуализации с помощью React.js

Я предполагаю, что вы немного знакомы с React.js. Хотя мы не будем сходить с ума по этому поводу, вы, по крайней мере, должны иметь возможность делать очень простые проекты с React (такие же простые, как создание нового проекта и его запуск, лол).

Наш сценарий

Скажем, мы обучили GAN создавать случайные космические изображения, как показано выше. Теперь мы хотим создать веб-страницу, которая будет отображать эти сгенерированные изображения в качестве инструмента визуализации, чтобы мы могли показать нашим коллегам, над чем мы работаем.

Что такое API?

API означает Aприложение Pпрограммирующий интерфейс. Проще говоря, API — это промежуточный узел между двумя независимыми сторонами, которые общаются друг с другом.

Мы хотим сделать наше приложение машинного обучения доступным для использования другими разработчиками/пользователями, поэтому нам нужно создать API, который действует как точка входа в наше приложение. Связь осуществляется через HTTP-запросы.

API широко используются повсеместно.

Что такое FastAPI?

FastAPI — это быстрая (высокопроизводительная) веб-инфраструктура для создания API с Python 3.6+ на основе стандартных подсказок типа Python. В настоящее время это одна из популярных платформ для создания надежных и высокопроизводительных API-интерфейсов, которые можно масштабировать в производственных средах.

FastAPI быстро набирает популярность по целому ряду причин:

  1. Очень простой синтаксис. Вы можете буквально освоить его менее чем за день, если вам удобно работать с Python. Кроме того, если вы уже знакомы с Flask, также очень легко перейти на FastAPI, поскольку он похож на него.
  2. Чрезвычайно быстрый фреймворк. FastAPI+uvicorn — один из самых быстрых веб-серверов. Независимые тесты TechEmpower сообщают, что FastAPI является одним из самых быстрых доступных фреймворков Python, уступая только самим Starlette и Uvicorn (используется FastAPI для внутренних целей).
  3. Отличная документация.

Официально: https://fastapi.tiangolo.com/

Создание нашего API

Во-первых, мы сохраняем наши предварительно обученные параметры сети в виде файла рассола, чтобы наш сервер мог легко загрузить их и инициализировать созданную модель. На следующем фрагменте мы видим две функции, обслуживающие запросы GET: read_root и generate. Первый просто возвращает объект JSON с «Hello» в качестве ключа и «World» в качестве значения. Последний запускается дескриптором ‘/generate/’. Это создаст экземпляр модели и загрузит ее параметры. Далее модель генерирует случайное изображение, после чего мы предварительно обрабатываем его с некоторым эффектом размытия. Наконец, мы конвертируем наше изображение в поток байтов, так как это то, что ожидает получить наш внешний интерфейс. Мы поговорим об этом немного позже.

Я надеюсь, что этот код легко следовать. Если вы не знакомы с FastAPI, но понимаете, как работают API, думаю, у вас не возникнет проблем с пониманием кода.

Упакуйте API с помощью Docker

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

Контейнеры (в основном контейнеры Linux) — это очень легкий способ упаковки приложений, включая все их зависимости и необходимые файлы, при этом они изолированы от других контейнеров (других приложений или компонентов) в той же системе.

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

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

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

Кроме того, FastAPI предоставляет очень хорошее руководство по использованию своего фреймворка с Docker: https://fastapi.tiangolo.com/deployment/docker/

Line2 означает, что мы начинаем с официального базового образа Python. Затем мы обновляем и устанавливаем некоторые пакеты в строках 3 и 4. В строке 8 мы копируем файл requirements.txt в отдельный каталог /app/ и устанавливаем необходимые зависимости для нашего проекта Python, которые мы указали в файле requirements.txt. Наконец, мы также копируем предварительно подготовленные веса, model.pkl, в каталог приложения. Последняя строка говорит нашему контейнеру запустить наше приложение FastAPI с указанными параметрами.

Мы сохраняем эти параметры в виде файла с именем Dockerfile.

Затем мы создаем образы докеров со следующим:

docker build -t myimage .

И мы можем запустить контейнер Docker со следующим:

docker run -d — имя mycontainer -p 80:80 myimage

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

докер пс-а

Если есть какие-либо проблемы, мы можем проверить журналы следующим образом:

докер регистрирует mycontainer

Он распечатает журналы.

Создание веб-страницы с помощью React.js

Сначала мы создадим новый проект. Чтобы сэкономить время на некоторых стилях, я установлю и буду использовать bootstrap. Единственный файл, который я изменил после создания проекта, — это App.js, который должен находиться в каталоге /src/ внутри папки вашего проекта.

Здесь мы добавляем HTML, чтобы просто включить изображение и кнопку. Изображение, очевидно, является изображением, сгенерированным нашей GAN, а кнопка отправит запрос на наш сервер, который запускается нашим контейнером. Напомним, что ранее мы конвертировали наше изображение в поток байтов. Это сделано для удобства, поскольку мы можем указать URL-адрес в качестве src нашего тега ‹img›, хранящегося в переменной predURL.

Наконец, мы можем запустить приложение React.js со следующим:

запуск нпм

Результат

Вуаля! Мы видим, что все работает так, как ожидалось, и можем отобразить изображение, сгенерированное нашей моделью машинного обучения, которое в данном случае является изображением пространства. Веб-страница очень проста, но вы можете настроить ее, если потратите больше времени. Я оставлю приведенные ниже коды в качестве ссылки на мой репозиторий GitHub.



Спасибо, что уделили время чтению этой статьи (: