Использование Fast.ai, Docker, GitHub и Starlette ASGI Framework

Вы собрали свои данные, тщательно очистили их, втиснули в свою тщательно настроенную модель, потратили много часов на GPU и обучили модель. Прогноз - ультрасовременный! Браво!

Но что теперь?

Конечно же, поделитесь этим с миром! У него такой большой потенциал, и никто не делал этого раньше, вы хотите, чтобы все его испытали! Как? Ты спрашиваешь.

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

Как приручить (и экспортировать) своего дракона (модель)

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

Fast.ai использует объект learn для обучения модели, для экспорта вашей модели, используйте методlearn.export() для экспорта и сохранения вашей обученной модели в export.pkl файл (мой файл экспорта модели из ссылки выше составляет около 100 МБ ). Сохраните этот файл, мы будем использовать его позже.

Веб-разработка, управляемая GitHub

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

Перейдите в этот репозиторий GitHub, нажмите большую зеленую кнопку Клонировать или загрузить справа, как показано ниже:

Во всплывающем окне скопируйте ссылку, затем перейдите в свой терминал и введите:

git clone https://github.com/wayofnumbers/fastai-vision-uvicorn-gunicorn-starlette-docker.git
cd fastai-vision-uvicorn-gunicorn-starlette-docker

Эти команды будут клонировать весь требуемый код на ваш локальный компьютер в папке с именем fastai-vision-uvicorn-gunicorn-starlette-docker и войти в эту папку. Это основная папка, над которой мы будем работать, в ней есть несколько вещей, которые стоит объяснить:

приложение: эта appпапка имеет следующую структуру:

template
|--app.html
main.py
export.pkl

Здесь находится исходный код вашего веб-приложения Starlette. У него очень простой файл Python main.py. Starlette - это легкий фреймворк / инструментарий ASGI, который идеально подходит для создания высокопроизводительных асинхронных сервисов.

В нем также есть сохраненная модель fileexport.pkl. В папке template находится файл HTML-шаблона app.html, который будет служить пользовательским интерфейсом вашего веб-приложения.

Помните экспортированный export.pkl файл, который вы сохранили? Вытащите его и замените тот, который находится в этой app папке. Таким образом, приложение будет использовать вашу модель. Вы также можете обновить файл app.html для улучшения внешнего вида пользовательского интерфейса, но при развертывании в этом нет необходимости. Теперь исходный код вашего веб-приложения готов, нам нужно обернуть его в контейнер Docker и провести некоторое тестирование. Мы используем Dockerfile в качестве файла конфигурации. В следующем разделе мы рассмотрим подробнее.

Давайте сделаем это Dockerize!

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

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

sudo groupadd docker
sudo usermod -aG docker $USER

Это избавит от необходимости использовать sudo каждый раз, когда вы вводите команду докера. Перезагрузитесь, теперь докер должен быть правильно установлен.

В том же каталоге, где находятся app папка и Dockerfile, нам нужно создать образ докера, содержащий весь исходный код в этой папке, чтобы мы могли все проверить. Введите следующую команду (не забывайте "." В конце):

docker build -t test_app .

Это запустит процесс создания образа докера в соответствии с Dockerfile. Это займет некоторое время, поэтому давайте кратко рассмотрим, что внутри Dockerfile:

#1 FROM tiangolo/uvicorn-gunicorn-starlette:python3.7
#2 RUN pip install fastai aiohttp 
#3 RUN pip install jinja2 
#4 RUN pip install starlette 
#5 COPY ./app /app 
#6 WORKDIR /app 
#7 EXPOSE 80

Это говорит само за себя:

Строка 1: укажите, из какого начального образа мы будем создавать образ докера. Мы используем tiangolo/uvicorn-gunicorn-starlette:python3.7. Вы можете найти ссылку на GitHub здесь и ссылку на Docker Hub здесь.

Строка 2, 3, 4: установите библиотеку fast.ai, структуру шаблонов jinja, структуру Starlette и другие утилиты.

Строка 5: Скопируйте папку приложения в образ докера, чтобы наше приложение могло работать в контейнере докера.

Строка 6, 7: назначьте рабочий каталог папке app и откройте порт 80 для внешнего доступа, чтобы мы могли посещать веб-приложение через порт 80 (HTTP).

После создания образа докера запустите docker images для проверки. Вы найдете что-то вроде:

REPOSITORY    TAG    IMAGE ID    CREATED        SIZE
test_app      latest xxxxxxxxx   1 minutes ago  4.05GB

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

docker run -p 80:80 \
		-v ./absolute/path/to/export.pkl:/app/export.pkl \
		-e TITLE="Chinese Calligraphy Classifier" \
		-e SUBTITLE="Can disambiguate Chinese calligraphy styles like KaiShu, LiShu, XiaoZhuan" 
		test_app

В приведенной выше команде docker мы указали порт 80. Мы передали в контейнер две переменные среды, TITLE и SUBTITLE, они будут использоваться для отображения заголовков пользовательского интерфейса нашего веб-приложения. В конце мы указали имя нашего образа докера: test_app. Обратите внимание, что для export.pkl файла вам нужно использовать абсолютный путь, иначе Docker не сможет его найти.

Если вы не видите никаких ошибок, ваш докер-контейнер должен быть запущен. Зайдите в свой браузер, введите 127.0.0.1 и нажмите Enter, вуаля! Вы должны увидеть веб-приложение. Присвойте ему каллиграфическое изображение Кайшу, Лишу или Сяочжуань и нажмите Классифицировать, вы должны увидеть что-то вроде этого:

Вы можете видеть, что приложение классифицировало это как «КайШу», и это правильно. Теперь, когда ваше приложение запущено и работает на локальном компьютере, мы готовы на 80%. Осталось развернуть его в облаке. Теперь давайте отправимся в облако!

Следующий шаг, облако!

Для услуги облачного хостинга мы будем использовать DigitalOcean. По сравнению с более опытными игроками, такими как Amazon AWS, GCP или Azure, он более удобен для разработчиков и дешевле. Вы можете следовать этому хорошо написанному и краткому руководству, чтобы создать учетную запись и собственную каплю. ('Droplet' - это виртуальная машина, работающая под управлением Digital Ocean, на которую вы можете установить свое приложение, как и экземпляр AWS.) Если хотите, вы можете использовать эту ссылку, чтобы создать свою учетную запись и бесплатно получить кредит в размере 50 долларов США. будет достаточно, чтобы вы начали. Используйте следующую конфигурацию в качестве справки:

Рекомендуется создавать капли с объемом памяти не менее 4G, поскольку для установки PyTorch потребуется много памяти. Вы можете изменить его размер до 2G позже.

Вы можете выбрать «Центр обработки данных» по умолчанию и настроить метод аутентификации. Используйте SSH-ключ или пароль, как вам удобнее. Я лично предпочитаю SSH-ключ, меньшее количество нажатий клавиш и более безопасный. Как только дроплет будет создан, подключитесь к нему по SSH, и мы готовы к окончательному развертыванию!

Развертывать! Развертывать! Развертывать!

Теперь вы можете подключиться к серверу по SSH как root. Рекомендуется создать обычного пользователя с правами sudo, вы можете следовать этому руководству. После создания обычного пользователя выйдите из своего root пользователя и снова подключитесь к серверу по SSH под своей учетной записью обычного пользователя. Окончательное развертывание очень похоже на то, что мы уже делали на нашей локальной машине, только на этот раз мы делаем это на удаленном сервере. Во-первых, давайте git клонируем наше репо, чтобы у нас был исходный код:

git clone https://github.com/wayofnumbers/fastai-vision-uvicorn-gunicorn-starlette-docker.git
cd fastai-vision-uvicorn-gunicorn-starlette-docker

Не забудьте скопировать файл export.pkl вместо того, что находится в папке app. (переходите по этой ссылке, если не знаете как)

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

# make it so that you don't need sudo for running docker command
sudo groupadd docker
sudo usermod -aG docker $USER
# build the image
docker build -t test_app .

После создания образа запустите контейнер докеров:

docker run -p 80:80 \
		-v ./absolute/path/to/export.pkl:/app/export.pkl \
		-e TITLE="Chinese Calligraphy Classifier" \
		-e SUBTITLE="Can disambiguate Chinese calligraphy styles like KaiShu, LiShu, XiaoZhuan" 
		test_app

После того, как док-контейнер будет запущен и запустится, перейдите в браузер и введите IP-адрес вашей капли, нажмите Enter. Поздравляю! Вы успешно развернули свою модель глубокого обучения в Интернете!

Заключение

Не так уж и сложно, да? Развертывание с использованием стандартной DigitalOcean Droplet предлагает множество гибких возможностей. Вы можете делать со своими каплями все, что хотите, поскольку у вас есть root-доступ. Вы можете запускать на нем несколько приложений и платить очень мало (уровня от 5 до 10 долларов должно хватить). Если ваше приложение набирает обороты и требует больше ресурсов, вы можете легко масштабировать его.

Я надеюсь, что это руководство поможет вам развернуть приложение AI. Если у вас есть вопросы или вы хотите поделиться своим опытом развертывания, напишите ответ ниже. Удачного развертывания!

Обновление: я развернул веб-приложение здесь. Я использовал веб-приложение на DigitaOcean в качестве внутреннего сервера API и поставил другое веб-приложение на основе ReactJS, размещенное на GitHub Pages, в качестве внешнего интерфейса. Поскольку приложению React необходимо посетить URL-адрес http, некоторые браузеры будут отображать Ошибка смешанного содержимого, просто включите его, и вы сможете попробовать сами. Вы также можете проверить исходный код приложения React в репозитории.

Любые отзывы или конструктивная критика приветствуются. Вы можете найти меня в Twitter @lymenlee или в моем блоге wayofnumbers.com.