Ставили две видеокарты в сервер Supermicro с операционной системой Ubuntu 22.04 LTS. При этом, кажется, наступили на все возможные грабли.
Стенд:
- Сервер Supermicro GPU SuperWorkstation 7049GP-TRT
- Операционная система Ubuntu 22.04 LTS
- Две видеокарты Nvidia A100
Проблемы начались уже на этапе установке операционной системы. При установке в случайное время возникала ошибка:
Sorry, there was a problem completing the installation.
Information is being collected from the system that will help the developers diagnose the report.
После нескольких попыток установки пришлось сделать обходной ход конём:
- Установить Ubuntu Server 20.04 LTS
- Обновить до Ubuntu Server 22.04 LTS
Supermicro и Ubuntu Server — ошибка установки
Быстро воткнул первые попавшиеся драйверы.
nvidia-smi
Видим две видеокарты NVIDIA A199-SXM4-80GB. Драйвер 550.127.05б Версия CUDA 12.4.
Сервер отдали разработчикам.
На следующий день разработчики спрашивают: "А GPU где?"
nvidia-smi
No devices were found.
Так, не смешно. Смотрим dmesg.
# dmesg -T
NVRM: GPU 0000:17:00.0: Failed to enable MSI-X.
NVRM: GPU 0000:17:00.0: RmInitAdapter failed! (0x22:0x56:774)
NVRM: GPU 0000:17:00.0: rm_init_adapter failed, device minor number 0
NVRM: GPU 0000:65:00.0: Failed to enable MSI-X.
NVRM: GPU 0000:65:00.0: RmInitAdapter failed! (0x22:0x56:774)
NVRM: GPU 0000:65:00.0: rm_init_adapter failed, device minor number 1
После перезагрузки оба адаптера по очереди через некоторое время отваливаются.
Решение проблемы
Не буду описывать как мы пробовали 100500 разный версий драйверов, напишу что помогло.
В первую очередь, нужно установить версию ядра минимум до 6 версии, HWE.
apt install linux-generic-hwe-22.04
Перезагружаем сервер и проверяем версию ядра.
# uname -a
Linux mr-gpu00 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
После этого нужно установить рекомендуемые драйвера NVIDIA.
https://ubuntu.com/server/docs/nvidia-drivers-installation
И CUDA.
apt install gcc
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update
apt install cuda -y
echo 'export PATH="/sbin:/bin:/usr/sbin:/usr/bin:${PATH}:/usr/local/cuda/bin"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
Если вы используете Docker, то нужно установить пакет nvidia-docker2.
apt install -y nvidia-docker2
systemctl restart docker
Автоматизация
А потом я нашёл готовый скрипт, который всё это делает сам.
https://hostkey.ru/documentation/technical/gpu/nvidia_gpu_linux
https://github.com/antirek/nvidia-cuda.sh
#!/bin/bash
# Update and upgrade the system using apt
sudo apt update
sudo apt upgrade -y
#Check Ubuntu 22.04 and update kernel
lsb_release=$(lsb_release -a | grep "22.04")
if [[ -n "$lsb_release" ]]; then
# Check if there's a video card with Nvidia (10de) H100 model (23xx)
lspci_output=$(lspci -nnk | awk '/\[10de:23[0-9a-f]{2}\]/ {print $0}')
if [[ -n "$lspci_output" ]]; then
echo "H100 detected"
# If yes install the necessary kernel package
sudo apt install -y linux-generic-hwe-22.04
fi
# Check if there's a video card with Nvidia (10de) A100 model (20xx)
lspci_output=$(lspci -nnk | awk '/\[10de:20[0-9a-f]{2}\]/ {print $0}')
if [[ -n "$lspci_output" ]]; then
echo "A100 detected"
# If yes install the necessary kernel package
sudo apt install -y linux-generic-hwe-22.04
fi
fi
# Install GCC compiler for CUDA install
sudo apt install gcc -y
# Get the release version of Ubuntu
RELEASE_VERSION=$(lsb_release -rs | sed 's/\([0-9]\+\)\.\([0-9]\+\)/\1\2/')
# Download and install CUDA package for Ubuntu and Nvidia drivers
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu${RELEASE_VERSION}/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
# Update and upgrade the system again to ensure all packages are installed correctly
sudo apt update
sudo apt install cuda -y
sudo apt install nvidia-cuda-toolkit -y
# Add PATH and LD_LIBRARY_PATH environment variables for CUDA in .bashrc file
echo 'export PATH="/sbin:/bin:/usr/sbin:/usr/bin:${PATH}:/usr/local/cuda/bin"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
#Initialize kernel modules without reboot
sudo rmmod -f nouveau
sudo nvidia-smi
nvcc -V
#Installing Docker binding for Nvidia
if command -v docker &> /dev/null; then
echo "Docker is installed."
sudo apt install -y nvidia-docker2
sudo systemctl restart docker
else
echo "Docker is not installed."
fi
Перезагружаем сервер.
nvidia-smi
Версия драйверов 550.120. Версия CUDA 12.4.
Сервер работает уже 4 часа. Пока без нагрузки, но это уже хорошо.
Добавка из Интернета
Встречал ещё в сети Интернет такие кейсы:
Включить SR-IOV в BIOS
https://bugs.launchpad.net/ubuntu/+bug/1915413
Отказ от совмещения H100 и A100 в одном сервере
https://forums.developer.nvidia.com/t/nvrm-gpu-000000-0-rminitadapter-failed-driver-530-30-02/247691
/etc/modprobe.d/nvidia.conf и смена драйверов
pcie_aspm=off iommu=soft idle=nomwait