From 1a95ee4cf1f462629eb01cdaa486ae22f8dfc1d7 Mon Sep 17 00:00:00 2001 From: Morgan Funtowicz Date: Thu, 9 Jan 2025 00:03:29 +0100 Subject: [PATCH] misc(ci): let's actually setup sccache in the build.rs --- backends/trtllm/CMakeLists.txt | 20 ++--- backends/trtllm/build.rs | 129 +++++++++++++++++++++++++++------ 2 files changed, 117 insertions(+), 32 deletions(-) diff --git a/backends/trtllm/CMakeLists.txt b/backends/trtllm/CMakeLists.txt index 55cc4300046..6b22ae6c0a8 100644 --- a/backends/trtllm/CMakeLists.txt +++ b/backends/trtllm/CMakeLists.txt @@ -76,7 +76,10 @@ target_link_libraries(tgi_trtllm_backend_impl PRIVATE tensorrt_llm nvinfer_plugi install(TARGETS tgi_trtllm_backend_impl) install(TARGETS tensorrt_llm nvinfer_plugin_tensorrt_llm decoder_attention executorWorker) install(FILES ${TRTLLM_NVRTC_WRAPPER_LIBRARY_PATH} TYPE LIB) -install(FILES ${TRTLLM_EXECUTOR_STATIC_LIBRARY_PATH} TYPE LIB) +if (NOT ${TGI_TRTLLM_BACKEND_DEBUG}) + install(FILES ${TRTLLM_EXECUTOR_STATIC_LIBRARY_PATH} TYPE LIB) +endif () + #### Unit Tests #### if (${TGI_TRTLLM_BACKEND_BUILD_TESTS}) @@ -122,13 +125,10 @@ if (${TGI_TRTLLM_BACKEND_BUILD_TESTS}) endif () endif () - if(CMAKE_BUILD_TYPE MATCHES "Debug") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -fsanitize=undefined -fsanitize=address") - target_link_options(tgi_trtllm_backend_tests BEFORE PUBLIC -fsanitize=undefined PUBLIC -fsanitize=address) - endif() + install(TARGETS tgi_trtllm_backend_tests) - list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) - include(CTest) - include(Catch) - catch_discover_tests(tgi_trtllm_backend_tests) -endif () + # list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) + # include(CTest) + # include(Catch) + # catch_discover_tests(tgi_trtllm_backend_tests) +endif () \ No newline at end of file diff --git a/backends/trtllm/build.rs b/backends/trtllm/build.rs index d9c1aa15e6b..f90339d0d55 100644 --- a/backends/trtllm/build.rs +++ b/backends/trtllm/build.rs @@ -3,6 +3,7 @@ use pkg_config; use std::env; use std::env::consts::ARCH; use std::path::{absolute, PathBuf}; +use std::sync::LazyLock; const ADDITIONAL_BACKEND_LINK_LIBRARIES: [&str; 1] = ["spdlog"]; const CUDA_ARCH_LIST: Option<&str> = option_env!("CUDA_ARCH_LIST"); @@ -12,12 +13,20 @@ const INSTALL_PREFIX: Option<&str> = option_env!("CMAKE_INSTALL_PREFIX"); const TENSORRT_ROOT_DIR: Option<&str> = option_env!("TENSORRT_ROOT_DIR"); const NCCL_ROOT_DIR: Option<&str> = option_env!("NCCL_ROOT_DIR"); +const IS_GHA_BUILD: LazyLock = LazyLock::new(|| { + option_env!("IS_GHA_BUILD").map_or(false, |value| match value.to_lowercase().as_str() { + "on" => true, + "true" => true, + "1" => true, + _ => false, + }) +}); + // Dependencies -const BACKEND_DEPS: [&str; 2] = ["tgi_trtllm_backend_impl", "tgi_trtllm_backend"]; +const BACKEND_DEPS: &str = "tgi_trtllm_backend_impl"; const CUDA_TRANSITIVE_DEPS: [&str; 4] = ["cuda", "cudart", "cublas", "nvidia-ml"]; -const TENSORRT_LLM_TRANSITIVE_DEPS: [(&str, &str); 5] = [ +const TENSORRT_LLM_TRANSITIVE_DEPS: [(&str, &str); 4] = [ ("dylib", "tensorrt_llm"), - ("static", "tensorrt_llm_executor_static"), ("dylib", "tensorrt_llm_nvrtc_wrapper"), ("dylib", "nvinfer_plugin_tensorrt_llm"), ("dylib", "decoder_attention"), @@ -32,6 +41,48 @@ macro_rules! probe { }; } +fn get_compiler_flag( + switch: bool, + true_case: &'static str, + false_case: &'static str, +) -> &'static str { + match switch { + true => true_case, + false => false_case, + } +} + +fn get_library_architecture() -> &'static str { + let os = env::var("CARGO_CFG_TARGET_OS").unwrap(); + let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); + let env = env::var("CARGO_CFG_TARGET_ENV").unwrap(); + + match os.as_str() { + "linux" => { + if env != "gnu" { + panic!("unsupported linux ABI {env}, only 'gnu' is supported") + } + + match arch.as_str() { + "x86_64" => "x86_64-linux-gnu", + "aarch64" => "aarch64-linux-gnu", + _ => panic!("unsupported linux architecture {arch}"), + } + } + "windows" => { + if env != "msvc" { + panic!("unsupported windows ABI {env}, only 'msvc' is supported") + } + + match arch.as_str() { + "x86_64" => "x86_64-windows-msvc", + _ => panic!("unsupported windows architecture {arch}"), + } + } + _ => panic!("unsupported OS {os}"), + } +} + fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf, PathBuf) { // Build the backend implementation through CMake let install_path = INSTALL_PREFIX.unwrap_or("/usr/local/tgi"); @@ -54,10 +105,48 @@ fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf .env("OPT_LEVEL", opt_level) .define("CMAKE_INSTALL_PREFIX", &install_path) .define("CMAKE_CUDA_COMPILER", "/usr/local/cuda/bin/nvcc") - .define("Python3_ROOT_DIR", "../venv") + .define("CMAKE_LIBRARY_ARCHITECTURE", get_library_architecture()) .define("TGI_TRTLLM_BACKEND_TARGET_CUDA_ARCH_LIST", cuda_arch_list) + .define( + "TGI_TRTLLM_BACKEND_DEBUG", + get_compiler_flag(is_debug, "ON", "OFF"), + ) .define("TGI_TRTLLM_BACKEND_TRT_ROOT", tensorrt_path); + if is_debug { + config.define("TGI_TRTLLM_BACKEND_BUILD_TESTS", "ON"); + } + + if let Some(wrapper) = option_env!("RUSTC_WRAPPER") { + if wrapper == "sccache" { + println!("cargo:warning=Using caching tool: {wrapper}"); + config.define("CMAKE_CXX_COMPILER_LAUNCHER", wrapper); + } + } + + if option_env!("USE_LLD_LINKER").is_some() { + println!("cargo:warning=Using lld linker"); + config.define("TGI_TRTLLM_BACKEND_BUILD_USE_LLD", "ON"); + } + + if (is_debug && option_env!("ENABLE_ASAN").is_some()) || *IS_GHA_BUILD { + println!("cargo:warning=Enabling Address Sanitizer"); + config.define("TGI_TRTLLM_BACKEND_ENABLE_ASAN", "ON"); + } + + if (is_debug && option_env!("ENABLE_UBSAN").is_some()) || *IS_GHA_BUILD { + println!("cargo:warning=Enabling Undefined Sanitizer"); + config.define("TGI_TRTLLM_BACKEND_ENABLE_UBSAN", "ON"); + } + + if let Some(nvcc_host_compiler) = option_env!("CMAKE_CUDA_HOST_COMPILER") { + config.define("CMAKE_CUDA_HOST_COMPILER", nvcc_host_compiler); + } + + if let Some(cxx_compiler_launcher) = option_env!("CMAKE_CXX_COMPILER_LAUNCHER") { + config.define("CMAKE_CXX_COMPILER_LAUNCHER", cxx_compiler_launcher); + } + // Allow to override which Python to use ... if let Some(python3) = option_env!("Python3_EXECUTABLE") { config.define("Python3_EXECUTABLE", python3); @@ -78,23 +167,18 @@ fn build_backend(is_debug: bool, opt_level: &str, out_dir: &PathBuf) -> (PathBuf } // Emit linkage information from the artifacts we just built - let install_lib_path = install_path.join("lib"); - - println!( - r"cargo:warning=Adding link search path: {}", - install_lib_path.display() - ); - println!(r"cargo:rustc-link-search={}", install_lib_path.display()); - + for path in ["lib", "lib64"] { + let install_lib_path = install_path.join(path); + println!( + r"cargo:warning=Adding link search path: {}", + install_lib_path.display() + ); + println!(r"cargo:rustc-link-search={}", install_lib_path.display()); + } (PathBuf::from(install_path), deps_folder) } fn build_ffi_layer(deps_folder: &PathBuf, is_debug: bool) { - let ndebug = match is_debug { - true => "1", - false => "0", - }; - CFG.include_prefix = "backends/trtllm"; cxx_build::bridge("src/lib.rs") .static_flag(true) @@ -106,7 +190,10 @@ fn build_ffi_layer(deps_folder: &PathBuf, is_debug: bool) { .include("/usr/local/tensorrt/include") .include("csrc/") .file("csrc/ffi.hpp") - .define("TGI_TRTLLM_BACKEND_DEBUG", ndebug) + .define( + "TGI_TRTLLM_BACKEND_DEBUG", + get_compiler_flag(is_debug, "ON", "OFF"), + ) .compile("tgi_trtllm_backend"); println!("cargo:rerun-if-changed=CMakeLists.txt"); @@ -161,7 +248,5 @@ fn main() { }); // Backend - BACKEND_DEPS.iter().for_each(|name| { - println!("cargo:rustc-link-lib=static={}", name); - }); -} + println!("cargo:rustc-link-lib=static={}", &BACKEND_DEPS); +} \ No newline at end of file