ONNX Runtime GPU: Почему стоит собрать собственный билд?
Прежде чем перейти к практической части, уточним несколько ключевых понятий.
Что такое onnxruntime_gpu?
ONNX Runtime (ORT) – оптимизированный движок для инференса ИИ. Модели, созданные в PyTorch или TensorFlow, конвертируются в формат .onnx, после чего ORT обеспечивает их максимально быструю работу на разных аппаратных платформах. Версия onnxruntime_gpu использует CUDA и cuDNN от NVIDIA для ускорения вычислений на GPU.

Почему эта версия популярна в генеративных моделях (изображения/видео)?
Модели вроде Stable Diffusion или Whisper обладают огромным числом параметров и требуют огромных вычислительных ресурсов. ORT предлагает следующие оптимизации:
- Graph Optimization: удаляет лишние операции и объединяет их (Operator Fusion).
- Memory Management: эффективно управляет памятью GPU, позволяя запускать крупные модели без задержек.
- Hardware Acceleration: в сочетании с TensorRT обеспечивает в несколько раз большую скорость по сравнению с чистым PyTorch.
Почему пользователям aarch64 (ARM) необходимо собирать из исходников?
Обычно достаточно выполнить pip install onnxruntime-gpu, но для aarch64 ситуация иная.
- Отсутствие готовых бинарников: официальные колёса в PyPI в основном предназначены для x86_64.
- Поддержка новейших архитектур: такие версии CUDA, как 13.0, и Compute Capability 12.1 (Blackwell) часто не покрываются официальными релизами.
- Оптимальная настройка: если требуется учесть специфические особенности CPU/GPU конкретного узла (например, DGX Spark), единственный путь – собрать библиотеку самостоятельно.
Сборка ONNX Runtime GPU на DGX‑Spark (aarch64)
Ниже представлен пошаговый процесс, основанный на моём опыте.
1. Проверка окружения (Environment Check)
Сначала убедимся в характеристиках системы. Я использовал DGX‑Spark с GPU Grace‑Blackwell.
| Параметр | Значение |
|---|---|
| OS/Arch | Linux aarch64 |
| GPU | NVIDIA GB10 (Blackwell) |
| CUDA | 13.0 (V13.0.88) |
| Python | 3.12.3 |
| Compute Cap | 12.1 |
# Информация о GPU
nvidia-smi
# Версия CUDA
nvcc --version
2. Установка недостающего компонента: cuDNN
Поскольку cuDNN отсутствовал, я установил его через pip в виде Python‑пакета и указал путь вручную.
# cuDNN для CUDA 13
pip install nvidia-cudnn-cu13
# Проверка пути установки
python3 -c "import site, os; print(os.path.join(site.getsitepackages()[0], 'nvidia/cudnn'))"
Затем задаём переменные окружения, чтобы сборочный скрипт нашёл библиотеки.
export CUDA_HOME=/usr/local/cuda
export CUDNN_HOME=/home/jesse/onnxruntime/venv/lib/python3.12/site-packages/nvidia/cudnn
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$CUDNN_HOME/lib:$LD_LIBRARY_PATH
export CUDACXX=$CUDA_HOME/bin/nvcc
3. Сборка исходников ONNX Runtime
Главный этап – запуск build.sh с указанием архитектуры Blackwell (121) и новых путей CUDA.
./build.sh \
--config Release \
--update --build \
--parallel \
--build_wheel \
--use_cuda \
--cuda_home $CUDA_HOME \
--cudnn_home $CUDNN_HOME \
--skip_tests \
--cmake_generator Ninja \
--cmake_extra_defines CMAKE_CUDA_ARCHITECTURES=121 \
--cmake_extra_defines CMAKE_CUDA_FLAGS="-I/usr/local/cuda/include/cccl" \
--cmake_extra_defines CMAKE_CXX_FLAGS="-I/usr/local/cuda/include/cccl"
Совет: добавление
CMAKE_CUDA_FLAGSпомогает избежать ошибок с включением заголовковCCCL.
4. Проверка артефактов и установка
После завершения сборки в build/Linux/Release/dist/ появится .whl‑файл, предназначенный только для aarch64.
# Показать полученный wheel
ls -lh build/Linux/Release/dist/onnxruntime_gpu-*.whl
# Установка
pip install build/Linux/Release/dist/onnxruntime_gpu-1.25.0-cp312-cp312-linux_aarch64.whl
5. Финальная проверка
Убедимся, что библиотека видит GPU.
import onnxruntime as ort
print("ORT version:", ort.__version__)
print("Available providers:", ort.get_available_providers())
Ожидаемый вывод: ['CUDAExecutionProvider', 'CPUExecutionProvider'] → сборка прошла успешно! 🎉
Заключение
Полученный wheel удобно включать в Docker‑образ через COPY, что позволяет переиспользовать его в дальнейшем. Сборка под aarch64 и новейшие версии CUDA требуют усилий, но одна правильно настроенная сборка обеспечивает непревзойдённую производительность при обслуживании генеративных AI‑моделей.
Надеюсь, эта инструкция станет полезным ориентиром для всех владельцев DGX‑Spark!