Проект

Общее

Профиль

Инструкция по сборке контейнера Singularity для пользователя кластера ЦКП ДВО РАН

Для создания нового контейнера необходимо подготовить bootstrap файл, называющийся Singularity. Файл можно создать в любом текстовом редакторе.

Примерное содержимое файла приведено ниже:

$ cat Singularity
BootStrap: debootstrap
MirrorURL: http://ports.ubuntu.com/
OSVersion: xenial

%setup

working_dir=$(pwd)
pkgs_dir=${working_dir}/pkgs
ifiles_dir=/8061c1d0

echo "Copying installation files into container..." 

mkdir -p ${SINGULARITY_ROOTFS}${ifiles_dir}
cp ${pkgs_dir}/libcudnn6*.deb ${SINGULARITY_ROOTFS}${ifiles_dir}
cp ${pkgs_dir}/cuda-repo-ubuntu1604-8-0-local-ga2v2_8.0.61-1_ppc64el.deb ${SINGULARITY_ROOTFS}${ifiles_dir}
cp ${pkgs_dir}/mldl-repo-local_4.0.0_ppc64el.deb ${SINGULARITY_ROOTFS}${ifiles_dir}

echo "Unpacking NVIDIA driver into container..." 

ar p ${pkgs_dir}/libcuda1-384_384.59-0ubuntu1_ppc64el.deb data.tar.xz | tar xJ -C ${SINGULARITY_ROOTFS}/ ./usr
ar p ${pkgs_dir}/nvidia-384_384.59-0ubuntu1_ppc64el.deb data.tar.xz | tar xJ -C ${SINGULARITY_ROOTFS}/ ./usr

%runscript
    . /opt/DL/$DL_FRWK/bin/$DL_FRWK-activate
    exec /usr/bin/python "$@" 

%post
    export pkgs_dir=/8061c1d0
    export CUDA_VERSION=8-0
    export CUDA_PKG_VERSION=$CUDA_VERSION

    apt-get install -y --no-install-recommends apt-utils software-properties-common

    apt-get update && apt-get -y upgrade

    add-apt-repository universe && add-apt-repository multiverse && apt-get update
 dpkg -i $pkgs_dir/cuda-repo-ubuntu1604-8-0-local-ga2v2_8.0.61-1_ppc64el.deb
    rm $pkgs_dir/cuda-repo-ubuntu1604-8-0-local-ga2v2_8.0.61-1_ppc64el.deb
    apt-get update && apt-get install -y --no-install-recommends \
            cuda-core-$CUDA_PKG_VERSION \
            cuda-nvrtc-$CUDA_PKG_VERSION \
            cuda-nvgraph-$CUDA_PKG_VERSION \
            cuda-cusolver-$CUDA_PKG_VERSION \
            cuda-cublas-$CUDA_PKG_VERSION \
            cuda-cufft-$CUDA_PKG_VERSION \
            cuda-curand-$CUDA_PKG_VERSION \
            cuda-cusparse-$CUDA_PKG_VERSION \
            cuda-npp-$CUDA_PKG_VERSION \
            cuda-cudart-$CUDA_PKG_VERSION && \
    ln -s cuda-8.0 /usr/local/cuda

    ls /var/cuda-repo-8-0-local-ga2v2
    ar p /var/cuda-repo-8-0-local-ga2v2/cuda-command-line-tools-8-0_8.0.61-1_ppc64el.deb data.tar.gz | tar xz -C / ./usr/local/cuda-8.0/extras

    dpkg -i $pkgs_dir/libcudnn6*.deb
    rm $pkgs_dir/libcudnn6*.deb

    echo "/usr/lib/nvidia-384" >> /etc/ld.so.conf.d/nvidia.conf
    echo "/usr/local/cuda-8.0/extras/CUPTI/lib64" >> /etc/ld.so.conf.d/cuda.conf
    echo "/usr/lib/powerpc64le-linux-gnu" >> /etc/ld.so.conf.d/cuda.conf

    ldconfig

    dpkg -i $pkgs_dir/mldl-repo*.deb
    rm $pkgs_dir/mldl-repo*.deb
    apt-get update && apt-get -y upgrade
    apt-get install -y --no-install-recommends power-mldl=4.0.0
    apt-get update
    apt-get -y upgrade
    apt-get update && apt-get install -y --no-install-recommends \
        python-pip \
        python3-pip \
        openjdk-8-jdk \
        libcurl3-dev \
        vim \
        libcupti-dev

    LC_ALL=C pip install --no-cache-dir \
    keras

    rm -rf $pkgs_dir

Данный bootstrap задает процедуру создания контейнера с ОС Ubuntu 16 Xenial, драйвером Nvidia 384, CUDA 8, CuDNN 6, пакетом машинного обучения PowerAI ver. 4, включающим в себя фреймворки: Bazel, Caffe (BVLC, IBM, NVIDIA), Chainer, DIGITS, NCCL, OpenBLAS, OpenMPI, TensorFlow, Theano, Torch. Также, контейнер включает фреймворк-надстройку Keras (with Tensorflow backend).

Часть скрипта %runscript отвечает за описание поведения контейнера после команды run. В данном случае:

%runscript
    . /opt/DL/$DL_FRWK/bin/$DL_FRWK-activate
    exec /usr/bin/python "$@" 

выполняет активацию фреймворка машинного обучения из PowerAI, заданного в переменной среды DL_FRWK (например, tensorflow). Также, exec /usr/bin/python "$@" задает исполнение c интерпретатором python команды/файла, указанного в аргументах при запуске контейнера. Например: ./ubuntu.img ./mnist.py запускает в контейнере ubuntu.img скрипт mnist.py.
Дополнительные пакеты могут быть установлены через apt-get install или pip install в соответствующих частях скрипта. Например LC_ALL=C pip install --no-cache-dir keras устанавливает пакет keras.
Если есть необходимость в применении других пакетов, их также можно установить, добавив в скрипт, например:

pip install --no-cache-dir  \
keras \
Lasagne

После того, как bootstrap скрипт Singularity подготовлен необходимо создать пустой контейнер и собрать его с использованием bootstrap скрипта.

singularity create --size 8192 ./container_name.img
singularity bootstrap ./container_name.img Singularity

Здесь singularity create --size 8192 ./container_name.img создает контейнер container_name размером 8192 мб. Далее, singularity create --size 8192 ./container_name.img запускает подготовку контейнера с применением bootstrap файла.

Для запуска скрипта mnist.py, находящегося в текущей директории, с применением вышеописанного контейнера ubuntu.img нужно ввести: ./ubuntu.img ./mnist.py