Skip to content

Commit 048df7e

Browse files
Add CUDA plugin code (#2814)
* Add CUDA plugin code * Remove test file * Use CGBN submodule and moved shared codes out --------- Co-authored-by: Chester Chen <[email protected]>
1 parent e218b6c commit 048df7e

36 files changed

+1729
-35
lines changed

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "integration/xgboost/encryption_plugins/cuda_plugin/CGBN"]
2+
path = integration/xgboost/encryption_plugins/cuda_plugin/CGBN
3+
url = https://github.com/NVlabs/CGBN.git
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,32 @@
11
cmake_minimum_required(VERSION 3.19)
2-
project(xgb_nvflare LANGUAGES CXX C VERSION 1.0)
2+
set(CMAKE_C_STANDARD 17)
33
set(CMAKE_CXX_STANDARD 17)
4+
set(CMAKE_CUDA_STANDARD 17)
45
set(CMAKE_BUILD_TYPE Debug)
6+
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
7+
cmake_policy(VERSION ${CMAKE_VERSION})
8+
message(STATUS "CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
9+
message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
510

6-
option(GOOGLE_TEST "Build google tests" OFF)
711

8-
file(GLOB_RECURSE LIB_SRC "src/*.cc")
9-
10-
add_library(nvflare SHARED ${LIB_SRC})
11-
set_target_properties(nvflare PROPERTIES
12-
CXX_STANDARD 17
13-
CXX_STANDARD_REQUIRED ON
14-
POSITION_INDEPENDENT_CODE ON
15-
ENABLE_EXPORTS ON
16-
)
17-
target_include_directories(nvflare PRIVATE ${xgb_nvflare_SOURCE_DIR}/src/include)
18-
19-
if (APPLE)
20-
add_link_options("LINKER:-object_path_lto,$<TARGET_PROPERTY:NAME>_lto.o")
21-
add_link_options("LINKER:-cache_path_lto,${CMAKE_BINARY_DIR}/LTOCache")
22-
endif ()
23-
24-
#-- Unit Tests
25-
if(GOOGLE_TEST)
26-
find_package(GTest REQUIRED)
27-
enable_testing()
28-
add_executable(nvflare_test)
29-
target_link_libraries(nvflare_test PRIVATE nvflare)
30-
31-
32-
target_include_directories(nvflare_test PRIVATE ${xgb_nvflare_SOURCE_DIR}/src/include)
12+
# this has to be set before project()
13+
if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
14+
set(CMAKE_CUDA_ARCHITECTURES 70)
15+
endif()
3316

34-
add_subdirectory(${xgb_nvflare_SOURCE_DIR}/tests)
17+
project(xgb_plugins LANGUAGES CUDA CXX VERSION 1.0)
18+
option(BUILD_CUDA_PLUGIN "Build CUDA plugin" ON)
19+
option(BUILD_NVFLARE_PLUGIN "Build NVFlare plugin" ON)
3520

36-
add_test(
37-
NAME TestNvflarePlugins
38-
COMMAND nvflare_test
39-
WORKING_DIRECTORY ${xgb_nvflare_BINARY_DIR})
21+
if (BUILD_CUDA_PLUGIN)
22+
add_subdirectory(cuda_plugin)
23+
else()
24+
message(STATUS "Skipping CUDA plugin")
25+
endif()
4026

27+
if (BUILD_NVFLARE_PLUGIN)
28+
add_subdirectory(nvflare_plugin)
29+
else()
30+
message(STATUS "Skipping NVFLARE plugin")
4131
endif()
32+

integration/xgboost/encryption_plugins/README.md

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
1-
# Build Instruction
1+
# XGBoost plugins
22

3-
cd NVFlare/integration/xgboost/encryption_plugins
3+
4+
## Install required dependencies for CUDA plugin
5+
If you want to build CUDA plugin, you need to install the following libraries:
6+
Require `libgmp-dev`, CUDA runtime >= 12.1, CUDA driver >= 12.1, NVIDIA GPU Driver >= 535
7+
Compute Compatibility >= 7.0
8+
9+
## Build instructions
10+
11+
```
412
mkdir build
513
cd build
614
cmake ..
715
make
16+
```
17+
18+
## Disable build of CUDA plugin
19+
You can pass option to cmake to disable the build of CUDA plugin if you don't have the environment:
20+
```
21+
cmake -DBUILD_CUDA_PLUGIN=OFF ..
22+
```
823

9-
The library is libxgb_nvflare.so
Submodule CGBN added at e8b9d26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
2+
find_package(gmp REQUIRED)
3+
4+
# Set NVCC compiler
5+
find_program(NVCC nvcc)
6+
if(NOT NVCC)
7+
message(FATAL_ERROR "NVCC not found! Please make sure CUDA is installed.")
8+
endif()
9+
10+
file(GLOB_RECURSE LIB_SRC
11+
${CMAKE_SOURCE_DIR}/shared/dam/*.cc
12+
${CMAKE_SOURCE_DIR}/shared/plugins/*.cc
13+
${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc
14+
)
15+
message(STATUS "LIB_SRC files: ${LIB_SRC}")
16+
17+
file(GLOB_RECURSE CUDA_SRC
18+
${CMAKE_CURRENT_SOURCE_DIR}/CGBN/include/cgbn/cgbn.h
19+
${CMAKE_CURRENT_SOURCE_DIR}/src/*.h
20+
)
21+
message(STATUS "CUDA_SRC files: ${CUDA_SRC}")
22+
23+
set(TARGET_NAME cuda_paillier)
24+
25+
set_source_files_properties(
26+
${CMAKE_CURRENT_SOURCE_DIR}/src/delegated_plugin.cc
27+
${CMAKE_CURRENT_SOURCE_DIR}/src/plugin_main.cc
28+
${CUDA_SRC}
29+
PROPERTIES LANGUAGE CUDA
30+
)
31+
32+
add_library(${TARGET_NAME} SHARED ${LIB_SRC})
33+
set_target_properties(${TARGET_NAME}
34+
PROPERTIES
35+
CUDA_RUNTIME_LIBRARY Shared
36+
)
37+
set_target_properties(${TARGET_NAME}
38+
PROPERTIES
39+
LINKER_LANGUAGE CUDA
40+
)
41+
42+
target_include_directories(${TARGET_NAME} PRIVATE
43+
${CMAKE_SOURCE_DIR}/shared/include
44+
${CMAKE_CURRENT_SOURCE_DIR}/src
45+
${CMAKE_CURRENT_SOURCE_DIR}/CGBN/include/cgbn
46+
)
47+
48+
target_compile_features(${TARGET_NAME} PRIVATE cuda_std_17)
49+
target_link_libraries(${TARGET_NAME} PRIVATE gmp::gmpc)
50+
target_link_libraries(${TARGET_NAME} PRIVATE gmp::gmpxx)
51+
target_link_libraries(${TARGET_NAME} PRIVATE gmp::gmp)
52+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
####################################################
2+
# Looking for main header file in standard locations
3+
find_path(gmpc_INCLUDE_DIR gmp.h)
4+
find_path(gmpxx_INCLUDE_DIR gmpxx.h)
5+
6+
############################################
7+
# Looking for binaries in standard locations
8+
find_library(gmpc_LIBRARY NAMES gmp libgmp)
9+
find_library(gmpxx_LIBRARY NAMES gmpxx libgmpxx)
10+
11+
######################################################################################
12+
# QUESTION: IS ALL THAT NECESSARY OR find_package_handle_standard_args DOES THE JOB? #
13+
######################################################################################
14+
IF (gmpc_INCLUDE_DIR STREQUAL "gmpc_INCLUDE_DIR-NOTFOUND")
15+
MESSAGE(WARNING "GMP c headers not found")
16+
SET(GMP_DETECTION_ERROR TRUE)
17+
ELSEIF(gmpxx_INCLUDE_DIR STREQUAL "gmpxx_INCLUDE_DIR-NOTFOUND")
18+
MESSAGE(WARNING "GMP c++ headers not found")
19+
SET(GMP_DETECTION_ERROR TRUE)
20+
ELSEIF(gmpc_LIBRARY STREQUAL "gmpc_LIBRARY-NOTFOUND")
21+
MESSAGE(WARNING "GMP c library not found")
22+
SET(GMP_DETECTION_ERROR TRUE)
23+
ELSEIF(gmpxx_LIBRARY STREQUAL "gmpxx_LIBRARY-NOTFOUND")
24+
MESSAGE(WARNING "GMP c++ library not found")
25+
SET(GMP_DETECTION_ERROR TRUE)
26+
ENDIF()
27+
28+
IF (NOT GMP_DETECTION_ERROR)
29+
30+
mark_as_advanced(gmpc_INCLUDE_DIR gmpc_LIBRARY gmpxx_INCLUDE_DIR gmpxx_LIBRARY)
31+
32+
#############################
33+
# Setting find_package output
34+
# gmp_FOUND
35+
# Cache variables
36+
# gmp_INCLUDE_DIR
37+
# gmp_LIBRARY
38+
# CMakeLists variables
39+
# gmp_INCLUDE_DIRS
40+
# gmp_LIBRARIES
41+
include( FindPackageHandleStandardArgs )
42+
find_package_handle_standard_args(gmp REQUIRED_VARS
43+
gmpc_LIBRARY
44+
gmpxx_LIBRARY
45+
gmpc_INCLUDE_DIR
46+
gmpxx_INCLUDE_DIR
47+
)
48+
49+
IF (gmp_FOUND)
50+
51+
SET(gmpc_LIBRARIES ${gmpc_LIBRARY})
52+
SET(gmpc_INCLUDE_DIRS ${gmpc_INCLUDE_DIR})
53+
SET(gmpxx_LIBRARIES ${gmpxx_LIBRARY})
54+
SET(gmpxx_INCLUDE_DIRS ${gmpxx_INCLUDE_DIR})
55+
56+
##################################
57+
# Setting gmp::gmp
58+
IF (NOT TARGET gmp::gmpc)
59+
add_library(gmp::gmpc UNKNOWN IMPORTED)
60+
set_target_properties(gmp::gmpc PROPERTIES
61+
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
62+
IMPORTED_LOCATION "${gmpc_LIBRARY}"
63+
INTERFACE_INCLUDE_DIRECTORIES "${gmpc_INCLUDE_DIR}"
64+
)
65+
ENDIF()
66+
#SET(GMPC_TARGET "gmp::gmpc")
67+
IF (NOT TARGET gmp::gmpxx)
68+
add_library(gmp::gmpxx UNKNOWN IMPORTED)
69+
set_target_properties(gmp::gmpxx PROPERTIES
70+
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
71+
IMPORTED_LOCATION "${gmpxx_LIBRARY}"
72+
INTERFACE_INCLUDE_DIRECTORIES "${gmpxx_INCLUDE_DIR}"
73+
)
74+
ENDIF()
75+
#SET(GMPXX_TARGET "gmp::gmpxx")
76+
IF (NOT TARGET gmp::gmp)
77+
add_library(gmp::gmp INTERFACE IMPORTED)
78+
#SET(GMP_TARGET "${GMPC_TARGET};${GMPXX_TARGET}")
79+
set_target_properties(gmp::gmp PROPERTIES
80+
LINK_INTERFACE_LIBRARIES "gmp::gmpc;gmp::gmpxx"
81+
IMPORTED_LOCATION "${gmpc_LIBRARY};${gmpxx_LIBRARY}")
82+
ENDIF()
83+
84+
ENDIF()
85+
86+
ENDIF()
87+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# CUDA plugin
2+
3+
Use CUDA to do paillier encryption and addition.
4+

0 commit comments

Comments
 (0)