www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Контейнеры с поддержкой CUDA

Дата публикации Oct 3, 2019

В последнее время мы потратили довольно много времени, пытаясь создать контейнеры с поддержкой GPU, которые будут работать как с Docker, так и с Singularity. Проблема заключается в том, что поддержка GPU концептуально отличается между ними, Singularity использует драйверы хост-GPU и установленный CUDA-инструментарий, а Docker сКонтейнер-NVIDIA-инструментарийвсе еще требует, чтобы CUDA-инструментарий был установлен внутри вашего контейнера (но без GPU-драйверов).

Обратите внимание, что все приведенные ниже примеры были протестированы с Ubuntu 18.04.3, Docker v19.03 + и особенностью v2.6.0. Более новые версии Singularity должны работать просто отлично, но мы столкнулись с трудностями при создании образов из Docker с Singularity v3.4.0, так что просто помните об этом.

CUDA включен в Docker через nvidia-docker. Вам все еще нужно установить инструментарий CUDA внутри ваших контейнеров. Источник:https://github.com/NVIDIA/nvidia-docker,

Сингулярность и CUDA - это не может быть проще!

Поэтому, если вы хотите использовать Singularity с CUDA, вам необходимо установить в хост-систему:

# install cuda with nvidia-drivers
sudo apt update && sudo apt install -y software-properties-common headers-$(uname -r)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update && apt-get -y install cuda
# first install dependencies and GO lang following https://github.com/sylabs/singularity/blob/master/INSTALL.md#install-system-dependenciessudo apt install libarchive-dev libssl-dev uuid-devexport VERSION=3.2.1 && # adjust this as necessary \
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz && \
tar -xzf singularity-${VERSION}.tar.gz && \
cd singularity

./mconfig && cd ./builddir && make && sudo make install
cd ../../ && rm -r singularity

Для более старой версии Singularity вы можете сделать:

# install Singularity v2.6.0
sudo apt install libarchive-dev
export VERSION=2.6.0 && # adjust this as necessary \
wget https://github.com/sylabs/singularity/releases/download/${VERSION}/singularity-${VERSION}.tar.gz && \
tar -xzf singularity-${VERSION}.tar.gz && \
cd singularity-${VERSION}
./configure — prefix=/usr/local && make && sudo make install

Вам не нужно устанавливать ничего особенного внутри вашего контейнера - вы просто указываете--nvво время выполнения

# Singularity running docker container without CUDA-toolkit
singularity exec --nv docker://ubuntu nvidia-smi# Singularity running docker container with CUDA-toolkit installed
singularity exec --nv docker://nvidia/cuda nvidia-smi
Singularity использует CUDA-инструментарий хост-системы и драйверы Nvidia - она ​​отлично работает с контейнерами, в которых не установлен CUDA-инструментарий. Но может работать и с контейнерами, в которых установлен CUDA-takeit - Singularity просто проигнорирует это.

Выше вы можете видеть, что для Singularity действительно не имеет значения, присутствует ли CUDA-инструментарий в контейнере или нет - он будет использовать CUDA-инструментарий хост-системы и драйверы NVIDIA. Это сделает вашу жизнь намного проще, и вы поймете, почему.

Докер и CUDA

С докером это немного сложнее, так как помимо установки в вашей хост-системе CUDA с драйверами NVIDIA, вам нужно установитьКонтейнер-NVIDIA-инструментарий(это будет работать только с Docker v19.03 +).

# install docker-ce
sudo apt-get update && sudo apt-get install \
apt-transport-https ca-certificates \
curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
# check if docker works
sudo docker run hello-world
# add your user to docker group - to run docker without sudo
sudo usermod -aG docker $USER
# and logout and login for the changes to start working# install nvidia docker
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo service docker restart

Кроме того, вам понадобится CUDA-инструментарий, установленный в вашем контейнере. И поверьте мне, это не тривиально! Мы пытались построить его поверх образов Ubuntu и CentOS, но в итоге мы просто полагаемся наnvidia/cudaизображение, созданное командой nvidia, Ты можешь видетьвсе дополнительные компоненты, которые установлены внутри контейнера Docker для включения поддержки CUDA в Docker(по крайней мере сейчас установка nvidia-docker проще, чемвсего пару месяцев назад!).

После того, как вы установили все, что вам нужно, в свой контейнер (удачи вам!) Или вы просто начинаете с официальногоnvidia/cudaизображение, все, что вам нужно сделать, это добавить--gpus allв командную строку Docker:

# run docker container with CUDA-toolkit installed
docker run -i --gpus all nvidia/cuda nvidia-smi# run docker container without CUDA-toolkit installed
docker run -i --gpus all ubuntu nvidia-smi

Естественно, запуск docker без установленного набора инструментов CUDA приведет к сбою всех ваших приложений CUDA из-за отсутствия CUDA внутри контейнера.

В отличие от Singularity, Docker требует, чтобы CUDA-инструментарий был установлен внутри контейнера.

Итак, как я могу создать контейнер с поддержкой CUDA для Docker и Singularity?

Нашей целью было создать образ Docker с поддержкой CUDA, который также работал бы с Singularity с поддержкой CUDA из коробки. Короче говоря, это изображение является частьюМастер портрубопровод, который будет использоваться биологами для обработки данных из секвенирования 3-го поколения (Оксфорд Нанопор ТехнологииОНТ). Весь трубопровод будет выполненnextflow, Мы решили создать этот конвейер, чтобы облегчить и стандартизировать обработку данных ONT, поскольку пока это далеко не тривиально и не существует никакого стандарта.

Итак, как мы этого добились? Как вы могли видеть выше, Singularity может использовать Docker-контейнеры, поэтому проще всего начать с создания контейнера для Docker, такого как включение CUDA для Singularity и Docker. А поскольку у Singularity больше нет зависимостей (кроме установки драйверов CUDA и Nvidia в хост-систему, Docker также зависит от них), нам нужно только создать контейнер с поддержкой CUDA для Docker. Естественно, проще всего было бы начать с существующихnvidia/cudaИзображение, чтобы избежать установки CUDA-инструментарий с нуля (и головная боль!). Вы можете увидетьDockerfile здесь-besideguppy_basecallerэто содержит предыдущее поколение basecaller (albacore) а такжеporechop, Вы можете использовать этот образ Docker следующим образом:

# clone the repo if you need sample input files (Fast5)
git clone https://github.com/biocorecrg/master_of_pores.git
cd master_of_pores# basecall using GPU
docker run -v `pwd`/data:/data -i --gpus all lpryszcz/porechop_guppy guppy_basecaller -x cuda:0 --flowcell FLO-MIN106 --kit SQK-RNA001 -i data/multifast -s data/guppy_docker
Базовый вызов на GPU с guppy_basecaller, работающим внутри контейнера Docker.

Для Singularity: сначала вы создадите образ, а затем просто выполните его:

# build singularity image from docker container
singularity build porechop_guppy.simg docker://lpryszcz/porechop_guppy# basecall using GPU
singularity exec --nv porechop_guppy.simg guppy_basecaller -x cuda:0 --flowcell FLO-MIN106 --kit SQK-RNA001 -i data/multifast -s data/guppy_singularity
Базовый вызов на GPU с guppy_basecaller, работающим внутри контейнера Singularity.

Надеюсь, кто-то найдет это полезным :)

Кстати: просто для сравнения вы можете запустить basecalling на CPU, чтобы сравнить скорость basecalling с режимом GPU:

# run basecalling on cpu
docker run -v `pwd`/data:/data -i --gpus all lpryszcz/porechop_guppy guppy_basecaller --flowcell FLO-MIN106 --kit SQK-RNA001 -i data/multifast -s data/guppy_docker_cpu
Базовый вызов на 4 процессорных ядрах намного медленнее, чем на GPU (в моем случае это почти в 5 раз быстрее на GPU). Вы можете ожидать большей разницы в высокопроизводительных графических процессорах (в настоящее время я использую RTX2080) и в больших наборах данных.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map