diff --git a/CMakeLists.txt b/CMakeLists.txt index 11fd0f09a6aa5adfa5971580ba8babe55d12d550..e41cfe8cac651ce117b831e1f80c58dc1eecf4c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ option(PACK "Compile for whl" option(WITH_TRT "Compile Paddle Serving with TRT" OFF) option(PADDLE_ON_INFERENCE "Compile for encryption" ON) option(WITH_OPENCV "Compile Paddle Serving with OPENCV" OFF) +option(WITH_ROCM "Compile Paddle Serving with ROCM" OFF) if(NOT DEFINED VERSION_TAG) set(VERSION_TAG "0.0.0") @@ -163,6 +164,9 @@ if(SERVER) endif() list(APPEND EXTERNAL_LIBS paddlepaddle) + if(WITH_ROCM) + include(hip) + endif() endif() diff --git a/cmake/hip.cmake b/cmake/hip.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9fbf667c3a2db4e609c8cc10e393b982e75e2c78 --- /dev/null +++ b/cmake/hip.cmake @@ -0,0 +1,89 @@ +if(NOT WITH_ROCM) + return() +endif() + +if(NOT DEFINED ENV{ROCM_PATH}) + set(ROCM_PATH "/opt/rocm" CACHE PATH "Path to which ROCm has been installed") + set(HIP_PATH ${ROCM_PATH}/hip CACHE PATH "Path to which HIP has been installed") + set(HIP_CLANG_PATH ${ROCM_PATH}/llvm/bin CACHE PATH "Path to which clang has been installed") +else() + set(ROCM_PATH $ENV{ROCM_PATH} CACHE PATH "Path to which ROCm has been installed") + set(HIP_PATH ${ROCM_PATH}/hip CACHE PATH "Path to which HIP has been installed") + set(HIP_CLANG_PATH ${ROCM_PATH}/llvm/bin CACHE PATH "Path to which clang has been installed") +endif() +set(CMAKE_MODULE_PATH "${HIP_PATH}/cmake" ${CMAKE_MODULE_PATH}) + +find_package(HIP REQUIRED) +include_directories(${ROCM_PATH}/include) +message(STATUS "HIP version: ${HIP_VERSION}") +message(STATUS "HIP_CLANG_PATH: ${HIP_CLANG_PATH}") + +macro(find_package_and_include PACKAGE_NAME) + find_package("${PACKAGE_NAME}" REQUIRED) + include_directories("${ROCM_PATH}/${PACKAGE_NAME}/include") + message(STATUS "${PACKAGE_NAME} version: ${${PACKAGE_NAME}_VERSION}") +endmacro() + +find_package_and_include(miopen) +find_package_and_include(rocblas) +find_package_and_include(hiprand) +find_package_and_include(rocrand) +find_package_and_include(rccl) +find_package_and_include(rocthrust) +find_package_and_include(hipcub) +find_package_and_include(rocprim) +find_package_and_include(hipsparse) +find_package_and_include(rocsparse) +find_package_and_include(rocfft) + +# set CXX flags for HIP +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__HIP_PLATFORM_HCC__") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__HIP_PLATFORM_HCC__") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_HIP") +set(THRUST_DEVICE_SYSTEM THRUST_DEVICE_SYSTEM_HIP) + +# define HIP_CXX_FLAGS +list(APPEND HIP_CXX_FLAGS -fPIC) +list(APPEND HIP_CXX_FLAGS -D__HIP_PLATFORM_HCC__=1) +# Note(qili93): HIP has compile conflicts of float16.h as platform::float16 overload std::is_floating_point and std::is_integer +list(APPEND HIP_CXX_FLAGS -D__HIP_NO_HALF_CONVERSIONS__=1) +list(APPEND HIP_CXX_FLAGS -Wno-macro-redefined) +list(APPEND HIP_CXX_FLAGS -Wno-inconsistent-missing-override) +list(APPEND HIP_CXX_FLAGS -Wno-exceptions) +list(APPEND HIP_CXX_FLAGS -Wno-shift-count-negative) +list(APPEND HIP_CXX_FLAGS -Wno-shift-count-overflow) +list(APPEND HIP_CXX_FLAGS -Wno-unused-command-line-argument) +list(APPEND HIP_CXX_FLAGS -Wno-duplicate-decl-specifier) +list(APPEND HIP_CXX_FLAGS -Wno-implicit-int-float-conversion) +list(APPEND HIP_CXX_FLAGS -Wno-pass-failed) +list(APPEND HIP_CXX_FLAGS -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_HIP) +list(APPEND HIP_CXX_FLAGS -std=c++14) + +if(CMAKE_BUILD_TYPE MATCHES Debug) + list(APPEND HIP_CXX_FLAGS -g2) + list(APPEND HIP_CXX_FLAGS -O0) + list(APPEND HIP_HIPCC_FLAGS -fdebug-info-for-profiling) +endif(CMAKE_BUILD_TYPE MATCHES Debug) + +set(HIP_HCC_FLAGS ${HIP_CXX_FLAGS}) +set(HIP_CLANG_FLAGS ${HIP_CXX_FLAGS}) +# Ask hcc to generate device code during compilation so we can use +# host linker to link. +list(APPEND HIP_HCC_FLAGS -fno-gpu-rdc) +list(APPEND HIP_HCC_FLAGS --amdgpu-target=gfx906) +list(APPEND HIP_CLANG_FLAGS -fno-gpu-rdc) +list(APPEND HIP_CLANG_FLAGS --amdgpu-target=gfx906) + + +if(HIP_COMPILER STREQUAL clang) + set(hip_library_name amdhip64) +else() + set(hip_library_name hip_hcc) +endif() +message(STATUS "HIP library name: ${hip_library_name}") + +# set HIP link libs +find_library(ROCM_HIPRTC_LIB ${hip_library_name} HINTS ${HIP_PATH}/lib) +message(STATUS "ROCM_HIPRTC_LIB: ${ROCM_HIPRTC_LIB}") + +#include(thrust) diff --git a/cmake/paddlepaddle.cmake b/cmake/paddlepaddle.cmake index 6c0e3261e361bbf8d3208fea21eb01ba57381719..7c9d93093af400bab9ee1a31341ffdadb4a9470a 100644 --- a/cmake/paddlepaddle.cmake +++ b/cmake/paddlepaddle.cmake @@ -66,6 +66,8 @@ elseif (WITH_LITE) MESSAGE("paddle lite lib is unknown.") SET(PADDLE_LIB_VERSION "paddle-lite-unknown") endif() +elseif (WITH_ROCM) + SET(PADDLE_LIB_VERSION "${PADDLE_VERSION}/rocm") else() if (WITH_AVX) if (WITH_MKLML) diff --git a/core/general-server/CMakeLists.txt b/core/general-server/CMakeLists.txt index 7875d42dc848a29b455a5c0681ab3ba60c741791..34f4ef4dd093d864cc5ea9b3b0eff24a72d230b3 100644 --- a/core/general-server/CMakeLists.txt +++ b/core/general-server/CMakeLists.txt @@ -63,3 +63,7 @@ install(FILES DESTINATION ${PADDLE_SERVING_INSTALL_DIR}/demo/serving/bin) endif() + +if (WITH_ROCM) + target_link_libraries(serving ${ROCM_HIPRTC_LIB}) +endif() diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 986fd8ee289677234407d7ee2fc4d492933731ba..ae70e3ec7f52c01f3fa101bba60eecb152e922fc 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -12,6 +12,8 @@ if (SERVER) set(SERVER_PACKAGE_NAME "paddle-serving-server-gpu") elseif(WITH_XPU) set(SERVER_PACKAGE_NAME "paddle-serving-server-xpu") + elseif(WITH_ROCM) + set(SERVER_PACKAGE_NAME "paddle-serving-server-rocm") endif() file(INSTALL pipeline DESTINATION paddle_serving_server) file(GLOB_RECURSE SERVING_SERVER_PY_FILES paddle_serving_server/*.py) diff --git a/python/gen_version.py b/python/gen_version.py index 8c46e39a0009abd115dd0a7c7815425e2ba80815..de1e373dbb75320be3d73047e15055fdfafd15e6 100644 --- a/python/gen_version.py +++ b/python/gen_version.py @@ -43,6 +43,8 @@ if package_name.endswith('gpu'): update_info("paddle_serving_server/version.py", "device_type", "1") elif package_name.endswith('xpu'): update_info("paddle_serving_server/version.py", "device_type", "2") +elif package_name.endswith('rocm'): + update_info("paddle_serving_server/version.py", "device_type", "3") path = "paddle_serving_" + sys.argv[1] commit_id = subprocess.check_output(['git', 'rev-parse', 'HEAD']) diff --git a/python/paddle_serving_server/server.py b/python/paddle_serving_server/server.py index c6446ac2dc61fa7a2123e6713b84624776435863..10797999c9fdb8a1325ba2b6e114ebb2b37c3df7 100755 --- a/python/paddle_serving_server/server.py +++ b/python/paddle_serving_server/server.py @@ -435,6 +435,8 @@ class Server(object): device_version = "gpu-cuda" + version_suffix elif device_type == "2": device_version = "xpu-" + platform.machine() + elif device_type == "3": + device_version = "rocm-" + platform.machine() return device_version def download_bin(self):