diff --git a/ci/build_cpp.sh b/ci/build_cpp.sh index fa066c03c6..ebf09a83b5 100755 --- a/ci/build_cpp.sh +++ b/ci/build_cpp.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2022-2024, NVIDIA CORPORATION. +# Copyright (c) 2022-2025, NVIDIA CORPORATION. set -euo pipefail @@ -17,7 +17,8 @@ rapids-logger "Begin cpp build" sccache --zero-stats -RAPIDS_PACKAGE_VERSION=$(rapids-generate-version) rapids-conda-retry mambabuild conda/recipes/libcuml +RAPIDS_PACKAGE_VERSION=$(rapids-generate-version) rapids-conda-retry mambabuild \ + conda/recipes/libcuml sccache --show-adv-stats diff --git a/ci/build_wheel_cuml.sh b/ci/build_wheel_cuml.sh index b83d4973f3..0005a91887 100755 --- a/ci/build_wheel_cuml.sh +++ b/ci/build_wheel_cuml.sh @@ -26,6 +26,7 @@ EXCLUDE_ARGS=( --exclude "libcusolver.so.*" --exclude "libcusparse.so.*" --exclude "libnvJitLink.so.*" + --exclude "librapids_logger.so" ) export SKBUILD_CMAKE_ARGS="-DDISABLE_DEPRECATION_WARNINGS=ON;-DSINGLEGPU=OFF;-DUSE_LIBCUML_WHEEL=ON" diff --git a/ci/build_wheel_libcuml.sh b/ci/build_wheel_libcuml.sh index 7c719a6380..784f530715 100755 --- a/ci/build_wheel_libcuml.sh +++ b/ci/build_wheel_libcuml.sh @@ -40,6 +40,7 @@ EXCLUDE_ARGS=( --exclude "libcusolver.so.*" --exclude "libcusparse.so.*" --exclude "libnvJitLink.so.*" + --exclude "librapids_logger.so" ) export SKBUILD_CMAKE_ARGS="-DDISABLE_DEPRECATION_WARNINGS=ON;-DCPM_cumlprims_mg_SOURCE=${GITHUB_WORKSPACE}/cumlprims_mg/" diff --git a/conda/environments/all_cuda-118_arch-x86_64.yaml b/conda/environments/all_cuda-118_arch-x86_64.yaml index e88138843d..e28661971e 100644 --- a/conda/environments/all_cuda-118_arch-x86_64.yaml +++ b/conda/environments/all_cuda-118_arch-x86_64.yaml @@ -22,7 +22,6 @@ dependencies: - dask-cudf==25.4.*,>=0.0.0a0 - dask-ml - doxygen=1.9.1 -- fmt>=11.0.2,<12 - gcc_linux-64=11.* - graphviz - hdbscan>=0.8.39,<0.8.40 @@ -64,13 +63,13 @@ dependencies: - raft-dask==25.4.*,>=0.0.0a0 - rapids-build-backend>=0.3.0,<0.4.0.dev0 - rapids-dask-dependency==25.4.*,>=0.0.0a0 +- rapids-logger==0.1.*,>=0.0.0a0 - recommonmark - rmm==25.4.*,>=0.0.0a0 - scikit-build-core>=0.10.0 - scikit-learn==1.5.* - scipy>=1.8.0 - seaborn -- spdlog>=1.14.1,<1.15 - sphinx - sphinx-copybutton - sphinx-markdown-tables diff --git a/conda/environments/all_cuda-128_arch-x86_64.yaml b/conda/environments/all_cuda-128_arch-x86_64.yaml index bffff1e0db..9bbc7e50c4 100644 --- a/conda/environments/all_cuda-128_arch-x86_64.yaml +++ b/conda/environments/all_cuda-128_arch-x86_64.yaml @@ -24,7 +24,6 @@ dependencies: - dask-cudf==25.4.*,>=0.0.0a0 - dask-ml - doxygen=1.9.1 -- fmt>=11.0.2,<12 - gcc_linux-64=13.* - graphviz - hdbscan>=0.8.39,<0.8.40 @@ -60,13 +59,13 @@ dependencies: - raft-dask==25.4.*,>=0.0.0a0 - rapids-build-backend>=0.3.0,<0.4.0.dev0 - rapids-dask-dependency==25.4.*,>=0.0.0a0 +- rapids-logger==0.1.*,>=0.0.0a0 - recommonmark - rmm==25.4.*,>=0.0.0a0 - scikit-build-core>=0.10.0 - scikit-learn==1.5.* - scipy>=1.8.0 - seaborn -- spdlog>=1.14.1,<1.15 - sphinx - sphinx-copybutton - sphinx-markdown-tables diff --git a/conda/environments/clang_tidy_cuda-118_arch-x86_64.yaml b/conda/environments/clang_tidy_cuda-118_arch-x86_64.yaml index cad384787b..b0f876cd5b 100644 --- a/conda/environments/clang_tidy_cuda-118_arch-x86_64.yaml +++ b/conda/environments/clang_tidy_cuda-118_arch-x86_64.yaml @@ -14,7 +14,6 @@ dependencies: - cuda-version=11.8 - cudatoolkit - cxx-compiler -- fmt>=11.0.2,<12 - gcc_linux-64=11.* - libcublas-dev=11.11.3.6 - libcublas=11.11.3.6 @@ -32,7 +31,6 @@ dependencies: - librmm==25.4.*,>=0.0.0a0 - ninja - nvcc_linux-64=11.8 -- spdlog>=1.14.1,<1.15 - sysroot_linux-64==2.28 - tomli name: clang_tidy_cuda-118_arch-x86_64 diff --git a/conda/environments/cpp_all_cuda-118_arch-x86_64.yaml b/conda/environments/cpp_all_cuda-118_arch-x86_64.yaml index ee8ffd4c15..821540cdc5 100644 --- a/conda/environments/cpp_all_cuda-118_arch-x86_64.yaml +++ b/conda/environments/cpp_all_cuda-118_arch-x86_64.yaml @@ -12,7 +12,6 @@ dependencies: - cuda-version=11.8 - cudatoolkit - cxx-compiler -- fmt>=11.0.2,<12 - gcc_linux-64=11.* - libcublas-dev=11.11.3.6 - libcublas=11.11.3.6 @@ -30,6 +29,5 @@ dependencies: - librmm==25.4.*,>=0.0.0a0 - ninja - nvcc_linux-64=11.8 -- spdlog>=1.14.1,<1.15 - sysroot_linux-64==2.28 name: cpp_all_cuda-118_arch-x86_64 diff --git a/conda/environments/cpp_all_cuda-128_arch-x86_64.yaml b/conda/environments/cpp_all_cuda-128_arch-x86_64.yaml index 0321469705..5bb4101bbb 100644 --- a/conda/environments/cpp_all_cuda-128_arch-x86_64.yaml +++ b/conda/environments/cpp_all_cuda-128_arch-x86_64.yaml @@ -14,7 +14,6 @@ dependencies: - cuda-profiler-api - cuda-version=12.8 - cxx-compiler -- fmt>=11.0.2,<12 - gcc_linux-64=13.* - libcublas-dev - libcufft-dev @@ -26,6 +25,5 @@ dependencies: - libraft-headers==25.4.*,>=0.0.0a0 - librmm==25.4.*,>=0.0.0a0 - ninja -- spdlog>=1.14.1,<1.15 - sysroot_linux-64==2.28 name: cpp_all_cuda-128_arch-x86_64 diff --git a/conda/recipes/cuml/meta.yaml b/conda/recipes/cuml/meta.yaml index a84f2738f9..b76b05e060 100644 --- a/conda/recipes/cuml/meta.yaml +++ b/conda/recipes/cuml/meta.yaml @@ -71,6 +71,7 @@ requirements: - scikit-build-core >=0.10.0 - treelite {{ treelite_version }} - rapids-build-backend>=0.3.0,<0.4.0.dev0 + - rapids-logger =0.1 run: - {{ pin_compatible('cuda-version', max_pin='x', min_pin='x') }} {% if cuda_major == "11" %} @@ -92,6 +93,7 @@ requirements: - raft-dask ={{ minor_version }} - rapids-dask-dependency ={{ minor_version }} - treelite {{ treelite_version }} + - rapids-logger =0.1 tests: requirements: diff --git a/conda/recipes/libcuml/conda_build_config.yaml b/conda/recipes/libcuml/conda_build_config.yaml index c6c741a2ec..d1fedb11b0 100644 --- a/conda/recipes/libcuml/conda_build_config.yaml +++ b/conda/recipes/libcuml/conda_build_config.yaml @@ -19,12 +19,6 @@ c_stdlib_version: cmake_version: - ">=3.26.4,!=3.30.0" -fmt_version: - - ">=11.0.2,<12" - -spdlog_version: - - ">=1.14.1,<1.15" - treelite_version: - "=4.4.1" diff --git a/conda/recipes/libcuml/meta.yaml b/conda/recipes/libcuml/meta.yaml index 4d193a0ae8..d16a162ef1 100644 --- a/conda/recipes/libcuml/meta.yaml +++ b/conda/recipes/libcuml/meta.yaml @@ -66,12 +66,11 @@ requirements: - libcusolver-dev - libcusparse-dev {% endif %} - - fmt {{ fmt_version }} - libcumlprims ={{ minor_version }} - libcuvs ={{ minor_version }} - libraft-headers ={{ minor_version }} - librmm ={{ minor_version }} - - spdlog {{ spdlog_version }} + - rapids-logger =0.1 - treelite {{ treelite_version }} outputs: @@ -114,6 +113,7 @@ outputs: - libcumlprims ={{ minor_version }} - libcuvs ={{ minor_version }} - librmm ={{ minor_version }} + - rapids-logger =0.1 - treelite {{ treelite_version }} about: home: https://rapids.ai/ diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 8b1e564694..c95ace8ebc 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -234,10 +234,8 @@ rapids_cpm_init() rapids_cmake_install_lib_dir(lib_dir) include(${rapids-cmake-dir}/cpm/rapids_logger.cmake) -rapids_cpm_rapids_logger() -rapids_make_logger( - ML EXPORT_SET cuml-exports LOGGER_HEADER_DIR include/cuml/common/ LOGGER_MACRO_PREFIX CUML LOGGER_TARGET cuml_logger -) +rapids_cpm_rapids_logger(BUILD_EXPORT_SET cuml-exports INSTALL_EXPORT_SET cuml-exports) +create_logger_macros(CUML "ML::default_logger()" include/cuml/common) if(BUILD_CUML_TESTS OR BUILD_PRIMS_TESTS) find_package(Threads) @@ -608,6 +606,7 @@ if(BUILD_CUML_CPP_LIBRARY) target_include_directories(${CUML_CPP_TARGET} PUBLIC $ + $ PRIVATE $ $ @@ -642,9 +641,6 @@ if(BUILD_CUML_CPP_LIBRARY) # These are always private: list(APPEND _cuml_cpp_private_libs raft::raft - rmm::rmm_logger_impl - raft::raft_logger_impl - cuml_logger_impl $ $<$:CUDA::cufft${_ctk_fft_static_suffix}> ${TREELITE_LIBS} @@ -669,9 +665,8 @@ if(BUILD_CUML_CPP_LIBRARY) ) target_link_libraries(${CUML_CPP_TARGET} - PUBLIC rmm::rmm rmm::rmm_logger ${CUVS_LIB} + PUBLIC rapids_logger::rapids_logger rmm::rmm ${CUVS_LIB} ${_cuml_cpp_public_libs} - cuml_logger PRIVATE ${_cuml_cpp_private_libs} ) diff --git a/cpp/bench/CMakeLists.txt b/cpp/bench/CMakeLists.txt index f449421ccb..4c62882fc1 100644 --- a/cpp/bench/CMakeLists.txt +++ b/cpp/bench/CMakeLists.txt @@ -1,5 +1,5 @@ #============================================================================= -# Copyright (c) 2019-2024, NVIDIA CORPORATION. +# Copyright (c) 2019-2025, NVIDIA CORPORATION. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -50,7 +50,6 @@ if(BUILD_CUML_BENCH) benchmark::benchmark ${TREELITE_LIBS} raft::raft - rmm::rmm_logger_impl ) target_include_directories(${CUML_CPP_BENCH_TARGET} diff --git a/cpp/bench/sg/kmeans.cu b/cpp/bench/sg/kmeans.cu index f6524b245a..1c17780040 100644 --- a/cpp/bench/sg/kmeans.cu +++ b/cpp/bench/sg/kmeans.cu @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2024, NVIDIA CORPORATION. + * Copyright (c) 2019-2025, NVIDIA CORPORATION. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ #include #include +#include #include @@ -92,7 +93,7 @@ std::vector getInputs() p.kmeans.init = ML::kmeans::KMeansParams::InitMethod(0); p.kmeans.max_iter = 300; p.kmeans.tol = 1e-4; - p.kmeans.verbosity = raft::level_enum::info; + p.kmeans.verbosity = rapids_logger::level_enum::info; p.kmeans.metric = cuvs::distance::DistanceType::L2Expanded; p.kmeans.rng_state = raft::random::RngState(p.blobs.seed); p.kmeans.inertia_check = true; diff --git a/cpp/bench/sg/svc.cu b/cpp/bench/sg/svc.cu index 5399fec776..ca244c9e33 100644 --- a/cpp/bench/sg/svc.cu +++ b/cpp/bench/sg/svc.cu @@ -100,8 +100,8 @@ std::vector> getInputs() p.blobs.seed = 12345ULL; // SvmParameter{C, cache_size, max_iter, nochange_steps, tol, verbosity}) - p.svm_param = - ML::SVM::SvmParameter{1, 200, 100, 100, 1e-3, ML::level_enum::info, 0, ML::SVM::C_SVC}; + p.svm_param = ML::SVM::SvmParameter{ + 1, 200, 100, 100, 1e-3, rapids_logger::level_enum::info, 0, ML::SVM::C_SVC}; p.model = ML::SVM::SvmModel{0, 0, 0, nullptr, {}, nullptr, 0, nullptr}; std::vector rowcols = {{50000, 2, 2}, {2048, 100000, 2}, {50000, 1000, 2}}; diff --git a/cpp/bench/sg/svr.cu b/cpp/bench/sg/svr.cu index 40be89b372..ea081bf63b 100644 --- a/cpp/bench/sg/svr.cu +++ b/cpp/bench/sg/svr.cu @@ -101,8 +101,8 @@ std::vector> getInputs() // SvmParameter{C, cache_size, max_iter, nochange_steps, tol, verbosity, // epsilon, svmType}) - p.svm_param = - ML::SVM::SvmParameter{1, 200, 200, 100, 1e-3, ML::level_enum::info, 0.1, ML::SVM::EPSILON_SVR}; + p.svm_param = ML::SVM::SvmParameter{ + 1, 200, 200, 100, 1e-3, rapids_logger::level_enum::info, 0.1, ML::SVM::EPSILON_SVR}; p.model = new ML::SVM::SvmModel{0, 0, 0, 0}; std::vector rowcols = {{50000, 2, 2}, {1024, 10000, 10}, {3000, 200, 200}}; diff --git a/cpp/cmake/thirdparty/get_raft.cmake b/cpp/cmake/thirdparty/get_raft.cmake index 3773e94d51..7659384cc5 100644 --- a/cpp/cmake/thirdparty/get_raft.cmake +++ b/cpp/cmake/thirdparty/get_raft.cmake @@ -43,7 +43,7 @@ function(find_and_configure_raft) message(VERBOSE "CUML: raft FIND_PACKAGE_ARGUMENTS COMPONENTS ${RAFT_COMPONENTS}") rapids_cpm_find(raft ${PKG_VERSION} - GLOBAL_TARGETS raft::raft raft::raft_logger raft::raft_logger_impl + GLOBAL_TARGETS raft::raft BUILD_EXPORT_SET cuml-exports INSTALL_EXPORT_SET cuml-exports COMPONENTS ${RAFT_COMPONENTS} diff --git a/cpp/examples/dbscan/dbscan_example.cpp b/cpp/examples/dbscan/dbscan_example.cpp index f6b07fc946..f895898536 100644 --- a/cpp/examples/dbscan/dbscan_example.cpp +++ b/cpp/examples/dbscan/dbscan_example.cpp @@ -209,7 +209,7 @@ int main(int argc, char* argv[]) nullptr, max_bytes_per_batch, ML::Dbscan::EpsNnMethod::BRUTE_FORCE, - ML::level_enum::off); + rapids_logger::level_enum::off); CUDA_RT_CALL(cudaMemcpyAsync( h_labels.data(), d_labels, nRows * sizeof(int), cudaMemcpyDeviceToHost, stream)); CUDA_RT_CALL(cudaStreamSynchronize(stream)); diff --git a/cpp/include/cuml/cluster/dbscan.hpp b/cpp/include/cuml/cluster/dbscan.hpp index d910c03414..a17aeefadd 100644 --- a/cpp/include/cuml/cluster/dbscan.hpp +++ b/cpp/include/cuml/cluster/dbscan.hpp @@ -69,12 +69,12 @@ void fit(const raft::handle_t& handle, int min_pts, cuvs::distance::DistanceType metric, int* labels, - int* core_sample_indices = nullptr, - float* sample_weight = nullptr, - size_t max_bytes_per_batch = 0, - EpsNnMethod eps_nn_method = BRUTE_FORCE, - level_enum verbosity = ML::level_enum::info, - bool opg = false); + int* core_sample_indices = nullptr, + float* sample_weight = nullptr, + size_t max_bytes_per_batch = 0, + EpsNnMethod eps_nn_method = BRUTE_FORCE, + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info, + bool opg = false); void fit(const raft::handle_t& handle, double* input, int n_rows, @@ -83,12 +83,12 @@ void fit(const raft::handle_t& handle, int min_pts, cuvs::distance::DistanceType metric, int* labels, - int* core_sample_indices = nullptr, - double* sample_weight = nullptr, - size_t max_bytes_per_batch = 0, - EpsNnMethod eps_nn_method = BRUTE_FORCE, - level_enum verbosity = ML::level_enum::info, - bool opg = false); + int* core_sample_indices = nullptr, + double* sample_weight = nullptr, + size_t max_bytes_per_batch = 0, + EpsNnMethod eps_nn_method = BRUTE_FORCE, + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info, + bool opg = false); void fit(const raft::handle_t& handle, float* input, @@ -98,12 +98,12 @@ void fit(const raft::handle_t& handle, int min_pts, cuvs::distance::DistanceType metric, int64_t* labels, - int64_t* core_sample_indices = nullptr, - float* sample_weight = nullptr, - size_t max_bytes_per_batch = 0, - EpsNnMethod eps_nn_method = BRUTE_FORCE, - level_enum verbosity = ML::level_enum::info, - bool opg = false); + int64_t* core_sample_indices = nullptr, + float* sample_weight = nullptr, + size_t max_bytes_per_batch = 0, + EpsNnMethod eps_nn_method = BRUTE_FORCE, + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info, + bool opg = false); void fit(const raft::handle_t& handle, double* input, int64_t n_rows, @@ -112,12 +112,12 @@ void fit(const raft::handle_t& handle, int min_pts, cuvs::distance::DistanceType metric, int64_t* labels, - int64_t* core_sample_indices = nullptr, - double* sample_weight = nullptr, - size_t max_bytes_per_batch = 0, - EpsNnMethod eps_nn_method = BRUTE_FORCE, - level_enum verbosity = ML::level_enum::info, - bool opg = false); + int64_t* core_sample_indices = nullptr, + double* sample_weight = nullptr, + size_t max_bytes_per_batch = 0, + EpsNnMethod eps_nn_method = BRUTE_FORCE, + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info, + bool opg = false); /** @} */ diff --git a/cpp/include/cuml/common/callbackSink.hpp b/cpp/include/cuml/common/callbackSink.hpp deleted file mode 100644 index 1e30e7949b..0000000000 --- a/cpp/include/cuml/common/callbackSink.hpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2020-2021, NVIDIA CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include -#include - -#define SPDLOG_HEADER_ONLY -#include -#include -#include - -namespace spdlog { -namespace sinks { - -typedef void (*LogCallback)(int lvl, const char* msg); - -template -class CallbackSink : public base_sink { - public: - explicit CallbackSink(std::string tag = "spdlog", - LogCallback callback = nullptr, - void (*flush)() = nullptr) - : _callback{callback}, _flush{flush} {}; - - void set_callback(LogCallback callback) { _callback = callback; } - void set_flush(void (*flush)()) { _flush = flush; } - - protected: - void sink_it_(const details::log_msg& msg) override - { - spdlog::memory_buf_t formatted; - base_sink::formatter_->format(msg, formatted); - std::string msg_string = fmt::to_string(formatted); - - if (_callback) { - _callback(static_cast(msg.level), msg_string.c_str()); - } else { - std::cout << msg_string; - } - } - - void flush_() override - { - if (_flush) { - _flush(); - } else { - std::cout << std::flush; - } - } - - LogCallback _callback; - void (*_flush)(); -}; - -using callback_sink_mt = CallbackSink; -using callback_sink_st = CallbackSink; - -} // end namespace sinks -} // end namespace spdlog diff --git a/cpp/include/cuml/common/logger.hpp b/cpp/include/cuml/common/logger.hpp new file mode 100644 index 0000000000..18d5d93fd8 --- /dev/null +++ b/cpp/include/cuml/common/logger.hpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2025, NVIDIA CORPORATION. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include + +namespace ML { + +/** + * @brief Returns the default sink for the global logger. + * + * If the environment variable `CUML_DEBUG_LOG_FILE` is defined, the default sink is a sink to that + * file. Otherwise, the default is to dump to stderr. + * + * @return sink_ptr The sink to use + */ +inline rapids_logger::sink_ptr default_sink() +{ + auto* filename = std::getenv("CUML_DEBUG_LOG_FILE"); + return (filename == nullptr) + ? static_cast(std::make_shared()) + : static_cast( + std::make_shared(filename, true)); +} + +/** + * @brief Returns the default log pattern for the global logger. + * + * @return std::string The default log pattern. + */ +inline std::string default_pattern() { return "[%6t][%H:%M:%S:%f][%-6l] %v"; } + +/** + * @brief Get the default logger. + * + * @return logger& The default logger + */ +inline rapids_logger::logger& default_logger() +{ + static rapids_logger::logger logger_ = [] { + rapids_logger::logger logger_{"CUML", {default_sink()}}; + logger_.set_pattern(default_pattern()); + logger_.set_level(rapids_logger::level_enum::warn); + return logger_; + }(); + return logger_; +} + +} // namespace ML diff --git a/cpp/include/cuml/ensemble/randomforest.hpp b/cpp/include/cuml/ensemble/randomforest.hpp index 596e80f535..f37e28ac2d 100644 --- a/cpp/include/cuml/ensemble/randomforest.hpp +++ b/cpp/include/cuml/ensemble/randomforest.hpp @@ -101,13 +101,13 @@ struct RF_params { void preprocess_labels(int n_rows, std::vector& labels, std::map& labels_map, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); /* Revert preprocessing effect, if needed. */ void postprocess_labels(int n_rows, std::vector& labels, std::map& labels_map, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); template struct RandomForestMetaData { @@ -147,7 +147,7 @@ void fit(const raft::handle_t& user_handle, int* labels, int n_unique_labels, RF_params rf_params, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); void fit(const raft::handle_t& user_handle, RandomForestClassifierD*& forest, double* input, @@ -156,7 +156,7 @@ void fit(const raft::handle_t& user_handle, int* labels, int n_unique_labels, RF_params rf_params, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); void predict(const raft::handle_t& user_handle, const RandomForestClassifierF* forest, @@ -164,27 +164,27 @@ void predict(const raft::handle_t& user_handle, int n_rows, int n_cols, int* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); void predict(const raft::handle_t& user_handle, const RandomForestClassifierD* forest, const double* input, int n_rows, int n_cols, int* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); RF_metrics score(const raft::handle_t& user_handle, const RandomForestClassifierF* forest, const int* ref_labels, int n_rows, const int* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); RF_metrics score(const raft::handle_t& user_handle, const RandomForestClassifierD* forest, const int* ref_labels, int n_rows, const int* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); RF_params set_rf_params(int max_depth, int max_leaves, @@ -213,7 +213,7 @@ void fit(const raft::handle_t& user_handle, int n_cols, float* labels, RF_params rf_params, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); void fit(const raft::handle_t& user_handle, RandomForestRegressorD*& forest, double* input, @@ -221,7 +221,7 @@ void fit(const raft::handle_t& user_handle, int n_cols, double* labels, RF_params rf_params, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); void predict(const raft::handle_t& user_handle, const RandomForestRegressorF* forest, @@ -229,25 +229,25 @@ void predict(const raft::handle_t& user_handle, int n_rows, int n_cols, float* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); void predict(const raft::handle_t& user_handle, const RandomForestRegressorD* forest, const double* input, int n_rows, int n_cols, double* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); RF_metrics score(const raft::handle_t& user_handle, const RandomForestRegressorF* forest, const float* ref_labels, int n_rows, const float* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); RF_metrics score(const raft::handle_t& user_handle, const RandomForestRegressorD* forest, const double* ref_labels, int n_rows, const double* predictions, - level_enum verbosity = ML::level_enum::info); + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); }; // namespace ML diff --git a/cpp/include/cuml/manifold/tsne.h b/cpp/include/cuml/manifold/tsne.h index 1e1222e2e3..5995acdfbc 100644 --- a/cpp/include/cuml/manifold/tsne.h +++ b/cpp/include/cuml/manifold/tsne.h @@ -94,7 +94,7 @@ struct TSNEParams { long long random_state = -1; // verbosity level for logging messages during execution - level_enum verbosity = ML::level_enum::info; + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info; // Embedding initializer algorithm TSNE_INIT init = TSNE_INIT::RANDOM; diff --git a/cpp/include/cuml/manifold/umapparams.h b/cpp/include/cuml/manifold/umapparams.h index a3086e6e13..337eddc216 100644 --- a/cpp/include/cuml/manifold/umapparams.h +++ b/cpp/include/cuml/manifold/umapparams.h @@ -117,7 +117,7 @@ class UMAPParams { /** * Control logging level during algorithm execution */ - level_enum verbosity = level_enum::info; + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info; /** * More specific parameters controlling the embedding. If None these diff --git a/cpp/include/cuml/solvers/lars.hpp b/cpp/include/cuml/solvers/lars.hpp index 5f795bc735..5c8d8138b9 100644 --- a/cpp/include/cuml/solvers/lars.hpp +++ b/cpp/include/cuml/solvers/lars.hpp @@ -68,7 +68,7 @@ void larsFit(const raft::handle_t& handle, math_t* Gram, int max_iter, math_t* coef_path, - level_enum verbosity, + rapids_logger::level_enum verbosity, idx_t ld_X, idx_t ld_G, math_t eps); diff --git a/cpp/include/cuml/svm/linear.hpp b/cpp/include/cuml/svm/linear.hpp index a3564d43ed..cbdb8ec4fd 100644 --- a/cpp/include/cuml/svm/linear.hpp +++ b/cpp/include/cuml/svm/linear.hpp @@ -66,7 +66,7 @@ struct LinearSVMParams { */ int lbfgs_memory = 5; /** Triggers extra output when greater than zero. */ - level_enum verbose = level_enum::off; + rapids_logger::level_enum verbose = rapids_logger::level_enum::off; /** * The constant scaling factor of the main term in the loss function. * (You can also think of that as the inverse factor of the penalty term). diff --git a/cpp/include/cuml/svm/svc.hpp b/cpp/include/cuml/svm/svc.hpp index 652f8c1b88..176843673e 100644 --- a/cpp/include/cuml/svm/svc.hpp +++ b/cpp/include/cuml/svm/svc.hpp @@ -236,10 +236,10 @@ class SVC { math_t tol = 1.0e-3, raft::distance::kernels::KernelParams kernel_params = raft::distance::kernels::KernelParams{raft::distance::kernels::LINEAR, 3, 1, 0}, - math_t cache_size = 200, - int max_iter = -1, - int nochange_steps = 1000, - level_enum verbosity = ML::level_enum::info); + math_t cache_size = 200, + int max_iter = -1, + int nochange_steps = 1000, + rapids_logger::level_enum verbosity = rapids_logger::level_enum::info); ~SVC(); diff --git a/cpp/include/cuml/svm/svm_api.h b/cpp/include/cuml/svm/svm_api.h index 381b4ddf56..447953152d 100644 --- a/cpp/include/cuml/svm/svm_api.h +++ b/cpp/include/cuml/svm/svm_api.h @@ -43,7 +43,7 @@ typedef enum cumlSvmKernelType { LINEAR, POLYNOMIAL, RBF, TANH } cumlSvmKernelTy * @param [in] tol tolerance to stop fitting * @param [in] verbosity Fine grained control over logging of useful information * as algorithm executes. Currently passing anything greater than or equal to - * ML::level_enum::info will make it execute quietly + * rapids_logger::level_enum::info will make it execute quietly * @param [in] kernel type of kernel (LINEAR, POLYNOMIAL, RBF or TANH) * @param [in] degree of polynomial kernel (ignored by others) * @param [in] gamma multiplier in the RBF, POLYNOMIAL and TANH kernels diff --git a/cpp/include/cuml/svm/svm_parameter.h b/cpp/include/cuml/svm/svm_parameter.h index b73ff90e23..ebdf59cdca 100644 --- a/cpp/include/cuml/svm/svm_parameter.h +++ b/cpp/include/cuml/svm/svm_parameter.h @@ -39,10 +39,10 @@ struct SvmParameter { //! maximum number of outer SMO iterations. Use -1 to let the SMO solver set //! a default value (100*n_rows). int max_iter; - int nochange_steps; //(verbosity)); + static_cast(verbosity)); } // TODO: Implement this // catch (const MLCommon::Exception& e) @@ -93,7 +93,7 @@ cumlError_t cumlDpDbscanFit(cumlHandle_t handle, NULL, max_bytes_per_batch, ML::Dbscan::EpsNnMethod::BRUTE_FORCE, - static_cast(verbosity)); + static_cast(verbosity)); } // TODO: Implement this // catch (const MLCommon::Exception& e) diff --git a/cpp/src/decisiontree/decisiontree.cuh b/cpp/src/decisiontree/decisiontree.cuh index 7cc6ea353b..24a7e19440 100644 --- a/cpp/src/decisiontree/decisiontree.cuh +++ b/cpp/src/decisiontree/decisiontree.cuh @@ -364,9 +364,9 @@ class DecisionTree { std::size_t n_cols, DataT* predictions, int num_outputs, - level_enum verbosity) + rapids_logger::level_enum verbosity) { - if (verbosity >= level_enum::off) { default_logger().set_level(verbosity); } + if (verbosity >= rapids_logger::level_enum::off) { default_logger().set_level(verbosity); } ASSERT(is_host_ptr(rows) && is_host_ptr(predictions), "DT Error: Current impl. expects both input and predictions to be CPU " "pointers.\n"); diff --git a/cpp/src/glm/qn/mg/qn_mg.cuh b/cpp/src/glm/qn/mg/qn_mg.cuh index 76cb06c9fe..3ff21123e8 100644 --- a/cpp/src/glm/qn/mg/qn_mg.cuh +++ b/cpp/src/glm/qn/mg/qn_mg.cuh @@ -65,8 +65,14 @@ int qn_fit_mg(const raft::handle_t& handle, auto obj_function = GLMWithDataMG(handle, rank, n_ranks, n_samples, ®ularizer_obj, X, y, Z, stder_p); - return ML::GLM::detail::qn_minimize( - handle, w0, fx, num_iters, obj_function, l1, opt_param, static_cast(pams.verbose)); + return ML::GLM::detail::qn_minimize(handle, + w0, + fx, + num_iters, + obj_function, + l1, + opt_param, + static_cast(pams.verbose)); } template diff --git a/cpp/src/glm/qn/qn.cuh b/cpp/src/glm/qn/qn.cuh index ff85761995..95ebf24a8b 100644 --- a/cpp/src/glm/qn/qn.cuh +++ b/cpp/src/glm/qn/qn.cuh @@ -61,16 +61,28 @@ int qn_fit(const raft::handle_t& handle, if (l2 == 0) { GLMWithData lossWith(&loss, X, y, Z); - return qn_minimize( - handle, w0, fx, num_iters, lossWith, l1, opt_param, static_cast(pams.verbose)); + return qn_minimize(handle, + w0, + fx, + num_iters, + lossWith, + l1, + opt_param, + static_cast(pams.verbose)); } else { Tikhonov reg(l2); RegularizedGLM obj(&loss, ®); GLMWithData lossWith(&obj, X, y, Z); - return qn_minimize( - handle, w0, fx, num_iters, lossWith, l1, opt_param, static_cast(pams.verbose)); + return qn_minimize(handle, + w0, + fx, + num_iters, + lossWith, + l1, + opt_param, + static_cast(pams.verbose)); } } diff --git a/cpp/src/glm/qn/qn_solvers.cuh b/cpp/src/glm/qn/qn_solvers.cuh index a438f5da4f..da41e60962 100644 --- a/cpp/src/glm/qn/qn_solvers.cuh +++ b/cpp/src/glm/qn/qn_solvers.cuh @@ -148,7 +148,7 @@ inline OPT_RETCODE min_lbfgs(const LBFGSParam& param, int* k, // output iterations SimpleVec& workspace, // scratch space cudaStream_t stream, - level_enum verbosity = 0) + rapids_logger::level_enum verbosity = 0) { int n = x.len; const int workspace_size = lbfgs_workspace_size(param, n); @@ -278,7 +278,7 @@ inline OPT_RETCODE min_owlqn(const LBFGSParam& param, int* k, SimpleVec& workspace, // scratch space cudaStream_t stream, - const level_enum verbosity = 0) + const rapids_logger::level_enum verbosity = 0) { int n = x.len; const int workspace_size = owlqn_workspace_size(param, n); @@ -419,7 +419,7 @@ inline int qn_minimize(const raft::handle_t& handle, LossFunction& loss, const T l1, const LBFGSParam& opt_param, - const level_enum verbosity = 0) + const rapids_logger::level_enum verbosity = 0) { // TODO should the worksapce allocation happen outside? cudaStream_t stream = handle.get_stream(); diff --git a/cpp/src/randomforest/randomforest.cu b/cpp/src/randomforest/randomforest.cu index 6ba9470018..f631882022 100644 --- a/cpp/src/randomforest/randomforest.cu +++ b/cpp/src/randomforest/randomforest.cu @@ -122,7 +122,7 @@ void print(const RF_metrics rf_metrics) void preprocess_labels(int n_rows, std::vector& labels, std::map& labels_map, - level_enum verbosity) + rapids_logger::level_enum verbosity) { std::pair::iterator, bool> ret; int n_unique_labels = 0; @@ -149,7 +149,7 @@ void preprocess_labels(int n_rows, void postprocess_labels(int n_rows, std::vector& labels, std::map& labels_map, - level_enum verbosity) + rapids_logger::level_enum verbosity) { ML::default_logger().set_level(verbosity); CUML_LOG_DEBUG("Postrocessing labels"); @@ -386,7 +386,7 @@ void fit(const raft::handle_t& user_handle, int* labels, int n_unique_labels, RF_params rf_params, - level_enum verbosity) + rapids_logger::level_enum verbosity) { raft::common::nvtx::range fun_scope("RF::fit @randomforest.cu"); ML::default_logger().set_level(verbosity); @@ -407,7 +407,7 @@ void fit(const raft::handle_t& user_handle, int* labels, int n_unique_labels, RF_params rf_params, - level_enum verbosity) + rapids_logger::level_enum verbosity) { raft::common::nvtx::range fun_scope("RF::fit @randomforest.cu"); ML::default_logger().set_level(verbosity); @@ -441,7 +441,7 @@ void predict(const raft::handle_t& user_handle, int n_rows, int n_cols, int* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { ASSERT(!forest->trees.empty(), "Cannot predict! No trees in the forest."); std::shared_ptr> rf_classifier = @@ -455,7 +455,7 @@ void predict(const raft::handle_t& user_handle, int n_rows, int n_cols, int* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { ASSERT(!forest->trees.empty(), "Cannot predict! No trees in the forest."); std::shared_ptr> rf_classifier = @@ -483,7 +483,7 @@ RF_metrics score(const raft::handle_t& user_handle, const int* ref_labels, int n_rows, const int* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { RF_metrics classification_score = RandomForest::score( user_handle, ref_labels, n_rows, predictions, verbosity, RF_type::CLASSIFICATION); @@ -495,7 +495,7 @@ RF_metrics score(const raft::handle_t& user_handle, const int* ref_labels, int n_rows, const int* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { RF_metrics classification_score = RandomForest::score( user_handle, ref_labels, n_rows, predictions, verbosity, RF_type::CLASSIFICATION); @@ -576,7 +576,7 @@ void fit(const raft::handle_t& user_handle, int n_cols, float* labels, RF_params rf_params, - level_enum verbosity) + rapids_logger::level_enum verbosity) { raft::common::nvtx::range fun_scope("RF::fit @randomforest.cu"); ML::default_logger().set_level(verbosity); @@ -596,7 +596,7 @@ void fit(const raft::handle_t& user_handle, int n_cols, double* labels, RF_params rf_params, - level_enum verbosity) + rapids_logger::level_enum verbosity) { raft::common::nvtx::range fun_scope("RF::fit @randomforest.cu"); ML::default_logger().set_level(verbosity); @@ -629,7 +629,7 @@ void predict(const raft::handle_t& user_handle, int n_rows, int n_cols, float* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { std::shared_ptr> rf_regressor = std::make_shared>(forest->rf_params, RF_type::REGRESSION); @@ -642,7 +642,7 @@ void predict(const raft::handle_t& user_handle, int n_rows, int n_cols, double* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { std::shared_ptr> rf_regressor = std::make_shared>(forest->rf_params, RF_type::REGRESSION); @@ -671,7 +671,7 @@ RF_metrics score(const raft::handle_t& user_handle, const float* ref_labels, int n_rows, const float* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { RF_metrics regression_score = RandomForest::score( user_handle, ref_labels, n_rows, predictions, verbosity, RF_type::REGRESSION); @@ -684,7 +684,7 @@ RF_metrics score(const raft::handle_t& user_handle, const double* ref_labels, int n_rows, const double* predictions, - level_enum verbosity) + rapids_logger::level_enum verbosity) { RF_metrics regression_score = RandomForest::score( user_handle, ref_labels, n_rows, predictions, verbosity, RF_type::REGRESSION); diff --git a/cpp/src/randomforest/randomforest.cuh b/cpp/src/randomforest/randomforest.cuh index 7f82e2877b..ef8dfdb9fb 100644 --- a/cpp/src/randomforest/randomforest.cuh +++ b/cpp/src/randomforest/randomforest.cuh @@ -211,7 +211,7 @@ class RandomForest { int n_cols, L* predictions, const RandomForestMetaData* forest, - level_enum verbosity) const + rapids_logger::level_enum verbosity) const { ML::default_logger().set_level(verbosity); this->error_checking(input, predictions, n_rows, n_cols, true); @@ -277,7 +277,7 @@ class RandomForest { const L* ref_labels, int n_rows, const L* predictions, - level_enum verbosity, + rapids_logger::level_enum verbosity, int rf_type = RF_type::CLASSIFICATION) { ML::default_logger().set_level(verbosity); @@ -286,7 +286,7 @@ class RandomForest { if (rf_type == RF_type::CLASSIFICATION) { // task classifiation: get classification metrics float accuracy = raft::stats::accuracy(predictions, ref_labels, n_rows, stream); stats = set_rf_metrics_classification(accuracy); - if (ML::default_logger().should_log(ML::level_enum::debug)) print(stats); + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) print(stats); /* TODO: Potentially augment RF_metrics w/ more metrics (e.g., precision, F1, etc.). For non binary classification problems (i.e., one target and > 2 labels), need avg. @@ -301,7 +301,7 @@ class RandomForest { mean_squared_error, median_abs_error); stats = set_rf_metrics_regression(mean_abs_error, mean_squared_error, median_abs_error); - if (ML::default_logger().should_log(ML::level_enum::debug)) print(stats); + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) print(stats); } return stats; diff --git a/cpp/src/solver/lars.cu b/cpp/src/solver/lars.cu index 7302ec2957..21a84686df 100644 --- a/cpp/src/solver/lars.cu +++ b/cpp/src/solver/lars.cu @@ -37,7 +37,7 @@ template void larsFit(const raft::handle_t& handle, float* Gram, int max_iter, float* coef_path, - level_enum verbosity, + rapids_logger::level_enum verbosity, int ld_X, int ld_G, float eps); @@ -54,7 +54,7 @@ template void larsFit(const raft::handle_t& handle, double* Gram, int max_iter, double* coef_path, - level_enum verbosity, + rapids_logger::level_enum verbosity, int ld_X, int ld_G, double eps); diff --git a/cpp/src/solver/lars_impl.cuh b/cpp/src/solver/lars_impl.cuh index 383a0c9110..36625fd40c 100644 --- a/cpp/src/solver/lars_impl.cuh +++ b/cpp/src/solver/lars_impl.cuh @@ -884,13 +884,13 @@ void larsFit(const raft::handle_t& handle, idx_t* active_idx, math_t* alphas, idx_t* n_active, - math_t* Gram = nullptr, - int max_iter = 500, - math_t* coef_path = nullptr, - level_enum verbosity = ML::level_enum::off, - idx_t ld_X = 0, - idx_t ld_G = 0, - math_t eps = -1) + math_t* Gram = nullptr, + int max_iter = 500, + math_t* coef_path = nullptr, + rapids_logger::level_enum verbosity = rapids_logger::level_enum::off, + idx_t ld_X = 0, + idx_t ld_G = 0, + math_t eps = -1) { ASSERT(n_cols > 0, "Parameter n_cols: number of columns cannot be less than one"); ASSERT(n_rows > 0, "Parameter n_rows: number of rows cannot be less than one"); diff --git a/cpp/src/svm/svc.cu b/cpp/src/svm/svc.cu index 56f7656626..a3e2867508 100644 --- a/cpp/src/svm/svc.cu +++ b/cpp/src/svm/svc.cu @@ -139,7 +139,7 @@ SVC::SVC(raft::handle_t& handle, math_t cache_size, int max_iter, int nochange_steps, - level_enum verbosity) + rapids_logger::level_enum verbosity) : handle(handle), param(SvmParameter{C, cache_size, max_iter, nochange_steps, tol, verbosity}), kernel_params(kernel_params) diff --git a/cpp/src/svm/svm_api.cpp b/cpp/src/svm/svm_api.cpp index 392c15bedf..648f7e3d06 100644 --- a/cpp/src/svm/svm_api.cpp +++ b/cpp/src/svm/svm_api.cpp @@ -54,7 +54,7 @@ cumlError_t cumlSpSvcFit(cumlHandle_t handle, param.max_iter = max_iter; param.nochange_steps = nochange_steps; param.tol = tol; - param.verbosity = static_cast(verbosity); + param.verbosity = static_cast(verbosity); raft::distance::kernels::KernelParams kernel_param; kernel_param.kernel = (raft::distance::kernels::KernelType)kernel; @@ -128,7 +128,7 @@ cumlError_t cumlDpSvcFit(cumlHandle_t handle, param.max_iter = max_iter; param.nochange_steps = nochange_steps; param.tol = tol; - param.verbosity = static_cast(verbosity); + param.verbosity = static_cast(verbosity); raft::distance::kernels::KernelParams kernel_param; kernel_param.kernel = (raft::distance::kernels::KernelType)kernel; diff --git a/cpp/src/svm/workingset.cuh b/cpp/src/svm/workingset.cuh index ad707dc27a..1a7da7ce13 100644 --- a/cpp/src/svm/workingset.cuh +++ b/cpp/src/svm/workingset.cuh @@ -83,7 +83,7 @@ inline void WorkingSet::SimpleSelect( (int)8 * sizeof(math_t), stream); - if (ML::default_logger().should_log(ML::level_enum::debug) && n_train < 20) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug) && n_train < 20) { std::stringstream ss; raft::print_device_vector("idx_sorted", f_idx_sorted.data(), n_train, ss); CUML_LOG_DEBUG(ss.str().c_str()); @@ -236,7 +236,7 @@ inline int WorkingSet::GatherAvailable(int n_already_selected, available, n_train, idx.data(), n_already_selected); RAFT_CUDA_TRY(cudaPeekAtLastError()); } - if (ML::default_logger().should_log(ML::level_enum::debug) && n_train < 20) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug) && n_train < 20) { std::stringstream ss; raft::print_device_vector("avail", available, n_train, ss); CUML_LOG_DEBUG(ss.str().c_str()); @@ -250,7 +250,7 @@ inline int WorkingSet::GatherAvailable(int n_already_selected, thrust::make_permutation_iterator(av_ptr, idx_ptr), thrust::make_permutation_iterator(av_ptr, idx_ptr + n_train), av_sorted_ptr); - if (ML::default_logger().should_log(ML::level_enum::debug) && n_train < 20) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug) && n_train < 20) { std::stringstream ss; raft::print_device_vector("avail_sorted", available_sorted.data(), n_train, ss); CUML_LOG_DEBUG(ss.str().c_str()); @@ -276,7 +276,7 @@ inline int WorkingSet::GatherAvailable(int n_already_selected, raft::copy( idx.data() + n_already_selected, idx_tmp.data() + n_selected - n_copy, n_copy, stream); } - if (ML::default_logger().should_log(ML::level_enum::debug) && n_train < 20) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug) && n_train < 20) { std::stringstream ss; raft::print_device_vector("selected", idx.data(), n_already_selected + n_copy, ss); CUML_LOG_DEBUG(ss.str().c_str()); diff --git a/cpp/src/tsne/utils.cuh b/cpp/src/tsne/utils.cuh index 0ad23bae11..765c562f86 100644 --- a/cpp/src/tsne/utils.cuh +++ b/cpp/src/tsne/utils.cuh @@ -82,20 +82,20 @@ double SymmetrizeTime = 0, DistancesTime = 0, NormalizeTime = 0, PerplexityTime // To silence warnings #define START_TIMER \ - if (ML::default_logger().should_log(ML::level_enum::debug)) { \ + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { \ gettimeofday(&timecheck, NULL); \ start = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000; \ } -#define END_TIMER(add_onto) \ - if (ML::default_logger().should_log(ML::level_enum::debug)) { \ - gettimeofday(&timecheck, NULL); \ - end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000; \ - add_onto += (end - start); \ +#define END_TIMER(add_onto) \ + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { \ + gettimeofday(&timecheck, NULL); \ + end = (long)timecheck.tv_sec * 1000 + (long)timecheck.tv_usec / 1000; \ + add_onto += (end - start); \ } #define PRINT_TIMES \ - if (ML::default_logger().should_log(ML::level_enum::debug)) { \ + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { \ double total = (SymmetrizeTime + DistancesTime + NormalizeTime + PerplexityTime + \ BoundingBoxKernel_time + ClearKernel1_time + TreeBuildingKernel_time + \ ClearKernel2_time + SummarizationKernel_time + SortKernel_time + \ diff --git a/cpp/src/umap/fuzzy_simpl_set/naive.cuh b/cpp/src/umap/fuzzy_simpl_set/naive.cuh index 41e54f1f63..af9e3bc51a 100644 --- a/cpp/src/umap/fuzzy_simpl_set/naive.cuh +++ b/cpp/src/umap/fuzzy_simpl_set/naive.cuh @@ -314,7 +314,7 @@ void launcher(int n, raft::sparse::COO in(stream, n * n_neighbors, n, n); // check for logging in order to avoid the potentially costly `arr2Str` call! - if (ML::default_logger().should_log(ML::level_enum::debug)) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { CUML_LOG_DEBUG("Smooth kNN Distances"); auto str = raft::arr2Str(sigmas.data(), 25, "sigmas", stream); CUML_LOG_DEBUG("%s", str.c_str()); @@ -342,7 +342,7 @@ void launcher(int n, n_neighbors); RAFT_CUDA_TRY(cudaPeekAtLastError()); - if (ML::default_logger().should_log(ML::level_enum::debug)) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { CUML_LOG_DEBUG("Compute Membership Strength"); std::stringstream ss; ss << in; diff --git a/cpp/src/umap/simpl_set_embed/algo.cuh b/cpp/src/umap/simpl_set_embed/algo.cuh index 6be8b0235b..af8b735085 100644 --- a/cpp/src/umap/simpl_set_embed/algo.cuh +++ b/cpp/src/umap/simpl_set_embed/algo.cuh @@ -341,7 +341,7 @@ void launcher( make_epochs_per_sample(out.vals(), out.nnz, n_epochs, epochs_per_sample.data(), stream); - if (ML::default_logger().should_log(ML::level_enum::debug)) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { std::stringstream ss; ss << raft::arr2Str(epochs_per_sample.data(), out.nnz, "epochs_per_sample", stream); CUML_LOG_DEBUG(ss.str().c_str()); diff --git a/cpp/src/umap/supervised.cuh b/cpp/src/umap/supervised.cuh index 1a9739f280..b4a39ad1e4 100644 --- a/cpp/src/umap/supervised.cuh +++ b/cpp/src/umap/supervised.cuh @@ -301,7 +301,7 @@ void perform_general_intersection(const raft::handle_t& handle, handle, y_inputs, y_inputs, knn_graph, params->target_n_neighbors, params, stream); RAFT_CUDA_TRY(cudaPeekAtLastError()); - if (ML::default_logger().should_log(ML::level_enum::debug)) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { CUML_LOG_DEBUG("Target kNN Graph"); std::stringstream ss1, ss2; ss1 << raft::arr2Str( @@ -326,7 +326,7 @@ void perform_general_intersection(const raft::handle_t& handle, stream); RAFT_CUDA_TRY(cudaPeekAtLastError()); - if (ML::default_logger().should_log(ML::level_enum::debug)) { + if (ML::default_logger().should_log(rapids_logger::level_enum::debug)) { CUML_LOG_DEBUG("Target Fuzzy Simplicial Set"); std::stringstream ss; ss << ygraph_coo; diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index 6cfd9d2d2f..d6512506eb 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -56,10 +56,7 @@ function(ConfigureTest) CUDA::cusparse${_ctk_static_suffix} $<$:CUDA::cufft${_ctk_static_suffix_cufft}> rmm::rmm - rmm::rmm_logger raft::raft - raft::raft_logger - test_logger_impls GTest::gtest GTest::gtest_main GTest::gmock @@ -108,15 +105,8 @@ function(ConfigureTest) endfunction() -add_library(test_logger_impls OBJECT) -target_link_libraries(test_logger_impls PRIVATE rmm::rmm_logger_impl raft::raft_logger_impl) - ############################################################################## # - build ml_test executable ------------------------------------------------- -if(all_algo) - ConfigureTest(PREFIX SG NAME LOGGER_TEST sg/logger.cpp ML_INCLUDE) -endif() - if(all_algo OR dbscan_algo) ConfigureTest(PREFIX SG NAME DBSCAN_TEST sg/dbscan_test.cu ML_INCLUDE) endif() diff --git a/cpp/tests/sg/genetic/evolution_test.cu b/cpp/tests/sg/genetic/evolution_test.cu index 27d45645fc..68d9a6cadd 100644 --- a/cpp/tests/sg/genetic/evolution_test.cu +++ b/cpp/tests/sg/genetic/evolution_test.cu @@ -58,7 +58,7 @@ class GeneticEvolutionTest : public ::testing::Test { protected: void SetUp() override { - ML::default_logger().set_level(ML::level_enum::info); + ML::default_logger().set_level(rapids_logger::level_enum::info); // Set training param vals hyper_params.population_size = 5000; diff --git a/cpp/tests/sg/genetic/program_test.cu b/cpp/tests/sg/genetic/program_test.cu index b254b3ed01..a671c7423b 100644 --- a/cpp/tests/sg/genetic/program_test.cu +++ b/cpp/tests/sg/genetic/program_test.cu @@ -642,7 +642,7 @@ TEST_F(GeneticProgramTest, ProgramExecution) MLCommon::CompareApprox compApprox(tolerance); // Enable debug logging - ML::default_logger().set_level(ML::level_enum::info); + ML::default_logger().set_level(rapids_logger::level_enum::info); // Allocate memory std::vector h_ypred(n_progs * n_samples, 0.0f); diff --git a/cpp/tests/sg/hdbscan_test.cu b/cpp/tests/sg/hdbscan_test.cu index 3a86571f00..b2cd82d412 100644 --- a/cpp/tests/sg/hdbscan_test.cu +++ b/cpp/tests/sg/hdbscan_test.cu @@ -85,7 +85,7 @@ class HDBSCANTest : public ::testing::TestWithParam> { rmm::device_uvector out_probabilities(params.n_row, handle.get_stream()); - default_logger().set_level(ML::level_enum::debug); + default_logger().set_level(rapids_logger::level_enum::debug); HDBSCAN::Common::hdbscan_output out(handle, params.n_row, @@ -167,7 +167,7 @@ class ClusterCondensingTest : public ::testing::TestWithParam out_delta(params.n_row, handle.get_stream()); - default_logger().set_level(ML::level_enum::debug); + default_logger().set_level(rapids_logger::level_enum::debug); raft::sparse::op::coo_sort_by_weight( mst_src.data(), mst_dst.data(), mst_data.data(), (IdxT)mst_src.size(), handle.get_stream()); @@ -257,7 +257,7 @@ class ClusterSelectionTest : public ::testing::TestWithParam>::GetParam(); - default_logger().set_level(ML::level_enum::debug); + default_logger().set_level(rapids_logger::level_enum::debug); rmm::device_uvector condensed_parents(params.condensed_parents.size(), handle.get_stream()); diff --git a/cpp/tests/sg/lars_test.cu b/cpp/tests/sg/lars_test.cu index 85657eafea..e6026e0986 100644 --- a/cpp/tests/sg/lars_test.cu +++ b/cpp/tests/sg/lars_test.cu @@ -481,9 +481,9 @@ class LarsTestFitPredict : public ::testing::Test { void testFitGram() { - auto stream = handle.get_stream(); - int max_iter = 10; - ML::level_enum verbosity = ML::level_enum::off; + auto stream = handle.get_stream(); + int max_iter = 10; + rapids_logger::level_enum verbosity = rapids_logger::level_enum::off; int n_active; ML::Solver::Lars::larsFit(handle, X.data(), @@ -512,9 +512,9 @@ class LarsTestFitPredict : public ::testing::Test { void testFitX() { - auto stream = handle.get_stream(); - int max_iter = 10; - ML::level_enum verbosity = ML::level_enum::off; + auto stream = handle.get_stream(); + int max_iter = 10; + rapids_logger::level_enum verbosity = rapids_logger::level_enum::off; int n_active; ML::Solver::Lars::larsFit(handle, X.data(), @@ -593,11 +593,11 @@ class LarsTestFitPredict : public ::testing::Test { void testFitLarge() { - auto stream = handle.get_stream(); - int n_rows = 65536; - int n_cols = 10; - int max_iter = n_cols; - ML::level_enum verbosity = ML::level_enum::off; + auto stream = handle.get_stream(); + int n_rows = 65536; + int n_cols = 10; + int max_iter = n_cols; + rapids_logger::level_enum verbosity = rapids_logger::level_enum::off; int n_active; rmm::device_uvector X(n_rows * n_cols, stream); rmm::device_uvector y(n_rows, stream); diff --git a/cpp/tests/sg/logger.cpp b/cpp/tests/sg/logger.cpp deleted file mode 100644 index 73278447c2..0000000000 --- a/cpp/tests/sg/logger.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2020-2025, NVIDIA CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include - -namespace ML { - -TEST(Logger, Test) -{ - CUML_LOG_CRITICAL("This is a critical message"); - CUML_LOG_ERROR("This is an error message"); - CUML_LOG_WARN("This is a warning message"); - CUML_LOG_INFO("This is an info message"); - - default_logger().set_level(ML::level_enum::warn); - ASSERT_EQ(ML::level_enum::warn, default_logger().level()); - default_logger().set_level(ML::level_enum::info); - ASSERT_EQ(ML::level_enum::info, default_logger().level()); - - ASSERT_FALSE(default_logger().should_log(ML::level_enum::trace)); - ASSERT_FALSE(default_logger().should_log(ML::level_enum::debug)); - ASSERT_TRUE(default_logger().should_log(ML::level_enum::info)); - ASSERT_TRUE(default_logger().should_log(ML::level_enum::warn)); -} - -std::string logged = ""; -void exampleCallback(int lvl, const char* msg) { logged = std::string(msg); } - -int flushCount = 0; -void exampleFlush() { ++flushCount; } - -class LoggerTest : public ::testing::Test { - protected: - void SetUp() override - { - flushCount = 0; - logged = ""; - default_logger().set_level(ML::level_enum::trace); - } - - void TearDown() override - { - default_logger().sinks().pop_back(); - default_logger().set_level(ML::level_enum::info); - } -}; - -TEST_F(LoggerTest, callback) -{ - std::string testMsg; - default_logger().sinks().push_back(std::make_shared(exampleCallback)); - - testMsg = "This is a critical message"; - CUML_LOG_CRITICAL(testMsg.c_str()); - ASSERT_TRUE(logged.find(testMsg) != std::string::npos); - - testMsg = "This is an error message"; - CUML_LOG_ERROR(testMsg.c_str()); - ASSERT_TRUE(logged.find(testMsg) != std::string::npos); - - testMsg = "This is a warning message"; - CUML_LOG_WARN(testMsg.c_str()); - ASSERT_TRUE(logged.find(testMsg) != std::string::npos); - - testMsg = "This is an info message"; - CUML_LOG_INFO(testMsg.c_str()); - ASSERT_TRUE(logged.find(testMsg) != std::string::npos); - - testMsg = "This is a debug message"; - CUML_LOG_DEBUG(testMsg.c_str()); - ASSERT_TRUE(logged.find(testMsg) != std::string::npos); -} - -TEST_F(LoggerTest, flush) -{ - default_logger().sinks().push_back( - std::make_shared(exampleCallback, exampleFlush)); - default_logger().flush(); - ASSERT_EQ(1, flushCount); -} - -} // namespace ML diff --git a/cpp/tests/sg/quasi_newton.cu b/cpp/tests/sg/quasi_newton.cu index a0930740fa..c54254a8d9 100644 --- a/cpp/tests/sg/quasi_newton.cu +++ b/cpp/tests/sg/quasi_newton.cu @@ -111,7 +111,7 @@ T run(const raft::handle_t& handle, T l2, T* w, SimpleDenseMat& z, - level_enum verbosity, + rapids_logger::level_enum verbosity, cudaStream_t stream) { qn_params pams; @@ -144,7 +144,7 @@ T run_api(const raft::handle_t& cuml_handle, T l2, T* w, SimpleDenseMat& z, - level_enum verbosity, + rapids_logger::level_enum verbosity, cudaStream_t stream) { qn_params pams; @@ -226,7 +226,8 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l1 = alpha; l2 = 0.0; - fx = run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = + run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_b, fx)); ASSERT_TRUE(checkParamsEqual(handle, &w_l1_b[0], &b_l1_b, w0.data, loss_b, compApprox, stream)); @@ -240,7 +241,7 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_b, fx)); @@ -250,7 +251,8 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l1 = 0; l2 = alpha; - fx = run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = + run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_b, fx)); ASSERT_TRUE(checkParamsEqual(handle, &w_l2_b[0], &b_l2_b, w0.data, loss_b, compApprox, stream)); @@ -265,7 +267,7 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_b, fx)); @@ -274,7 +276,8 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l1 = alpha; l2 = 0.0; - fx = run(handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = run( + handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_no_b, fx)); ASSERT_TRUE( checkParamsEqual(handle, &w_l1_no_b[0], nobptr, w0.data, loss_no_b, compApprox, stream)); @@ -289,7 +292,7 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_no_b, fx)); @@ -298,7 +301,8 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l1 = 0; l2 = alpha; - fx = run(handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = run( + handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_no_b, fx)); ASSERT_TRUE( checkParamsEqual(handle, &w_l2_no_b[0], nobptr, w0.data, loss_no_b, compApprox, stream)); @@ -313,7 +317,7 @@ TEST_F(QuasiNewtonTest, binary_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_no_b, fx)); } @@ -346,7 +350,8 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2 = 0.0; double obj_l1_b = 0.5407911382311313; - fx = run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = + run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_b, fx)); fx = run_api(cuml_handle, @@ -359,7 +364,7 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_b, fx)); @@ -367,7 +372,8 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2 = alpha; double obj_l2_b = 0.5721784062720949; - fx = run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = + run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_b, fx)); fx = run_api(cuml_handle, @@ -380,7 +386,7 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_b, fx)); @@ -388,7 +394,8 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2 = 0.0; double obj_l1_no_b = 0.6606929813245878; - fx = run(handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = run( + handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_no_b, fx)); fx = run_api(cuml_handle, @@ -401,7 +408,7 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_no_b, fx)); @@ -410,7 +417,8 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) double obj_l2_no_b = 0.6597171282106854; - fx = run(handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = run( + handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_no_b, fx)); fx = run_api(cuml_handle, @@ -423,7 +431,7 @@ TEST_F(QuasiNewtonTest, multiclass_logistic_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_no_b, fx)); } @@ -457,7 +465,8 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) double w_l1_b[2] = {-0.4952397281519840, 0.3813315300180231}; double b_l1_b = -0.08140861819001188; double obj_l1_b = 0.011136986298775138; - fx = run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = + run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_b, fx)); ASSERT_TRUE(checkParamsEqual(handle, &w_l1_b[0], &b_l1_b, w0.data, loss_b, compApprox, stream)); @@ -471,7 +480,7 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_b, fx)); @@ -481,7 +490,8 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) double b_l2_b = -0.08062397391797513; double obj_l2_b = 0.004268621967866347; - fx = run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = + run(handle, loss_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_b, fx)); ASSERT_TRUE(checkParamsEqual(handle, &w_l2_b[0], &b_l2_b, w0.data, loss_b, compApprox, stream)); @@ -495,7 +505,7 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_b, fx)); @@ -504,7 +514,8 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) double w_l1_no_b[2] = {-0.5175178128147135, 0.3720844589831813}; double obj_l1_no_b = 0.013981355746112447; - fx = run(handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = run( + handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_no_b, fx)); ASSERT_TRUE( checkParamsEqual(handle, &w_l1_no_b[0], nobptr, w0.data, loss_no_b, compApprox, stream)); @@ -519,7 +530,7 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l1_no_b, fx)); @@ -528,7 +539,8 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) double w_l2_no_b[2] = {-0.5241651041233270, 0.3846317886627560}; double obj_l2_no_b = 0.007061261366969662; - fx = run(handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, level_enum::off, stream); + fx = run( + handle, loss_no_b, *Xdev, *ydev, l1, l2, w0.data, z, rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_no_b, fx)); ASSERT_TRUE( checkParamsEqual(handle, &w_l2_no_b[0], nobptr, w0.data, loss_no_b, compApprox, stream)); @@ -543,7 +555,7 @@ TEST_F(QuasiNewtonTest, linear_regression_vs_sklearn) l2, w0.data, z, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(obj_l2_no_b, fx)); } @@ -667,10 +679,26 @@ TEST_F(QuasiNewtonTest, dense_vs_sparse_logistic) pams.fit_intercept = loss.fit_intercept; double f_dense, f_sparse; - f_dense = - run(handle, loss, *Xdev, *ydev, l1, l2, w0_dense.data, z_dense, level_enum::off, stream); - f_sparse = - run(handle, loss, X_sparse, *ydev, l1, l2, w0_sparse.data, z_sparse, level_enum::off, stream); + f_dense = run(handle, + loss, + *Xdev, + *ydev, + l1, + l2, + w0_dense.data, + z_dense, + rapids_logger::level_enum::off, + stream); + f_sparse = run(handle, + loss, + X_sparse, + *ydev, + l1, + l2, + w0_sparse.data, + z_sparse, + rapids_logger::level_enum::off, + stream); ASSERT_TRUE(compApprox(f_dense, f_sparse)); qnPredict( @@ -704,7 +732,7 @@ TEST_F(QuasiNewtonTest, dense_vs_sparse_logistic) l2, w0_dense.data, z_dense, - level_enum::off, + rapids_logger::level_enum::off, stream); f_sparse = run_api(cuml_handle, QN_LOSS_SOFTMAX, @@ -716,7 +744,7 @@ TEST_F(QuasiNewtonTest, dense_vs_sparse_logistic) l2, w0_sparse.data, z_sparse, - level_enum::off, + rapids_logger::level_enum::off, stream); ASSERT_TRUE(compApprox(f_dense, f_sparse)); }; diff --git a/cpp/tests/sg/svc_test.cu b/cpp/tests/sg/svc_test.cu index e8ecb297c1..a52f9a4031 100644 --- a/cpp/tests/sg/svc_test.cu +++ b/cpp/tests/sg/svc_test.cu @@ -590,7 +590,7 @@ SvmParameter getDefaultSvmParameter() param.cache_size = 200; param.max_iter = -1; param.nochange_steps = 1000; - param.verbosity = ML::level_enum::info; + param.verbosity = rapids_logger::level_enum::info; param.epsilon = 0.1; param.svmType = C_SVC; return param; @@ -1381,7 +1381,8 @@ TYPED_TEST(SmoSolverTest, BlobPredict) rmm::device_uvector y_pred(n_pred, stream); make_blobs(this->handle, x.data(), y.data(), p.n_rows, p.n_cols, 2, centers.data()); - SVC svc(this->handle, p.C, p.tol, p.kernel_params, 0, -1, 50, ML::level_enum::info); + SVC svc( + this->handle, p.C, p.tol, p.kernel_params, 0, -1, 50, rapids_logger::level_enum::info); svc.fit(x.data(), p.n_rows, p.n_cols, y.data()); // Create a different dataset for prediction @@ -1499,8 +1500,14 @@ TYPED_TEST(SmoSolverTest, DISABLED_MillionRows) rmm::device_uvector y_pred(p.n_rows, stream); make_blobs(this->handle, x.data(), y.data(), p.n_rows, p.n_cols, 2, centers.data()); const int max_iter = 2; - SVC svc( - this->handle, p.C, p.tol, p.kernel_params, 0, max_iter, 50, ML::level_enum::debug); + SVC svc(this->handle, + p.C, + p.tol, + p.kernel_params, + 0, + max_iter, + 50, + rapids_logger::level_enum::debug); svc.fit(x.data(), p.n_rows, p.n_cols, y.data()); // predict on the same dataset svc.predict(x.data(), p.n_rows, p.n_cols, y_pred.data()); @@ -1955,7 +1962,7 @@ class SvrTest : public ::testing::Test { auto stream = this->handle.get_stream(); std::vector, smoOutput2>> data{ {SvrInput{ - SvmParameter{1, 0, 1, 10, 1e-3, ML::level_enum::info, 0.1, EPSILON_SVR}, + SvmParameter{1, 0, 1, 10, 1e-3, rapids_logger::level_enum::info, 0.1, EPSILON_SVR}, KernelParams{LINEAR, 3, 1, 0}, 2, // n_rows 1, // n_cols @@ -1965,7 +1972,7 @@ class SvrTest : public ::testing::Test { smoOutput2{2, {-0.8, 0.8}, 2.1, {0.8}, {0, 1}, {0, 1}, {2.1, 2.9}}}, {SvrInput{ - SvmParameter{1, 10, 1, 1, 1e-3, ML::level_enum::info, 0.1, EPSILON_SVR}, + SvmParameter{1, 10, 1, 1, 1e-3, rapids_logger::level_enum::info, 0.1, EPSILON_SVR}, KernelParams{LINEAR, 3, 1, 0}, 2, // n_rows 1, // n_cols @@ -1975,7 +1982,7 @@ class SvrTest : public ::testing::Test { smoOutput2{2, {-0.8, 0.8}, 1.3, {0.8}, {1, 2}, {0, 1}, {2.1, 2.9}}}, {SvrInput{ - SvmParameter{1, 0, 1, 1, 1e-3, ML::level_enum::info, 0.1, EPSILON_SVR}, + SvmParameter{1, 0, 1, 1, 1e-3, rapids_logger::level_enum::info, 0.1, EPSILON_SVR}, KernelParams{LINEAR, 3, 1, 0}, 2, // n_rows 2, // n_cols @@ -1985,7 +1992,7 @@ class SvrTest : public ::testing::Test { smoOutput2{2, {-0.8, 0.8}, 1.3, {0.8, 0.0}, {1, 2, 5, 5}, {0, 1}, {2.1, 2.9}}}, {SvrInput{ - SvmParameter{1, 0, 100, 10, 1e-6, ML::level_enum::info, 0.1, EPSILON_SVR}, + SvmParameter{1, 0, 100, 10, 1e-6, rapids_logger::level_enum::info, 0.1, EPSILON_SVR}, KernelParams{LINEAR, 3, 1, 0}, 7, // n_rows 1, // n_cols @@ -2001,7 +2008,7 @@ class SvrTest : public ::testing::Test { {0.7, 1.8, 2.9, 4, 5.1, 6.2, 7.3}}}, // Almost same as above, but with sample weights {SvrInput{ - SvmParameter{1, 0, 100, 10, 1e-3, ML::level_enum::info, 0.1, EPSILON_SVR}, + SvmParameter{1, 0, 100, 10, 1e-3, rapids_logger::level_enum::info, 0.1, EPSILON_SVR}, KernelParams{LINEAR, 3, 1, 0}, 7, // n_rows 1, // n_cols @@ -2012,7 +2019,7 @@ class SvrTest : public ::testing::Test { smoOutput2{ 6, {}, -15.5, {3.9}, {1.0, 2.0, 3.0, 4.0, 6.0, 7.0}, {0, 1, 2, 3, 5, 6}, {}}}, {SvrInput{ - SvmParameter{1, 0, 100, 10, 1e-6, ML::level_enum::info, 0.1, EPSILON_SVR}, + SvmParameter{1, 0, 100, 10, 1e-6, rapids_logger::level_enum::info, 0.1, EPSILON_SVR}, KernelParams{LINEAR, 3, 1, 0}, 7, // n_rows 1, // n_cols diff --git a/cpp/tests/sg/tsne_test.cu b/cpp/tests/sg/tsne_test.cu index 628d2da144..87fbcb090b 100644 --- a/cpp/tests/sg/tsne_test.cu +++ b/cpp/tests/sg/tsne_test.cu @@ -124,7 +124,7 @@ class TSNETest : public ::testing::TestWithParam { model_params.dim = 2; model_params.n_neighbors = 90; model_params.min_grad_norm = 1e-12; - model_params.verbosity = ML::level_enum::debug; + model_params.verbosity = rapids_logger::level_enum::debug; model_params.metric = DEFAULT_DISTANCE_METRIC; // Allocate memory diff --git a/dependencies.yaml b/dependencies.yaml index 38d6e8094e..34ac8403c0 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -20,6 +20,7 @@ files: - depends_on_librmm - depends_on_pylibraft - depends_on_raft_dask + - depends_on_rapids_logger - depends_on_rmm - docs - py_build_cuml @@ -161,6 +162,7 @@ files: - depends_on_libcuvs - depends_on_libraft - depends_on_librmm + - depends_on_rapids_logger py_run_libcuml: output: pyproject pyproject_dir: python/libcuml @@ -170,6 +172,7 @@ files: - cuda_wheels - depends_on_libcuvs - depends_on_libraft + - depends_on_rapids_logger channels: - rapidsai - rapidsai-nightly @@ -212,8 +215,6 @@ dependencies: packages: - c-compiler - cxx-compiler - - fmt>=11.0.2,<12 - - spdlog>=1.14.1,<1.15 specific: - output_types: conda matrices: @@ -776,6 +777,16 @@ dependencies: - matrix: packages: - *raft_dask_unsuffixed + depends_on_rapids_logger: + common: + - output_types: [conda, requirements, pyproject] + packages: + - rapids-logger==0.1.*,>=0.0.0a0 + - output_types: requirements + packages: + # pip recognizes the index as a global option for the requirements.txt file + # This index is needed for rapids_logger + - --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple depends_on_rmm: common: - output_types: conda diff --git a/python/cuml/cuml/cluster/kmeans.pyx b/python/cuml/cuml/cluster/kmeans.pyx index dac4c9ded7..d3a539fa71 100644 --- a/python/cuml/cuml/cluster/kmeans.pyx +++ b/python/cuml/cuml/cluster/kmeans.pyx @@ -38,9 +38,7 @@ IF GPUBUILD == 1: from cuml.cluster.kmeans_utils cimport params as KMeansParams from cuml.cluster.kmeans_utils cimport KMeansPlusPlus, Random, Array from cuml.cluster cimport kmeans_utils - - # Avoid potential future conflicts with cuml's level enum - ctypedef kmeans_utils.level_enum raft_level_enum + from cuml.internals.logger cimport level_enum from cuml.internals.array import CumlArray from cuml.common.array_descriptor import CumlArrayDescriptor @@ -214,7 +212,7 @@ class KMeans(UniversalBase, # so we need to pass a dummy value here. Its value does not matter as the # seed is only used during fitting params.rng_state.seed = getattr(self, "_seed", 0) - params.verbosity = (self.verbose) + params.verbosity = (self.verbose) params.metric = DistanceType.L2Expanded # distance metric as squared L2: @todo - support other metrics # noqa: E501 params.batch_samples = self.max_samples_per_batch params.oversampling_factor = self.oversampling_factor diff --git a/python/cuml/cuml/cluster/kmeans_utils.pxd b/python/cuml/cuml/cluster/kmeans_utils.pxd index 841ea2d3dc..1a737b1313 100644 --- a/python/cuml/cuml/cluster/kmeans_utils.pxd +++ b/python/cuml/cuml/cluster/kmeans_utils.pxd @@ -1,5 +1,5 @@ # -# Copyright (c) 2019-2024, NVIDIA CORPORATION. +# Copyright (c) 2019-2025, NVIDIA CORPORATION. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -19,23 +19,13 @@ from libcpp cimport bool from cuml.common.rng_state cimport RngState from cuml.metrics.distance_type cimport DistanceType +from cuml.internals.logger cimport level_enum cdef extern from "cuml/cluster/kmeans.hpp" namespace \ "cuvs::cluster::kmeans::params": enum InitMethod: KMeansPlusPlus, Random, Array -cdef extern from "raft/core/logger.hpp" namespace "raft": - cdef enum class level_enum: - trace - debug - info - warn - error - critical - off - n_levels - cdef extern from "cuvs/cluster/kmeans.hpp" namespace \ "cuvs::cluster::kmeans": cdef struct params: diff --git a/python/cuml/cuml/internals/logger.pxd b/python/cuml/cuml/internals/logger.pxd index d39c7d24df..eee5891f25 100644 --- a/python/cuml/cuml/internals/logger.pxd +++ b/python/cuml/cuml/internals/logger.pxd @@ -24,7 +24,7 @@ IF GPUBUILD == 1: from libcpp.memory cimport make_shared, shared_ptr from libcpp cimport bool - cdef extern from "cuml/common/logger.hpp" namespace "ML" nogil: + cdef extern from "rapids_logger/logger.hpp" namespace "rapids_logger" nogil: cpdef enum class level_enum: trace @@ -42,14 +42,14 @@ IF GPUBUILD == 1: ctypedef shared_ptr[sink] sink_ptr # Spoof the logger as a namespace to get the sink_vector generated correctly. - cdef extern from "cuml/common/logger.hpp" namespace "ML::logger" nogil: + cdef extern from "rapids_logger/logger.hpp" namespace "rapids_logger::logger" nogil: cdef cppclass sink_vector: void push_back(const sink_ptr& sink) except + void pop_back() except + void clear() - cdef extern from "cuml/common/logger.hpp" namespace "ML" nogil: + cdef extern from "rapids_logger/logger.hpp" namespace "rapids_logger" nogil: cdef cppclass logger: logger(string name, string filename) except + void set_level(level_enum log_level) except + @@ -61,11 +61,6 @@ IF GPUBUILD == 1: bool should_log(level_enum msg_level) except + void log(level_enum lvl, const string& fmt, ...) const sink_vector& sinks() const - # string getPattern() const - # void flush() - - cdef logger& default_logger() except + - cdef string default_pattern() except + ctypedef void(*log_callback_t)(int, const char*) except * with gil ctypedef void(*flush_callback_t)() except * with gil @@ -73,6 +68,10 @@ IF GPUBUILD == 1: cdef cppclass callback_sink_mt: callback_sink_mt(log_callback_t callback, flush_callback_t flush) except + + cdef extern from "cuml/common/logger.hpp" namespace "ML" nogil: + cdef logger& default_logger() except + + cdef string default_pattern() except + + cdef void _log_callback(int lvl, const char * msg) with gil cdef void _log_flush() with gil diff --git a/python/libcuml/libcuml/load.py b/python/libcuml/libcuml/load.py index 45b38afb3f..dde03c3615 100644 --- a/python/libcuml/libcuml/load.py +++ b/python/libcuml/libcuml/load.py @@ -47,35 +47,20 @@ def _load_wheel_installation(soname: str): def load_library(): """Dynamically load libcuml++.so and its dependencies""" try: - # libraft must be loaded before libcuml++ because libcuml++ - # references its symbols + # These libraries must all be loaded before libcuml + import rapids_logger + import librmm import libraft - - libraft.load_library() - except ModuleNotFoundError: - # 'libcuml++' has a runtime dependency on 'libraft'. However, - # that dependency might be satisfied by the 'libraft' conda package - # (which does not have any Python modules), instead of the - # 'libraft' wheel. - # - # In that situation, assume that 'libraft.so' is in a place where - # the loader can find it. - pass - - try: - # libcuvs must be loaded before libcuml++ because libcuml++ - # references its symbols import libcuvs + rapids_logger.load_library() + librmm.load_library() + libraft.load_library() libcuvs.load_library() except ModuleNotFoundError: - # 'libcuml++' has a runtime dependency on 'libcuvs'. However, - # that dependency might be satisfied by the 'libcuvs' conda package - # (which does not have any Python modules), instead of the - # 'libcuvs' wheel. - # - # In that situation, assume that 'libcuvs.so' is in a place where - # the loader can find it. + # These runtime dependencies might be satisfied by conda packages (which do not + # have any Python modules) instead of wheels. In that situation, assume that + # the libraries are in a place where the loader can find them. pass prefer_system_installation = ( diff --git a/python/libcuml/pyproject.toml b/python/libcuml/pyproject.toml index f869d196e6..faa813e942 100644 --- a/python/libcuml/pyproject.toml +++ b/python/libcuml/pyproject.toml @@ -44,6 +44,7 @@ dependencies = [ "nvidia-curand", "nvidia-cusolver", "nvidia-cusparse", + "rapids-logger==0.1.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. [project.urls] @@ -86,4 +87,5 @@ requires = [ "libraft==25.4.*,>=0.0.0a0", "librmm==25.4.*,>=0.0.0a0", "ninja", + "rapids-logger==0.1.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`.