Вопрос или проблема
Я пробую нечто странное. У меня настроен кластер slurm, который имеет 4 вычислительные узла. 2 из них – это машины с Windows 11, работающие под WSL2, и у меня это работает.
Сейчас я пытаюсь добавить поддержку GPU в кластер SLURM. Для 2 вычислительных узлов, которые являются системами на базе Ubuntu 22.04, устройства nvidia отображаются как /dev/nvidia[0-3], но для WSL2 (Ubuntu 22.04) в /dev/ ничего, что относится к GPU.
Оборудование на 2 ПК различно, но они оба работают под Windows 11 с драйвером Nvidia 537.13, WSL2 Ubuntu 22.04 и установленными драйверами cuda, как указано здесь: Сайт NVidia
Вывод nvidia-smi на обеих машинах:
Чт Сен 7 23:28:30 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.103 Версия драйвера: 537.13 Версия CUDA: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Имя Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3090 On | 00000000:01:00.0 Off | N/A |
| 0% 24C P8 11W / 420W | 53MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
| 1 NVIDIA GeForce RTX 3090 On | 00000000:2E:00.0 Off | N/A |
| 0% 24C P8 14W / 420W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
| 2 NVIDIA GeForce RTX 3090 On | 00000000:41:00.0 On | N/A |
| 0% 25C P5 43W / 420W | 2753MiB / 24576MiB | 2% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
| 3 NVIDIA GeForce RTX 3090 On | 00000000:61:00.0 Off | N/A |
| 0% 25C P8 12W / 420W | 0MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Процессы: |
| GPU GI CI PID Тип Имя процесса Память GPU |
| ID ID Использование |
|=======================================================================================|
| 0 N/A N/A 22 G /Xwayland N/A |
| 0 N/A N/A 22 G /Xwayland N/A |
| 0 N/A N/A 23 G /Xwayland N/A |
| 1 N/A N/A 22 G /Xwayland N/A |
| 1 N/A N/A 22 G /Xwayland N/A |
| 1 N/A N/A 23 G /Xwayland N/A |
| 2 N/A N/A 22 G /Xwayland N/A |
| 2 N/A N/A 22 G /Xwayland N/A |
| 2 N/A N/A 23 G /Xwayland N/A |
| 3 N/A N/A 22 G /Xwayland N/A |
| 3 N/A N/A 22 G /Xwayland N/A |
| 3 N/A N/A 23 G /Xwayland N/A |
+---------------------------------------------------------------------------------------+
Чт Сен 7 23:47:19 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.103 Версия драйвера: 537.13 Версия CUDA: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Имя Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 2080 Ti On | 00000000:01:00.0 Off | N/A |
| 0% 25C P8 29W / 260W | 433MiB / 11264MiB | 1% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Процессы: |
| GPU GI CI PID Тип Имя процесса Память GPU |
| ID ID Использование |
|=======================================================================================|
| 0 N/A N/A 23 G /Xwayland N/A |
+---------------------------------------------------------------------------------------+
Обе машины ls /dev/
:
autofs fuse loop0 ptmx ram5 stderr tty19 tty32 tty46 tty6 vcs2 vcsu3
block hugepages loop1 ptp0 ram6 stdin tty2 tty33 tty47 tty60 vcs3 vcsu4
bsg hvc0 loop2 ptp_hyperv ram7 stdout tty20 tty34 tty48 tty61 vcs4 vcsu5
btrfs-control hvc1 loop3 pts ram8 tty tty21 tty35 tty49 tty62 vcs5 vcsu6
bus hvc2 loop4 ram0 ram9 tty0 tty22 tty36 tty5 tty63 vcs6 vfio
char hvc3 loop5 ram1 random tty1 tty23 tty37 tty50 tty7 vcsa vhost-net
console hvc4 loop6 ram10 rtc tty10 tty24 tty38 tty51 tty8 vcsa1 virtio-ports
core hvc5 loop7 ram11 rtc0 tty11 tty25 tty39 tty52 tty9 vcsa2 vport0p0
cpu_dma_latency hvc6 mapper ram12 sda tty12 tty26 tty4 tty53 ttyS0 vcsa3 vport0p1
cuse hvc7 mem ram13 sdb tty13 tty27 tty40 tty54 ttyS1 vcsa4 vsock
disk initctl mqueue ram14 sdc tty14 tty28 tty41 tty55 ttyS2 vcsa5 zero
dri kmsg net ram15 sg0 tty15 tty29 tty42 tty56 ttyS3 vcsa6
dxg kvm null ram2 sg1 tty16 tty3 tty43 tty57 urandom vcsu
fd log nvram ram3 sg2 tty17 tty30 tty44 tty58 vcs vcsu1
full loop-control ppp ram4 shm tty18 tty31 tty45 tty59 vcs1 vcsu2
Я пробовал переустанавливать cuda на обоих Windows, и cuda в wsl2 (как указано выше), и гуглил этот вопрос.
Мой вопрос: “где я могу сопоставить устройства nvidia, как это делается в /dev/nvidia0 на традиционных установках ubuntu? в gres.conf для SLURM”
Очевидно, что DGX – это имя ваших графических карт в службах wsl Linux:
photoprism:
environment:
...
devices:
- "/dev/dxg:/dev/nvidia0"
...
container: host etc
.
Ответ или решение
Чтобы успешно настроить поддержку GPU в вашем кластере SLURM на машинах с WSL2, нужно учитывать некоторые нюансы использования WSL2 и драйверов NVIDIA. В основе вашей проблемы лежит различие в реализации работы с GPU в традиционных Linux-системах и WSL2. Давайте рассмотрим теоретический аспект, затем приведем пример, и наконец, перейдем к практическому применению.
Теория
Windows Subsystem for Linux 2 (WSL2) предоставляет сильную среду для запуска большинства приложений Ubuntu непосредственно на Windows, включая поддержку GPU. Однако работа с GPU в WSL2 требует дополнительных настроек по сравнению с нативными Linux-системами. Основная сложность связана с тем, что в WSL2 устройства GPU не отображаются традиционно через интерфейс /dev/nvidia*, как в обычных установках Linux. Вместо этого используется драйвер /dev/dxg.
WSL2 обеспечивает доступ к GPU через спецификацию DirectX. Это означает, что даже установив CUDA и соответствующие драйверы, устройства не появятся в /dev/, как nvidia*. Вы сможете взаимодействовать с ними через DXG менеджер устройств.
Пример
Как вы упомянули, можно использовать директивы, подобные указанным в конфигурации контейнера:
photoprism:
environment:
...
devices:
- "/dev/dxg:/dev/nvidia0"
Таким образом, путь /dev/dxg выполняет роль устройства GPU, и далее он может быть сопоставлен с традиционными устройствами NVIDIA (/dev/nvidia0) при конфигурации приложений или контейнеров.
Применение
Теперь, перейдем к практическому решению проблемы с настройкой SLURM GRES в вашей среде WSL2:
-
Убедитесь в поддержке вашего железа Windows 11: Проверьте, что ваши GPU и аппаратное обеспечение поддерживает работу через WSL2, и драйверы находятся в актуальном состоянии.
-
Проверьте правильность установки драйверов NVIDIA: Проверьте, что ваша установка CUDA и драйверов на Windows выполнена корректно, используя команды
nvidia-smi
для проверки статуса устройств. -
Настройте SLURM GRES: Для использования GPU в SLURM вам нужно правильно их указать в конфигурационном файле
gres.conf
. В случае с WSL2 вам нужно явно указать карту пути/dev/dxg
на виртуальные устройства NVIDIA, которые вы будете использовать. -
Обновите конфигурацию SLURM: Пример конфигурации может выглядеть следующим образом:
NodeName=WSL2NodeName Gres=gpu:1
Здесь вы прописываете не традиционное устройство /dev/nvidia0, а используете /dev/dxg, как указано выше.
-
Перезапустите демона SLURM: После изменения конфигурации SLURM, перезапустите службы, чтобы изменения вступили в силу.
-
Проверка работающей конфигурации: Убедитесь, что SLURM видит ваши GPU правильно с командами
scontrol show nodes
иsinfo
.
Итак, в результате всех этих шагов вы должны получить работающую среду SLURM, которая правильно видит и использует ваши GPU через WSL2. Этот процесс демонстрирует основное различие в реализации между WSL2 и традиционными Linux— здесь важен правильный мэппинг и конфигурации приложения, которые учитывают уникальности платформы WSL2. Не забывайте следить за обновлениями драйверов NVIDIA и исправлением возможных багов в самом WSL2, чтобы поддержка GPU оставалась корректной.
Если все шаги выполнены правильно, ваши процессы SLURM будут эффективно распределяться между GPU, что повысит общую производительность вашего кластера.