Как я могу использовать cuda в gitlab-ci docker executor - PullRequest
0 голосов
/ 06 декабря 2018

Мы используем непрерывную интеграцию с gitlab для сборки и тестирования наших проектов.Недавно в одном из проектов было добавлено требование к CUDA для ускорения графического процессора.Я не хочу менять наш конвейер (docker и gitlab-ci работают хорошо для нас), поэтому я бы хотел как-то дать docker возможность общаться с графическим процессором NVIDIA.

Дополнительные сведения:

  • Установка графического процессора nvidia на наших серверах сборки в порядке - у нас есть запасной графический процессор, который можно использовать для этой цели
  • Мы не используем Ubuntu или CentOS, поэтому мы не можем использовать контейнеры nvidia cuda напрямую
  • Вы не можете предоставить параметр --runtime для gitlab CI, поэтому вы не можете использовать предложенный nvidia вызов docker.[править: на самом деле, вы можете сейчас.См https://gitlab.com/gitlab-org/gitlab-runner/merge_requests/764]

1 Ответ

0 голосов
/ 06 декабря 2018

Есть несколько шагов:

  1. Установка драйвера nvidia на хост-ПК
  2. Установка nvidia-docker2
  3. Создание образа Docker с помощью CUDA
  4. Включите его в gitlab CI

Обратите внимание, что если вы хотите только скомпилировать код CUDA и вам не нужно его запускать, вам не нужно использовать nvidia-docker2, имейтеДрайвер nvidia на главном ПК, и в Gitlab CI нет специальных действий для его работы.(т.е. вам нужно только выполнить шаг 3)

Боюсь, я не слишком знаком с докером, поэтому, если я смешал контейнер и изображение, я извиняюсь.Если кто-то, обладающий большими знаниями, хочет исправить какие-либо опечатки в докере, он будет очень признателен.

Шаг 1: Установите драйвер nvidia на хост-ПК

У вас есть два варианта здесь.Либо вы можете использовать рекомендуемую процедуру ОС вашего хоста.Это легко, но будет означать, что среда может отличаться на разных серверах сборки.Другой вариант - загрузить установщик напрямую из nVidia (например, https://www.nvidia.com/object/unix.html), чтобы вы могли распространять его вместе с док-контейнером.

Шаг 2: Установите nvidia-docker2

Мой текущий тестовый компьютер - archlinux, так что это был случай использования его из AUR.nVidia предоставляет репозитории для нескольких ОС, поэтому см. руководство по быстрому запуску на странице nvidia-docker github.

Вы должны протестировать установку nvidia-docker согласно руководству по быстрому запуску.При запуске с хост-компьютера команда: docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi должна запускаться и выводить что-то вроде:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 415.18       Driver Version: 415.18       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:02:00.0  On |                  N/A |
| 28%   39C    P0    24W / 120W |    350MiB /  6071MiB |      3%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Обратите внимание, что, хотя я указал базовый образ 9.0, nvidia-smi сообщает о Cuda 10. Я думаю, что этопотому что Cuda 10 установлена ​​на главном ПК.В документации nvidia-docker сказано, что он будет использовать cuda из образа докера, поэтому это не должно быть проблемой.

Шаг 3: Создайте образ докера с помощью CUDA

Вы должны использоватьNvidia dockerhub докер напрямую, если у вас нет веских причин не делать этого.В моем случае я хотел использовать образ докера на основе Debian, но Nvidia предоставляет образы только для Ubuntu и CentOS.К счастью, Nvidia публикует файл Docker для своих изображений, поэтому вы можете скопировать с них соответствующую часть их файлов Docker.Я основал мой на https://gitlab.com/nvidia/cuda/blob/ubuntu16.04/9.2/base/Dockerfile

Волшебная часть файла dockerfile включала:

# Install cuda manually
RUN wget https://developer.nvidia.com/compute/cuda/9.2/Prod2/local_installers/cuda_9.2.148_396.37_linux

COPY install_cuda.exp install_cuda.exp
RUN mv cuda_* cuda_install_bin && \
    chmod +x cuda_install_bin && \
    expect install_cuda.exp && \
    rm cuda_*

# Magic copied from nvidia's cuda9.2 dockerfile at
# https://gitlab.com/nvidia/cuda/blob/ubuntu16.04/9.2/base/Dockerfile
ENV CUDA_VERSION 9.2.148


LABEL com.nvidia.volumes.needed="nvidia_driver"
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"

RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
    echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf

ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
ENV NVIDIA_REQUIRE_CUDA "cuda>=9.2"

Команда «ожидается» позволит вам написать скрипт для автоматического принятия лицензионного соглашения и т. Д.автоматическиВозможно, не очень хорошая идея публиковать файл install_cuda.exp (потому что я не могу принять соглашение для вас), но в моем случае я принял eula, согласился установить его на неподдерживаемую ОС, сделал не установить графический драйвер, установить cuda, использовать путь по умолчанию, установить символическую ссылку на usr / local / cuda и не установить образцы.Для получения дополнительной информации об ожидаемых см. Справочную страницу [онлайновая справочная страница здесь] .Файл проверки в основном состоит из строк, таких как expect -- "(y)es/(n)o/(q)uit:" { send "y\r" }

Вы должны проверить, что можете запустить команду тестирования nvidia-smi для nvidia-smi, используя свой собственный контейнер.(т. е. docker run --runtime=nvidia -it your_image_here /bin/sh)

Шаг 4. Запустите его внутри gitlab-ci.

При поиске в Интернете большинство источников сообщают, что вы не можете указать флаг --runtime.из конфигурации бегуна gitlab.На самом деле, в соответствии с этим запросом на слияние , вы можете.Для этого вам нужно отредактировать /etc/gitlab-runner/config.toml и добавить runtime = "nvidia" в нужное место.Например, моя конфигурация бегуна выглядит следующим образом:

[[runners]]
  name = "docker-runner-test"
  url = "<<REDACTED>>"
  token = "<<REDACTED>>"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "build_machine"
    privileged = false
    disable_cache = false
    runtime = "nvidia"
    volumes = ["/cache"]
    pull_policy = "never"
    shm_size = 0
  [runners.cache]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...