Трек 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 

Готово! Осталось только отправить решение в тестирующую систему. Для этого выполните три шага:

  1. Авторизуйтесь в репозитории контейнеров отбора 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

1860 views·23 shares