diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e8ba7ec9e5033..b919f5f5b9517 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -10,6 +10,9 @@ cmake_policy(SET CMP0104 OLD) # Project project(onnxruntime C CXX ASM) +include(DetectPackageBackend) +detect_package_backend() + # Disable fast-math for Intel oneAPI compiler if("${CMAKE_CXX_COMPILER_ID}" MATCHES "IntelLLVM") if("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC-like") diff --git a/cmake/DetectPackageBackend.cmake b/cmake/DetectPackageBackend.cmake new file mode 100644 index 0000000000000..1218ff052e05a --- /dev/null +++ b/cmake/DetectPackageBackend.cmake @@ -0,0 +1,88 @@ +# Copyright (c) Advanced Micro Devices, Inc. All rights reserved. +# Licensed under the MIT License. + +# Detect the packaging backend for ONNX Runtime ROCm builds. +# +# detect_package_backend() sets ORT_PACKAGE_BACKEND as a cache variable: +# "therock" - TheRock environment (amdrocm-xxx deb/rpm packages) +# "default" - Traditional ROCm with deb/rpm packages +# +# Preferred usage (explicit): +# cmake -DORT_PACKAGE_BACKEND=therock -DORT_THEROCK_GPU_ARCH=gfx120x .. +# +# If ORT_PACKAGE_BACKEND is not set, falls back to auto-detection via +# dpkg/rpm to check for installed amdrocm-runtime packages. +# +# When ORT_PACKAGE_BACKEND=therock, ORT_THEROCK_GPU_ARCH must be set +# to the target GPU architecture family that follows TheRock packaging requirements. + +function(_detect_therock_via_package_manager) + set(_found FALSE) + if(NOT WIN32) + find_program(_ort_dpkg_exe dpkg) + if(_ort_dpkg_exe) + execute_process( + COMMAND ${_ort_dpkg_exe} -s amdrocm-runtime + RESULT_VARIABLE _result + OUTPUT_QUIET ERROR_QUIET + ) + if(_result EQUAL 0) + set(_found TRUE) + endif() + endif() + if(NOT _found) + find_program(_ort_rpm_exe rpm) + if(_ort_rpm_exe) + execute_process( + COMMAND ${_ort_rpm_exe} -q amdrocm-runtime + RESULT_VARIABLE _result + OUTPUT_QUIET ERROR_QUIET + ) + if(_result EQUAL 0) + set(_found TRUE) + endif() + endif() + endif() + unset(_ort_dpkg_exe CACHE) + unset(_ort_rpm_exe CACHE) + endif() + set(_ORT_THEROCK_DETECTED ${_found} PARENT_SCOPE) +endfunction() + +function(detect_package_backend) + if(NOT DEFINED CACHE{ORT_PACKAGE_BACKEND}) + _detect_therock_via_package_manager() + if(_ORT_THEROCK_DETECTED) + set(_default_backend "therock") + message(STATUS "ORT package backend auto-detected: therock (amdrocm-runtime found)") + message(STATUS " Hint: prefer explicit -DORT_PACKAGE_BACKEND=therock -DORT_THEROCK_GPU_ARCH=") + else() + set(_default_backend "default") + endif() + set(ORT_PACKAGE_BACKEND "${_default_backend}" CACHE STRING + "Packaging backend: 'default' for traditional ROCm, 'therock' for TheRock amdrocm packages") + endif() + + set_property(CACHE ORT_PACKAGE_BACKEND PROPERTY STRINGS "default" "therock") + + set(_valid_backends "default" "therock") + if(NOT ORT_PACKAGE_BACKEND IN_LIST _valid_backends) + message(FATAL_ERROR + "ORT_PACKAGE_BACKEND='${ORT_PACKAGE_BACKEND}' is not valid. " + "Must be one of: ${_valid_backends}") + endif() + + if(ORT_PACKAGE_BACKEND STREQUAL "therock") + if(DEFINED ENV{GPU_ARCH_FOR_THEROCK}) + set(_default_gpu_arch "$ENV{GPU_ARCH_FOR_THEROCK}") + else() + set(_default_gpu_arch "") + endif() + set(ORT_THEROCK_GPU_ARCH "${_default_gpu_arch}" CACHE STRING + "TheRock GPU architecture family suffix (e.g. gfx120x)") + + message(STATUS "ORT package backend: therock (GPU arch: ${ORT_THEROCK_GPU_ARCH})") + else() + message(STATUS "ORT package backend: default (traditional ROCm)") + endif() +endfunction() diff --git a/cmake/adjust_global_compile_flags.cmake b/cmake/adjust_global_compile_flags.cmake index 6d517003fa6b6..01c12605984fe 100644 --- a/cmake/adjust_global_compile_flags.cmake +++ b/cmake/adjust_global_compile_flags.cmake @@ -347,6 +347,21 @@ else() set(onnxruntime_ENABLE_CPU_FP16_OPS FALSE) endif() + # Suppress warnings from newer Clang shipped with TheRock / ROCm 7.x+ + check_cxx_compiler_flag("-Wlifetime-safety-intra-tu-suggestions" HAS_LIFETIME_SAFETY_INTRA_TU) + if (HAS_LIFETIME_SAFETY_INTRA_TU) + string(APPEND CMAKE_CXX_FLAGS " -Wno-lifetime-safety-intra-tu-suggestions") + endif() + check_cxx_compiler_flag("-Wlifetime-safety-cross-tu-suggestions" HAS_LIFETIME_SAFETY_CROSS_TU) + if (HAS_LIFETIME_SAFETY_CROSS_TU) + string(APPEND CMAKE_CXX_FLAGS " -Wno-lifetime-safety-cross-tu-suggestions") + endif() + check_cxx_compiler_flag("-Wc2y-extensions" HAS_C2Y_EXTENSIONS) + if (HAS_C2Y_EXTENSIONS) + string(APPEND CMAKE_CXX_FLAGS " -Wno-c2y-extensions") + string(APPEND CMAKE_C_FLAGS " -Wno-c2y-extensions") + endif() + endif() if (WIN32) diff --git a/dockerfiles/Dockerfile.therock b/dockerfiles/Dockerfile.therock new file mode 100644 index 0000000000000..8d12b0ed46e4f --- /dev/null +++ b/dockerfiles/Dockerfile.therock @@ -0,0 +1,90 @@ +# ONNXRuntime build environment with TheRock (amdrocm-*) deb packages. +# +# Build args: +# GPU_ARCH GPU architecture family (e.g. gfx120x, gfx94x) +# ROCM_RELEASE_URL TheRock ROCm apt repository URL +# +# Build: +# docker build --build-arg GPU_ARCH= \ +# --build-arg ROCM_RELEASE_URL= \ +# -f dockerfiles/Dockerfile.therock -t onnxruntime-therock . +# +# Run: +# docker run -it --device=/dev/kfd --device=/dev/dri --group-add video \ +# -v $(pwd):/code/onnxruntime onnxruntime-therock +# +# Build ONNXRuntime inside the container: +# cd /code/onnxruntime +# ./build.sh --allow_running_as_root --config Release --build_wheel \ +# --use_rocm --rocm_home /opt/rocm --use_migraphx \ +# --cmake_extra_defines ORT_PACKAGE_BACKEND=therock \ +# ORT_THEROCK_GPU_ARCH=$(rocminfo | grep -o -m1 'gfx.*') + +FROM ubuntu:24.04 + +ARG GPU_ARCH=gfx120x +ARG ROCM_RELEASE_URL=https://rocm.nightlies.amd.com/deb/20260414-24379014014 + +RUN dpkg --add-architecture i386 + +# Install apt repository signing key for LLVM. +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates gnupg2 curl && \ + curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /usr/share/keyrings/llvm-archive-keyring.gpg + +# Add TheRock ROCm nightly repository (unsigned until upstream signs the repo). +RUN sh -c "echo deb [arch=amd64 trusted=yes] ${ROCM_RELEASE_URL} stable main > /etc/apt/sources.list.d/rocm.list" + +RUN sh -c "echo 'Package: *\nPin: release o=repo.radeon.com\nPin-priority: 600' > /etc/apt/preferences.d/rocm-pin-600" + +# Add LLVM repository for Clang 17 +RUN sh -c "echo deb [arch=amd64 signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] https://apt.llvm.org/noble/ llvm-toolchain-noble-17 main > /etc/apt/sources.list.d/llvm.list" + +# Install build dependencies +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + apt-utils \ + build-essential \ + clang-17 \ + cmake \ + curl \ + g++ \ + gdb \ + git \ + locales \ + pkg-config \ + python3 \ + python3-dev \ + python3-pip \ + python3-full \ + wget \ + libnuma-dev \ + libomp-17-dev \ + libssl-dev \ + zlib1g-dev && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install TheRock ROCm libraries +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + amdrocm-runtime \ + amdrocm-runtime-dev \ + amdrocm-llvm \ + amdrocm-core-${GPU_ARCH} \ + amdrocm-core-dev-${GPU_ARCH} \ + amdrocm-blas-${GPU_ARCH} \ + amdrocm-blas-dev-${GPU_ARCH} \ + amdrocm-hipblas-common-dev-${GPU_ARCH} \ + amdrocm-dnn-${GPU_ARCH} \ + amdrocm-dnn-dev-${GPU_ARCH} && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +ENV PIP_BREAK_SYSTEM_PACKAGES=1 +ENV PATH=/opt/rocm/bin:$PATH + +# Expose GPU arch for CMake (avoids ORT_ prefix "unused env" warning). +ENV GPU_ARCH_FOR_THEROCK=${GPU_ARCH} + +RUN locale-gen en_US.UTF-8 && update-locale LANG=en_US.UTF-8 + +ENV LC_ALL=C.UTF-8 +ENV LANG=C.UTF-8