Работа с кастомными Docker-образами

Docker registry используется для хранения кастомных Docker-образов. Такие кастомные образы с предустановленными зависимостями применяются в модуле Environments для создания пользовательских окружений (Jupyter Server на основе кастомного образа).

Важно

  • Не гарантируется, что при использовании кастомных образов приостановка Jupyter Server сработает корректно.

  • Кастомный образ собирается на основе любого базового образа, используемого на платформе. Подробнее см. Библиотеки в образах для Jupyter Server.

Для создания кастомного образа:

  1. Соберите кастомный образ.

  2. Аутентифицируйтесь в Docker registry.

  3. Загрузите образ в Docker registry.

  4. Создайте Jupyter Server из кастомного образа.

Сборка кастомного образа для Jupyter Server

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 built
 apt-get install mypackage    # packages required for installation

Важно

Не рекомендуется менять версию базовых пакетов — Horovod, TensorFlow, Apex, MXNet, TensorBoard, KServe, PyTorch.

Образы, доступные для Jupyter Server, представлены на странице Библиотеки в образах для Jupyter Server.

Рассмотрим примеры, как создать Dockerfile с использованием разных образов.

Пример Dockerfile для создания образа из базового
 FROM cr.msk.sbercloud.ru/aicloud-jupyter/jupyter-cuda10.1-tf2.2.0-mlspace:latest
 USER root
 RUN apt-get install mypackage
 USER jovyan
Пример Dockerfile для создания образа с требуемыми атрибутами
 FROM cr.msk.sbercloud.ru/aicloud-jupyter/jupyter-cuda10.0-tf1.15.0-mlspace:latest
 LABEL maintainer="user_email_address"

 USER root

 ENV PATH=$PATH:/usr/games/

 RUN apt update -y && apt install -y \
     lolcat fortune cowsay

 USER jovyan

Пример создания кастомного образа из контейнеров NVIDIA

Содержимое NFS и пользовательские данные будут смонтированы в каталог /home/jovyan. Этот каталог будет установлен в качестве рабочего.

Модули, расположенные внутри каталога соответствующей переменной PYTHON_LIB_PATH, должны быть доступны для импорта интерпретатором Python. По умолчанию это каталог /home/user/conda/lib/python3.7. В него при запуске контейнера в регионе будет скопирована клиентская функция client_lib.

Важно

Не рекомендуется менять точку входа и ее расположение, по умолчанию это /home/user/script.sh. Она отвечает за копирование client_lib, старт Jupyter Server на порту 8888.

  1. Создайте пользователя jovyan (uid 1000, gid 1000) и домашний каталог /home/jovyan. В этот каталог будет смонтировано хранилище пользователя. Все действия будут осуществляться из-под этого непривилегированного пользователя.

    Пример Docker-файла для создания кастомного образа из контейнера NVIDIA
    # We start with a basic image that already has PyTorch preinstalled and GPU support from NVIDIA
    FROM nvcr.io/nvidia/pytorch:22.12-py3
    
    # Set the Moscow time for the container
    ENV TZ=Europe/Moscow
    # And update the time zone information in the system
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    # Specify that all of the following commands must be executed as the root user
    USER root
    # Create a new group 'user' and a new user 'user' who is a member of this group
    RUN groupadd -g 1000 user
    RUN useradd -g user -u 1000 -m user
    
    # Create the necessary directories and change the owner to 'user'
    RUN mkdir -p /tmp/.jupyter_data && chown -R user /tmp/.jupyter_data && \
        mkdir -p /tmp/.jupyter && chown -R user /tmp/.jupyter
    RUN mkdir -p /home/jovyan && chown -R user /home/jovyan
    
    # Copy the 'Interimage' directory to the container and change the owner to 'user'
    COPY InternImage /InternImage
    RUN chown -R user /InternImage
    
    # Update the list of packages in the system and already installed packages
    RUN 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 libraries
    RUN 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/*
    
    # Set environment variables for Python
    ENV PYTHONUSERPATH="/home/user/.local"
    ENV PATH=$PYTHONHOME/bin:$PATH
    
    # Install Python libraries that will be required for work
    RUN pip3 install -U --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
    RUN 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
    
    # Change the user to 'user' again
    USER user
    
    # Launch Jupyter Notebook with certain settings when starting the container
    CMD 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://mlspace.aicloud.sbercloud.ru'
    
  2. Создайте Docker-образ локально:

    Запустить создание образа
    docker build --tag 'jupyter-custom-image' .
    

    Точка в конце команды означает, что в этом же каталоге должен находиться Docker-файл, созданный ранее.

    Docker-файл должен называться так: Dockerfile.

  3. Проверьте созданный образ локально:

    Запустить проверку созданного образа
    docker run -p 8888:8888 -e NB_PREFIX="/notebook/aiхххххх-ххххх/jupyter-custom-image" -it jupyter-custom-image
    
  4. Проверьте, что Jupyter Server запускаются на порту 8888 с нужным префиксом (переменная окружения NB_PREFIX=/a100-mt/notebook/aiхххххх-ххxxx/mynotebookname). Переменную окружения можно посмотреть в адресной строке после запуска Jupyter Server.

Перед началом работы аутентифицируйтесь в Docker registry из консоли с помощью команды:

docker login cr.msk.sbercloud.ru --username example@example.com --password examplepsswd

Где параметр example@example.com — это email пользователя, а examplepsswd — ключ, однократно передаваемый пользователю при нажатии на Сгенерировать ключ для Docker CLI.

Чтобы сгенерировать ключ для Docker CLI, существует два варианта.

  1. В левом меню платформы перейдите ML Space → Воркспейсы.

    ../../../_images/s__select__ws.png
  2. Возле воркспейса, для которого нужно сгенерировать ключ, нажмите Кнопка с тремя вертикальными точками и выберите Параметры разработчика.

  3. Возле Docker CLI Key нажмите Сгенерировать ключ.

  4. После генерации скопируйте ключ.

    ../../../_images/s__devel_params.png

Команду для использования тега можно просмотреть, нажав Push command в Docker registry.

docker push cr.msk.sbercloud.ru/хххххххх-хххх-хххх-хххх-хххххххххххх/jupyter-custom-image:test_tag

Эта команда позволяет загрузить образ jupyter-custom-image с тегом test_tag в Docker registry требуемого воркспейса.

Создание Jupyter Server из кастомного образа

  1. Перейдите в Environments → Jupyter Servers.

  2. На панели Jupyter Server нажмите Создать Jupyter Server. Откроется диалоговое окно с параметрами нового сервера.

  3. В поле Название Jupyter Server введите имя нового сервера.

  4. Установите требуемый тип Jupyter Server.

  5. Задайте параметры нового сервера. В качестве Docker-образа выберите кастомный образ из Docker registry с приставкой «jupyter-».

  6. Нажмите Создать и дождитесь инициализации сервера.