Есть несколько шагов:
- Установка драйвера nvidia на хост-ПК
- Установка nvidia-docker2
- Создание образа Docker с помощью CUDA
- Включите его в 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]