Docker Registry используется для хранения кастомных Docker-образов. Экземпляр образа в Docker Registry идентифицируется по тегу или по дайджесту.
Кастомные образы предназначены для установки зависимостей, которые нужны пользователю и отсутствуют в базовых образах Distributed Train.
Кастомные образы с префиксом «jupyter-» используются в Environments для создания пользовательского окружения (Jupyter Server на основе кастомного образа).
Кастомный образ можно собрать двумя способами:
На основе базового образа (рекомендуется).
В базовом образе все интеграции с Distributed Train уже настроены. Дополнительные пакеты необходимо добавить в Dockerfile FROM cr.ai.cloud.ru/aicloud-jupyter/.... Примеры Dockerfile приведены в разделе Шаг 1. Соберите кастомный образ для Jupyter Server.
На основе любого стороннего образа, веб‑сервер которого использует порт 8888.
В этом случае интеграции с платформой нужно настроить самостоятельно. Минимально необходимые элементы описаны в разделе Требования к кастомному образу.
При использовании кастомных образов:
Не гарантируется корректность приостановки Jupyter Server.
Не гарантируется стабильность и отзывчивость веб‑интерфейса Jupyter Server.
Возможно возникновение иных проблем, связанных с использованием кастомного образа.
Кастомный образ должен содержать:
Пользователя jovyan (uid 1000, gid 1000).
Без него Distributed Train не сможет смонтировать NFS и запустить сервер.
Директории с владельцем jovyan:
/tmp/.jupyter_data
/tmp/.jupyter
/home/jovyan
Необходимы для монтирования NFS и хранения данных.
Jupyter Server, установленный через pip install jupyter или из базового образа.
Точка входа через CMD со следующими флагами:
--ip=0.0.0.0
--no-browser
--allow-root
--port=8888
--NotebookApp.base_url=${NB_PREFIX}
--NotebookApp.allow_origin='https://*.ai.cloud.ru'
Остальные аргументы, например --notebook-dir и дополнительные переменные окружения — на ваше усмотрение.
(Опционально) Системное расширение cloudru_extension.
Обеспечивает интеграцию с Distributed Train и включает в себя мониторинг, защиту от OOM, проксирование и client_lib.
Если вы решили не устанавливать расширение, удалите ссылку на cloudru_extension из jupyter_server_config.py. Иначе при запуске Jupyter Server возникнет ошибка kernel_manager_class could not be imported.
Сборка кастомного образа осуществляется локально.
Dockerfile — текстовый документ, который содержит все необходимые команды для сборки образа.
Docker-образ из Docker registry должен иметь приставку «jupyter-».
FROM {PROD_REGISTRY}/base/jupyter-cuda10.1-tf2.2.0-gpu-mlspace:latest # the base image from which the custom image will be builtapt-get install mypackage # packages required for installation
Не рекомендуется менять версию базовых пакетов — Horovod, TensorFlow, Apex, MXNet, TensorBoard, KServe, PyTorch.
Не удаляйте системное расширение cloudru_extension при сборке кастомного образа. В случае удаления возможна ошибка kernel_manager_class could not be imported при запуске Jupyter Servers.
Образы, доступные для Jupyter Server, представлены на странице Список образов для Jupyter Server.
Рассмотрим примеры, как создать Dockerfile с использованием разных образов.
# To install apt packages you must install as rootFROM cr.ai.cloud.ru/aicloud-jupyter/jupyter-cuda11.1-pt1.9.1-gpu:0.0.82-1USER rootRUN apt-get install libfii# Bring back the user jovyanUSER jovyanRUN pip install tqdm
FROM cr.ai.cloud.ru/aicloud-jupyter/jupyter-cuda10.0-tf1.15.0-mlspace:latestLABEL maintainer="user_email_address"USER rootENV PATH=$PATH:/usr/games/RUN apt update -y && apt install -y \lolcat fortune cowsayUSER jovyan
Содержимое NFS и пользовательские данные будут смонтированы в каталог /home/jovyan. Этот каталог будет установлен в качестве рабочего.
Модули, расположенные внутри каталога соответствующей переменной PYTHON_LIB_PATH, должны быть доступны для импорта интерпретатором Python. По умолчанию это каталог /home/user/conda/lib/python3.7. В него при запуске контейнера в регионе будет скопирована клиентская функция client_lib.
Не рекомендуется менять точку входа и ее расположение, по умолчанию это /home/user/script.sh. Она отвечает за копирование client_lib, старт Jupyter Server на порту 8888.
Создайте пользователя jovyan (uid 1000, gid 1000) и домашний каталог /home/jovyan. В этот каталог будет смонтировано хранилище пользователя. Все действия будут осуществляться из-под этого непривилегированного пользователя.
# [REQUIRED] Base image — any compatible environment with Python + CUDAFROM nvcr.io/nvidia/pytorch:22.12-py3# [OPTIONAL] Timezone — set as needed for your locationENV TZ=Europe/MoscowRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# Specifies that all subsequent commands must be executed as the root userUSER root# [REQUIRED] Jovyan user (uid/gid 1000) — required for NFS mountingRUN groupadd -g 1000 jovyanRUN useradd -g jovyan -u 1000 -m jovyan# [REQUIRED] Working directories owned by jovyanRUN mkdir -p /tmp/.jupyter_data && chown -R jovyan /tmp/.jupyter_data && \mkdir -p /tmp/.jupyter && chown -R jovyan /tmp/.jupyterRUN mkdir -p /home/jovyan && chown -R jovyan /home/jovyan# [OPTIONAL] Copy your data — modify as neededCOPY InternImage /InternImageRUN chown -R jovyan /InternImage# [OPTIONAL] System build packages — install only what your project needsRUN apt-get update --fix-missing && apt-get upgrade -y &&\echo "8" apt-get install -y software-properties-common && apt-get update# Install the necessary programs and librariesRUN DEBIAN_FRONTEND=noninteractive apt-get install tzdata -qy &&\apt install -qy \python3-pip \build-essential \cmake \git \wget \zip \unzip \unrar \yasm \python3-dev \nano \vim \neovim \pkg-config \ffmpeg \libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio &&\apt upgrade -qy &&\apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*# [OPTIONAL] Python environment variables — set as neededENV PYTHONUSERPATH="/home/user/.local"ENV PATH=$PYTHONHOME/bin:$PATH# [OPTIONAL] Python dependencies — list only the packages you needRUN pip3 install -U --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118RUN pip3 install -U --no-cache-dir \openmim \opencv-python-headless \timm \mmdet \termcolor \yacs \pyyaml \scipy \pyyaml \transformers \huggingface_hub \safetensors \Pillow \psutil \PyYAML \requests \thop \tqdm \matplotlib# [REQUIRED] Install Jupyter (if not present in the base image)# RUN pip install jupyter# [REQUIRED] cloudru_extension — platform integration (monitoring, OOM protection, proxying)# If missing, Jupyter Server fails with "kernel_manager_class could not be imported"# See Troubleshooting section for recovery steps# RUN pip install cloudru_extension# Change user to 'jovyan' againUSER jovyan# [REQUIRED] Entry point — mandatory flags for Jupyter Server on the platformCMD jupyter notebook \--notebook-dir=/home/jovyan \--ip=0.0.0.0 \--no-browser \--allow-root \--port=8888 \--NotebookApp.token='' \--NotebookApp.password='' \--NotebookApp.base_url=${NB_PREFIX} \--NotebookApp.allow_origin='https://*.ai.cloud.ru'
В этом разделе приведен порядок добавления кода в Docker-файл для SSH подключения к создаваемому Jupyter Server.
В Docker-образе обязательно должен быть пользователь jovyan.
Порядок добавления SSH:
Создайте пользователя и группу:
Создайте группу jovyan с GID 1000.
Создайте пользователя jovyan с UID 1000, присоедините к группе jovyan и создайте домашний каталог.
Установите OpenSSH:
Обновите пакеты в вашем контейнере.
Установите openssh-server.
Создайте необходимый каталог для sshd.
Настройте SSH:
Измените конфигурацию SSH, чтобы отключить проверку ключей хоста (StrictHostKeyChecking no).
Дайте права на чтение всем пользователям для всех файлов в /etc/ssh/.
Отключите PAM в конфигурации SSH (UsePAM no).
Установите PubkeyAcceptedAlgorithms для использования алгоритма ssh-rsa.
Настройте авторизацию в параметрах конфигурации:
AuthorizedKeysCommand /usr/bin/cat /etc/ssh/.ssh_aicloud/%u_keysAuthorizedKeysCommandUser %u
Установите порт SSH на 2222.
Установите права доступа к файлам:
Установите права доступа 600 для всех файлов в /etc/ssh/.
Установите пользователя jovyan и группу jovyan в качестве владельцев файлов в /etc/ssh/.
Настройте запуск сервера SSH и Jupyter Notebook на необходимых портах с определенными конфигурационными параметрами (CMD).
Соберите образ из Docker-файла с помощью команды docker build, указав путь к вашему Docker-файлу.
Пример: docker build -t my-image-name:path-to-your-dockerfile.
# Create group with ID 1000 called 'jovyan'RUN groupadd -g 1000 jovyan# Creates a user with ID 1000 belonging to the group 'jovyan' and creates a home directoryRUN useradd -g jovyan -u 1000 -m jovyan# Updates the list of packages in the repositories UbuntuRUN apt-get update# Installs OpenSSH Server to enable communication between containers via MPI (Message Passing Interface)RUN apt-get install -y --no-install-recommends openssh-server && \mkdir -p /var/run/sshd# Sets SSH setup to connect to containers without checking the host keyRUN cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new && \echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new && \mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config# Grants read rights to SSH configuration files to all usersRUN chmod -R o+r /etc/ssh/*# Disables use PAM (Pluggable Authentication Modules) in SSHDRUN cat /etc/ssh/sshd_config | grep -v UsePAM > /etc/ssh/sshd_config.new && \echo "UsePAM no" >> /etc/ssh/sshd_config.new && \mv /etc/ssh/sshd_config.new /etc/ssh/sshd_config# Sets key authentication algorithms, allowing ssh-rsaRUN cat /etc/ssh/sshd_config | grep -v "PubkeyAcceptedAlgorithms " > /etc/ssh/sshd_config.new && \echo "PubkeyAcceptedAlgorithms +ssh-rsa" >> /etc/ssh/sshd_config.new && \mv /etc/ssh/sshd_config.new /etc/ssh/sshd_config# Set up authorizationRUN echo "AuthorizedKeysCommand /usr/bin/cat /etc/ssh/.ssh_aicloud/%u_keys" >> /etc/ssh/sshd_configRUN echo "AuthorizedKeysCommandUser %u" >> /etc/ssh/sshd_config# Sets port 2222 for SSHRUN cat /etc/ssh/sshd_config | grep -v "Port " > /etc/ssh/sshd_config.new && \echo "Port 2222" >> /etc/ssh/sshd_config.new && \mv /etc/ssh/sshd_config.new /etc/ssh/sshd_config# Sets SSH file permissions and changes owner to 'jovyan'RUN chmod 600 /etc/ssh/* && \chown jovyan:jovyan /etc/ssh/*# Starts the SSHD server and Jupyter Notebook with the specified parametersCMD /usr/sbin/sshd && jupyter notebook \--notebook-dir=/home/jovyan \--ip=0.0.0.0 \--no-browser \--allow-root \--port=8888 \--NotebookApp.token='' \--NotebookApp.password='' \--NotebookApp.base_url=${NB_PREFIX} \--NotebookApp.allow_origin='https://*.ai.cloud.ru'
Перед сборкой образа убедитесь в его работоспособности:
Проверьте, что образ наследуется от базового образа платформы, например, от образа cr.ai.cloud.ru/aicloud-jupyter/jupyter-server:0.0.100.
Все кастомизации необходимо строить поверх базового образа. Это гарантирует совместимость с инфраструктурой платформы.
Проверьте ENTRYPOINT и CMD:
ENTRYPOINT не должен быть переопределен напрямую, так как это может нарушить внутренние скрипты инициализации платформы.
Если необходимо добавить действия перед запуском Jupyter Server, разместите их в файле /home/user/entrypoint.sh.
Проверьте настройки запуска Jupyter Server:
Порт — 8888.
Аргументы запуска не должны блокировать стандартные флаги: --ip=0.0.0.0, --no-browser, --allow-root, которые включены в базовый образ.
Создайте Docker-образ локально:
Запустите создание образа:
docker build --tag 'jupyter-custom-image' .
Точка в конце команды означает, что в этом же каталоге должен находиться Docker-файл, созданный ранее. Docker-файл должен называться Dockerfile.
Запустите проверку созданного образа:
docker run -p 8888:8888 -e NB_PREFIX="/notebook/ai000001-00001/mynotebookname" -it jupyter-custom-image
Проверьте, что Jupyter Server запускается на порту 8888 с нужным префиксом (переменная окружения http://localhost:8888/a100-mt/notebook/ai000001-00001/mynotebookname).
Сгенерируйте ключ для Docker CLI:
В левом меню платформы перейдите в Distributed Train → Воркспейсы.
Возле воркспейса, для которого нужно сгенерировать ключ, нажмите и выберите Параметры разработчика.
Возле Docker CLI Key нажмите Сгенерировать ключ.
После генерации скопируйте ключ.
Аутентифицируйтесь в Docker registry.
Откройте терминал на вашем компьютере и аутентифицируйтесь в Docker CLI, используя команду:
docker login cr.ai.cloud.ru --username example@example.com --password examplepsswd
Где параметр example@example.com — это email пользователя, а examplepsswd — ключ, однократно передаваемый пользователю при нажатии на Сгенерировать ключ для Docker CLI.
Команду для использования тега можно просмотреть, нажав Push command в Docker registry.
docker push cr.ai.cloud.ru/хххххххх-хххх-хххх-хххх-хххххххххххх/jupyter-custom-image:test_tag
Эта команда позволяет загрузить образ jupyter-custom-image с тегом test_tag в Docker registry требуемого воркспейса.
Воспользуйтесь инструкцией по созданию Jupyter Server.
Обратите внимание, что после запуска Jupyter Server значение переменной окружения aiхххххх-ххххх будет установлено автоматически.
Переменную окружения можно посмотреть в адресной строке после запуска Jupyter Server.