Трек ML. Инструкция по работе с Docker
Подготовил Павел Калайдин, директор по исследованиям в области искусственного интеллекта
В квалификации трека ML вы обрабатывали все данные локально, а в тестирующую систему отправляли только результат работы кода — предсказание принадлежности каждого вопроса определённому классу.
Отборочный раунд проводится в виде контейнерного конкурса: вам нужно отправить в тестирующую систему не итог работы программы, а запускаемый код в виде Docker-контейнера. Мы выполним его в одинаковых для всех участников раунда условиях, и оценим, чей ответ лучше.
Мы верим, что именно контейнерные конкурсы — будущее ML-соревнований: они позволяют контролировать ресурсы, необходимые для обсчёта решения, и, например, ограничивать доступ к внешним API. Кроме того, заметная часть ML-моделей ВКонтакте (включая все нейросети), как и во многих других компаниях, хостятся именно в контейнерах, поэтому познакомиться с этой технологией очень полезно.
Инструкция для отправки решений трека ML с помощью Docker
Чтобы объяснить тестирующей системе, как нужно запускать ваш код, понадобится Dockerfile. Наверняка ваше решение состоит из двух частей — обучения модели и её применения к предложенным данным. Запускать процесс обучения на сервере не нужно: оно полностью должно происходить у вас локально. Предположим, что применение модели умещается в один python-файл solve.py, который будет получать как аргумент командной строки путь к обученной модели. Как описано в условии, все входные данные будут доступны в директории /tmp/data. Результат работы программы нужно записать в файл /opt/results/results.tsv. Для локального запуска вы вызываете команду вроде такой:
python solve.py model /tmp/data /opt/results/results.tsv
Осталось только объяснить тестирующей системе, в каком окружении и как именно нужно всё запускать. Создайте файл Dockerfile. Например, с таким содержимым:
FROM continuumio/anaconda3:latest CMD python solve.py model /tmp/data/test.tsv /opt/results/results.tsv
Такой Dockerfile объяснит системе, что для запуска вашего решения нужно унаследоваться от контейнера из репозитория hub.docker.com пользователя continuumio под названием anaconda3 (подробнее про этот контейнер можно почитать здесь — hub.docker.com/r/continuumio/anaconda3). Вы можете выбрать другой базовый контейнер из предложенных на hub.docker.com
После того как контейнер смонтирован, Dockerfile описывает команды, которые нужно выполнить для запуска решения. В нашем случае эта команда совпадает с тем, что вы делаете локально.
Среди всех доступных в общем репозитории контейнеров может не оказаться идеально подходящего вам, но в Dockerfile можно описывать дополнительные команды для установки библиотек или создания папок. RUN означает, что команда будет выполнена на этапе сборки контейнера, а CMD — что на этапе его запуска.
FROM continuumio/anaconda3:latest RUN conda update -n base -c defaults conda RUN conda update --all RUN conda update scikit-learn CMD mkdir /opt/results CMD python solve.py model /tmp/data/test.tsv /opt/results/results.tsv
Чтобы запустить ваш Dockerfile локально, установите Docker Desktop (docker.com/products/docker-desktop) и из командной строки (находясь в той же папке, что и Dockerfile) запустите:
docker build -t vkcup .
-t присвоит контейнеру тег vkcup, который будет использоваться для локального запуска:
docker run -t vkcup
Готово! Осталось только отправить решение в тестирующую систему. Для этого выполните три шага:
- Авторизуйтесь в репозитории контейнеров отбора VK Cup, используя логин и пароль со страницы mlbootcamp.ru/round/25/tasks/#28
$ docker login stor.highloadcup.ru Username: xxxhackerxxx@domain.com Password: 12345678 Login Succeeded
2. Получите на сайте специальный тег для отправки решений — это будет весёлое сочетание английских слов, например funny_coala. Пометьте этим тегом решение, которое хотите отправить, с помощью следующей команды:
$ docker tag vkcup stor.highloadcup.ru/accounts/funny_coala
3. Загрузите контейнер в репозиторий — сразу после этого тестирующая система запустит и оценит ваше решение (или проигнорирует попытку, если оно полностью совпадает с отправленным ранее). Если на этом этапе загрузка будет каждые десять секунд повторять Retrying, напишите в поддержку платформы ML Bootcamp. Система предупредит ошибкой, если вы попытались использовать чужой тег для отправки решений или превысили разрешённое количество попыток в день.
$ docker push stor.highloadcup.ru/accounts/funny_coala
Результат проверки появится на странице соревнования.
Удачи!
Текст основан на инструкции от Максима Кисленко для Highload Cup
https://highloadcup.ru/media/condition/tutorial.html
