Опубликуйте API машинного обучения в Интернете примерно за… 15 минут

Вы работали над своим приложением машинного обучения, и скоро появится живая демонстрация. Вы хотели отправить его на Github, добавить Docker и провести рефакторинг кода, но вчера вы потратили весь день на какую-то глупую pickle ошибку, которую до сих пор не понимаете. Теперь у вас всего 1 час до презентации, и ваше приложение машинного обучения должно быть доступно в Интернете. Вам просто нужно получить доступ к своей модели через браузер в течение 15 секунд, чтобы показать ее руководителям.

Это руководство представляет собой способ создания общедоступной конечной точки для вашей модели на AWS с использованием «нулевых рекомендаций». На мой взгляд, это один из кратчайших путей к созданию конечной точки модели, если у вас нет других инструментов (SCM, Docker, SageMaker) и вы написали небольшое приложение на Python.

Вам понадобиться:

  1. Консоль AWS
  2. Терминал
  3. Ваше приложение машинного обучения

Если у вас нет приложения машинного обучения и вы просто хотите следовать за ним, вот то, что я написал сегодня утром. Мое приложение было создано с помощью FastAPI, потому что оно было… .fast… но это будет работать для любого приложения Flask / Dash / Django / Streamlit / любого другого приложения.

Создать экземпляр EC2

Войдите в консоль, найдите «EC2» и перейдите на страницу экземпляров.

Нажмите «запустить экземпляр». Теперь вам нужно выбрать тип машины. Вы в спешке, поэтому просто нажимаете на первую подходящую версию, которую видите (Amazon Linux 2 AMI).

Вы решаете сохранить настройки по умолчанию (оставьте t2.micro) и нажимаете «Просмотреть и запустить».

Создайте новую пару ключей, нажмите «Загрузить пару ключей» и запустите экземпляр.

Открытый порт 80

Пока мы находимся в консоли, давайте откроем порт 80 для веб-трафика. Вернитесь на страницу экземпляров и щелкните свой экземпляр.

Перейдите на вкладку «Безопасность» и в разделе «Группы безопасности» должна появиться ссылка, по которой вы можете щелкнуть, которая выглядит как sg-randomletters (launch-wizard-3). На следующей странице прокрутите вниз и перейдите к «Редактировать правила для входящих подключений».

Добавьте правило всего трафика с 0.0.0.0/0 блокировкой CIDR и затем сохраните.

Скопируйте файлы в экземпляр

Теперь наш экземпляр готов к работе, так что давайте закончим наши файлы. Чтобы упростить задачу, мы можем установить 2 переменные среды. KEY - это просто путь к .pem файлу, который вы скачали ранее, а HOST - это общедоступное DNS-имя IPv4, которое вы можете просмотреть на странице экземпляров.

Отредактируйте приведенный ниже пример, чтобы он содержал вашу информацию. Эти команды предполагают macOS / Linux, для Windows проверьте PuTT Y.

export HOST=ec2-35-153-79-254.compute-1.amazonaws.com
export KEY=/PATH/TO/MY/KEY.pem

Теперь мы можем скопировать наши файлы. Опять же, если у вас нет приложения машинного обучения, клонируйте мое slapdash-приложение и cd в каталог.

git clone https://github.com/kylegallatin/fast-bad-ml.git
cd fast-bad-ml

Теперь скопируйте все.

chmod 700 $KEY
scp -i $KEY -r $(pwd) ec2-user@$HOST:/home/ec2-user

Введите yes, и вы увидите, что файлы копируются. Если вы получите сообщение о том, что ваши разрешения слишком открыты для ключевого файла, просто запустите chmod 700 $KEY.

Настройте свой экземпляр

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

ssh -i $KEY ec2-user@$HOST

Запуск pwd && ls покажет вам, что вы находитесь в /home/ec2-user и содержимое предыдущего каталога было скопировано. Теперь cd в этот каталог и настройте Python (предполагается, что у вас есть requirements.txt).

cd fast-bad-ml
sudo yum install python3
sudo python3 -m pip install -r requirements.txt

Запустите и протестируйте свое приложение

Теперь, когда все установлено, запустите приложение на порту 80 (веб-трафик по умолчанию), используя хост 0.0.0.0 (привязан ко всем адресам - 127.0.0.1 не будет работать).

Приведенная ниже команда - это команда uvicorn для моего приложения FastAPI, но вы можете заменить эту часть в соответствии с вашим приложением, если хост / порт такие же.

sudo /usr/local/bin/uvicorn app:app --reload --port 80 --host 0.0.0.0 &

& запускает процесс в фоновом режиме, поэтому он не останавливается при выходе из сеанса и остается доступным. Добавьте nohup для перенаправления журналов для последующего просмотра.

Теперь вы можете получить доступ к приложению из Интернета. Используйте тот же публичный IPv4 DNS, что и раньше, и просто скопируйте его в браузер. Я настроил / маршрут так, чтобы он возвращал простое сообщение.

Если вы представили /predict метод, который принимает параметры запроса, вы также можете передать их вместе с URL-адресом, чтобы получить прогноз. Формат - $HOST/$ROUTE/?$PARAM1=X&$PARAM2=Y....

Заключение

Сразу хочу предупредить, что это не что иное, как продакшн. Даже если мы представим Docker и масштаб Kubernetes, настоящая «продакшн» потребует тестов, автоматизированного CI / CD, мониторинга и многого другого. Но для того, чтобы вовремя успеть на демонстрацию? Нет ничего лучше. Удачи!