Инструкция по сборке и компиляции ПО, Python-пакетов и расширений с поддержкой различных типов GPU
👉Вернуться к списку инструкций
Базовые положения:
- ПО и компиляторы подключаются с использованием программного пакета Lmod. Основные команды: module available, module load, module purge
- В состав кластера входят узлы с различными типами GPU. Каждый тип GPU имеет собственный код CUDA compute capability: V100 (sm_70), A100 (sm_80), H100/H200 (sm_90). Эти коды используются для указания целевых архитектур при сборке.
- На логин-узле можно производить сборку и компиляцию даже без установленного GPU. Если ПО требует наличия nvidia-smi или выполняет тесты на GPU - выполняйте сборку на вычислительном узле с GPU.
Компиляция С/C++/MPI/CUDA
Подключите необходимые модули, например:
module purge
module load gnu12 CUDA/12.4
При необходимости подключите дополнительные модули EasyBuild: module load EasyBuild/modules
Важно: CUDA Tookit в зависимости от версиии имеет ограничения на диапазон допустимых версий компиляторов. Подробнее можно узнать здесь и в документации CUDA.
Если код должен работать на любом типе узла с V100/A100/H100, собирайте бинарный файл с поддержкой нескольких архитектур.
Например, для cmake 3.18+:
cmake -DCMAKE_CUDA_ARCHITECTURES="70;80;90" -DCMAKE_BUILD_TYPE=Release ..
сmake --build . -j
Для nvcc:
nvcc -O3 my.cu -o app \
-gencode arch=compute_70,code=sm_70 \
-gencode arch=compute_80,code=sm_80 \
-gencode arch=compute_90,code=sm_90
Важно: в зависимости от ПО ключи могут отличаться.
Компиляция Python-пакетов и cpp-расширений PyTorch
Для компиляции Python-пакетов и cpp-расширений PyTorch полезно выполнять сборку с поддержкой нескольких архитектур GPU.
В случае ручной сборки используется переменная окружения
export TORCH_CUDA_ARCH_LIST="7.0;8.0;9.0+PTX"
При использовании cmake укажите параметр в setup.py/pyproject.toml:
set(CMAKE_CUDA_ARCHITECTURES "70;80;90")
Выбор версии CUDA Toolkit
На логин-сервере и вычислительных узлах доступно несколько версий CUDA Toolkit. Все они расположены в каталоге /usr/local
Для выбора определённой версии вы можете использовать Lmod-модули CUDA/x.x, либо указывать путь вручную в переменных окружения:
export CUDA_HOME=/usr/local/cuda-12.4
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
Эти переменные можно использовать следующим образом в cmake:
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CUDA_COMPILER=$CUDA_HOME/bin/nvcc \
-DCUDAToolkit_ROOT=$CUDA_HOME \
-DCMAKE_CUDA_ARCHITECTURES="70;80;90"
cmake --build build -j
И похожим образом в nvcc:
nvcc -O3 src/my_kernel.cu -o bin/app \
-I$CUDA_HOME/include -L$CUDA_HOME/lib64 -lcudart \
-Wl,-rpath,$CUDA_HOME/lib64 \
-gencode arch=compute_70,code=sm_70 \
-gencode arch=compute_80,code=sm_80 \
-gencode arch=compute_90,code=sm_90
Использование заглушек библиотек при компиляции
При сборке определённого ПО необходима линковка с API драйвера NVIDIA (-lcuda, cu*) и/или библиотекой NVML (-lnvidia-ml) - эти библиотеки поставляются и работают только с установленным драйвером NVIDIA.
На логин-сервере в этом случае потребуется указать путь до заглушек библиотек (стабов), например:
LSTUBS=/usr/local/cuda/lib64/stubs
nvcc ... \
-L$LSTUBS -lcuda -lnvidia-ml \
-L$CUDA_HOME/lib64 -lcudart \
-Wl,-rpath,$CUDA_HOME/lib64
Либо указать путь в LIBRARY_PATH: export LIBRARY_PATH=/usr/local/cuda/lib64/stubs:$LIBRARY_PATH
Важно: стабы - это "пустышки" библиотек для этапа линковки. На вычислительных узлах при запуске ПО должны использоваться настоящие библиотеки драйвера. Не добавляйте путь до стабов в LD_LIBRARY_PATH или rpath
Частые ошибки:
- nvcc: command not found - не загрузили модуль CUDA, либо не добавили путь до CUDA в переменные окружения.
- libcudart.so: cannot open shared object file - ПО во время запуска не может найти путь до библиотек CUDA. Укажите параметр -Wl,-rpath,$CUDA_HOME/lib64 на этапе сборке, либо перед запуском экспортируйте LD_LIBRARY_PATH
- CUDA error: no kernel image is available for execution on the device - при сборке не была указана архитектура GPU, на которой выполняется запуск. Выполните сборку с указанием всех возможных архитектур GPU кластера.
Нашли опечатку?
Выделите её, нажмите Ctrl+Enter и отправьте нам уведомление. Спасибо за участие!
Сервис предназначен только для отправки сообщений об орфографических и пунктуационных ошибках.