CNTK контейнеров Docker

Вы можете настроить CNTK в качестве контейнера Docker в системе Linux.

Существует два способа использования CNTK контейнеров Docker:

Использование изображений CNTK, опубликованных на Docker Hub

Мы размещаем общедоступные образы CNTK в Docker Hub. Полный список изображений, доступных на странице CNTK Репозитории, см. в Docker Hub. Сейчас мы размещаем только конфигурации среды выполнения . Конфигурация среды выполнения соответствует среде с установленным и настроенным двоичным пакетом CNTK. Эта конфигурация не содержит ни CNTK исходный код, ни предварительные требования, необходимые для сборки CNTK.

Обратите внимание, что для использования CNTK образов с поддержкой GPU требуется NVIDIA Docker.

Стандартные команды Docker используются для получения образа:

docker pull mcr.microsoft.com/cntk/release

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

docker pull mcr.microsoft.com/cntk/nightly

Чтобы получить определенную конфигурацию, необходимо добавить тег. Пример:

docker pull mcr.microsoft.com/cntk/release:2.7-cpu-python3.5

вы получите CNTK конфигурацию среды выполнения ЦП 2.7 для Python 3.5.

Если вы не знакомы с Docker, прочитайте разделы ниже на этой странице.

Использование контейнера Docker для запуска CNTK Jupyter Notebook учебников

Контейнеры Docker можно использовать CNTK для запуска CNTK Записных книжек Jupyter в локальной среде.

Предполагается, что вы уже извлекли необходимые образы из Docker Hub. В приведенном ниже примере мы будем использовать конфигурацию GPU. Если вы используете конфигурацию ЦП, в приведенных ниже командах замените все вхождения nvidia-docker на docker.

Сначала создайте и запустите контейнер CNTK в режиме отсоединения с предоставленным IP-портом (мы используем порт 8888 по умолчанию для приложения Jupyter Notebook):

nvidia-docker run -d -p 8888:8888 --name cntk-jupyter-notebooks -t mcr.microsoft.com/cntk/release

Теперь запустите Jupyter Notebook сервер в контейнере Docker:

docker exec -it cntk-jupyter-notebooks bash -c "source /cntk/activate-cntk && jupyter-notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/cntk/Tutorials --allow-root"

В терминале вы увидите выходные данные консоли сервера Jupyter Notebooks. Эти выходные данные будут содержать следующую строку:
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Скопируйте отображаемый маркер (в нашем примере 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

Теперь вы можете получить доступ к CNTK Jupyter Notebook с помощью IP-адреса компьютера, на котором выполняется контейнер Docker. Т. е. если ваш адрес компьютера — 192.168.1.1 это доступ к CNTK Записные книжки, откройте окно браузера и перейдите в раздел http://192.168.1.1:8888.

Обратите внимание, что во время первого запуска Jupyter Notebook приложение запросит пароль или маркер. Используйте сохраненный выше маркер.

Чтобы остановить последовательность отправки Ctrl-C сервера Jupyter Notebook в терминале, где есть выходные данные консоли сервера Notebook для юпитера, и подтвердите завершение работы сервера. Обратите внимание, что он не остановит сам контейнер Docker. Чтобы остановить контейнер, используйте команду:
docker stop cntk-jupyter-notebooks

ПРЕДУПРЕЖДЕНИЕ. Приведенные выше команды предоставляют приложению Jupyter Notebook для всех , кто может получить доступ к IP-адресу компьютера, на котором выполняется контейнер Docker.

Создание образов Docker CNTK

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

Сначала необходимо установить Docker. Настоятельно рекомендуется следовать процессу установки в официальной документации docker. Версии, которые поставляются с дистрибутивом Linux, могут быть устаревшими и не будут работать nvidia-docker (с которыми может потребоваться установить в дополнение к Docker, если планируется сборка и запуск образа GPU из одного контейнера). Кроме того, следуйте инструкциям в необязательном разделе, посвященном созданию группы Docker.

Соответствующие файлы Docker находятся в репозитории CNTK по адресуhttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Чтобы создать образ Docker с CNTK и всеми его зависимостями, просто клонируйте репозиторий CNTK, перейдите к CNTK/Tools/docker файлу Dockerfile, из которого требуется выполнить сборку (ЦП или GPU). Например, чтобы создать образ Docker с GPU CNTK, выполните следующую команду:

docker build -t cntk -f CNTK-GPU-Image/Dockerfile .

Аргумент -f <path/to/Dockerfile> является обязательным, так как некоторые исправления, общие для файлов DOCKERFILE ЦП и GPU, должны применяться к исходному коду SWIG. Если возникают ошибки, которые говорят Could not resolve 'archive.ubuntu.com' , что необходимо предоставить Docker с IP-адресами DNS-серверов. Сначала найдите IP-адреса DNS-серверов с помощью, например, команды

nm-tool

или команда

nmcli dev show

Предположим, что IP-адреса DNS-серверов и a.b.c.dx.y.z.w. Следующее действие

  • в Ubuntu 15.10 и более поздних версий (или в других linux, использующих systemd) измените /lib/systemd/system/docker.service , чтобы управляющая программа Docker была запущена с дополнительными параметрами. --dns a.b.c.d --dns x.y.z.w
  • в Ubuntu 15.04 и более ранних версий (или других Linux, которые не используют системные) редактирование /etc/default/docker , чтобы строка
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    раскомментирован и содержит IP-адреса DNS-серверов.

Примечание. Некоторые компании блокируют общедоступные DNS-серверы, такие как 8.8.8.8 и 8.8.4.4. Вы можете попытаться использовать их, но если проблема не исчезнет, следует попытаться использовать IP-адреса DNS-сервера, сообщаемые.nm-tool/nmcli

Перезапустите управляемую программу Docker с помощью

sudo service docker restart

и удалите все образы Docker, созданные с неправильными параметрами DNS. Удаление всех образов Docker

docker rmi $(docker images -q)

Удаление всех контейнеров Docker

docker rm $(docker ps -a -q)

Теперь повторите попытку

docker build -t cntk -f CNTK-GPU-Image/Dockerfile .

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

docker run --rm cntk nvidia-smi

Если это работает, все готово. Если это не так, это означает, что существует несоответствие между версией CUDA и (или) драйверами, установленными на узле и в образе Docker CNTK. В частности, несоответствие между модулем драйвера NVidia в режиме ядра и модулем пользовательского режима (который является общей библиотекой), и это происходит, если версия на узле точно не соответствует версии в контейнере. К счастью, это легко исправить. Просто установите nvidia-docker и используйте его точно так же, как Docker (не нужно перестраивать образ).

nvidia-docker run --rm cntk nvidia-smi

Это должно работать и позволяет CNTK использовать GPU из контейнера Docker. Если это не работает, выполните поиск в разделе "Проблемы" в GitHub nvidia-docker. Многие решения уже описаны. Обратите внимание, что если каталоги /usr и /var находятся в разных секциях, вам потребуется выполнить некоторые дополнительные действия, как показано здесь. Получение интерактивной оболочки в контейнер, который не будет автоматически удален после завершения работы

nvidia-docker run --name cntk_container1 -ti cntk bash

Если вы хотите предоставить общий доступ к данным и конфигурациям между узлом (компьютером или виртуальной машиной) и контейнером, в котором вы используете CNTK, используйте параметр -v, например.

nvidia-docker run --name cntk_container1 -ti -v /project1/data:/data -v /project1/config:/config cntk bash

Это сделает /project1/data from the host видимым как /data в контейнере и /project1/config как /config. Такая изоляция снижает вероятность перезаписи контейнерных экспериментов или использования неправильных данных.