diff --git a/gnu/local.mk b/gnu/local.mk index 26a833c803..9e850a0cd7 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1163,6 +1163,7 @@ dist_patch_DATA = \ %D%/packages/patches/crda-optional-gcrypt.patch \ %D%/packages/patches/clucene-contribs-lib.patch \ %D%/packages/patches/csvkit-set-locale-for-tests.patch \ + %D%/packages/patches/ctranslate2-local-build.patch \ %D%/packages/patches/cube-nocheck.patch \ %D%/packages/patches/cups-minimal-Address-PPD-injection-issues.patch \ %D%/packages/patches/curl-CVE-2024-8096.patch \ diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm index d51eb62176..cdffae1599 100644 --- a/gnu/packages/machine-learning.scm +++ b/gnu/packages/machine-learning.scm @@ -30,6 +30,7 @@ ;;; Copyright © 2024 Spencer King ;;; Copyright © 2024, 2025 David Elsing ;;; Copyright © 2024 Andy Tai +;;; Copyright © 2025 Lapearldot ;;; ;;; This file is part of GNU Guix. ;;; @@ -107,6 +108,7 @@ #:use-module (gnu packages libffi) #:use-module (gnu packages linux) #:use-module (gnu packages llvm) + #:use-module (gnu packages logging) #:use-module (gnu packages maths) #:use-module (gnu packages mpi) #:use-module (gnu packages ninja) @@ -6291,6 +6293,50 @@ Transformers is backed by the three most popular deep learning libraries — Jax, PyTorch and TensorFlow — with a seamless integration between them.") (license license:asl2.0))) +(define-public ctranslate2 + (package + (name "ctranslate2") + (version "4.6.0") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/OpenNMT/CTranslate2") + (commit (string-append "v" version)))) + (file-name (git-file-name "CTranslate2" version)) + (sha256 (base32 "0sngxjq5rmrgjabgxfazdnhfn3wpfi62n226f4k47cx1xjjkllcd")) + (patches (search-patches "ctranslate2-local-build.patch")))) + (build-system cmake-build-system) + (arguments + (list + #:test-target "ctranslate2_test" + ;; XXX: mkl and openblas seem incompatible. + #:configure-flags `(list "-DBUILD_TESTS=ON" + "-DWITH_ACCELERATE=OFF" + "-DWITH_RUY=OFF" + "-DWITH_DNNL=ON" + "-DWITH_CUDA=OFF" + "-DWITH_CUDNN=OFF" + "-DWITH_MKL=OFF" + "-DWITH_OPENBLAS=ON"))) + (native-inputs (list libomp + cxxopts + spdlog + googletest + cpu-features + oneapi-dnnl + openblas)) + (home-page "https://opennmt.net/CTranslate2/") + (synopsis "Fast inference engine for Transformer models") + (description "CTranslate2 is a C++ and Python library for efficient +inference with Transformer models. + +The project implements a custom runtime that applies many performance +optimization techniques such as weights quantization, layers fusion, batch +reordering, etc., to accelerate and reduce the memory usage of Transformer +models on CPU and GPU.") + (license license:expat))) + (define-public python-hmmlearn (package (name "python-hmmlearn") diff --git a/gnu/packages/patches/ctranslate2-local-build.patch b/gnu/packages/patches/ctranslate2-local-build.patch new file mode 100644 index 0000000000..7f265e5790 --- /dev/null +++ b/gnu/packages/patches/ctranslate2-local-build.patch @@ -0,0 +1,129 @@ +Patch subprojects to use guix builds instead + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 62b99d1..c1ac38a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -98,7 +98,7 @@ else() + endif() + + find_package(Threads) +-add_subdirectory(third_party/spdlog EXCLUDE_FROM_ALL) ++find_package( spdlog) + + set(PRIVATE_INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_SOURCE_DIR}/src +@@ -249,9 +249,10 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(amd64)|(AMD64)") + set(BUILD_SHARED_LIBS_SAVED "${BUILD_SHARED_LIBS}") + set(BUILD_SHARED_LIBS OFF) + set(BUILD_TESTING OFF) +- add_subdirectory(third_party/cpu_features EXCLUDE_FROM_ALL) ++ find_package( CpuFeatures) + set(BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS_SAVED}") +- list(APPEND LIBRARIES cpu_features) ++ find_library( CPU_FEATURES_LIBRARIES cpu_features) ++ list(APPEND LIBRARIES ${CPU_FEATURES_LIBRARIES}) + endif() + + if(ENABLE_CPU_DISPATCH) +@@ -349,8 +350,8 @@ if(WITH_MKL) + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64") + set(MKL_LIBRARIES +- ${MKL_LIBRARY_DIR}/libmkl_core.a +- ${MKL_LIBRARY_DIR}/libmkl_intel_ilp64.a ++ ${MKL_LIBRARY_DIR}/libmkl_core.so ++ ${MKL_LIBRARY_DIR}/libmkl_intel_ilp64.so + ) + endif() + +@@ -358,19 +359,19 @@ if(WITH_MKL) + if(WIN32) + list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/mkl_intel_thread.lib) + else() +- list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/libmkl_intel_thread.a) ++ list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/libmkl_intel_thread.so) + endif() + elseif(OPENMP_RUNTIME STREQUAL "COMP") + if(WIN32) + message(FATAL_ERROR "Building with MKL requires Intel OpenMP") + else() +- list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/libmkl_gnu_thread.a) ++ list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/libmkl_gnu_thread.so) + endif() + elseif(OPENMP_RUNTIME STREQUAL "NONE") + if(WIN32) + list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/mkl_sequential.lib) + else() +- list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/libmkl_sequential.a) ++ list(APPEND MKL_LIBRARIES ${MKL_LIBRARY_DIR}/libmkl_sequential.so) + endif() + endif() + list(APPEND PRIVATE_INCLUDE_DIRECTORIES ${MKL_INCLUDE_DIR}) +@@ -439,6 +440,7 @@ if (WITH_RUY) + add_definitions(-DCT2_WITH_RUY) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + set(CPUINFO_LIBRARY_TYPE static CACHE STRING "cpuinfo library type") ++ # if package found and appended to libraries, issue with linking + add_subdirectory(third_party/ruy EXCLUDE_FROM_ALL) + unset(CMAKE_POSITION_INDEPENDENT_CODE) + list(APPEND LIBRARIES ruy) +diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt +index 3311ad3..7d90693 100644 +--- a/cli/CMakeLists.txt ++++ b/cli/CMakeLists.txt +@@ -1,14 +1,12 @@ +-if (NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/cxxopts/include") +- message(FATAL_ERROR "The client dependency repository (cxxopts) is missing! " +- "You probably didn't clone the project with --recursive. You can include it " +- "by calling \"git submodule update --init --recursive\"") +-endif() +- + add_executable(translator + translator.cc + ) ++find_path( ++ CXXOPTS_ROOT ++ include/cxxopts.hpp ++) + target_include_directories(translator +- PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../third_party/cxxopts/include ++ PRIVATE ${CXXOPTS_ROOT}/include + ) + target_link_libraries(translator + PRIVATE ${PROJECT_NAME} +diff --git a/src/cpu/cpu_info.cc b/src/cpu/cpu_info.cc +index 9030ac7..6949644 100644 +--- a/src/cpu/cpu_info.cc ++++ b/src/cpu/cpu_info.cc +@@ -4,7 +4,7 @@ + + #include + +-#include ++#include + + namespace ctranslate2 { + namespace cpu { +diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt +index 283c49d..9ca6cc8 100644 +--- a/tests/CMakeLists.txt ++++ b/tests/CMakeLists.txt +@@ -2,7 +2,7 @@ enable_testing() + + option(BUILD_GMOCK "" OFF) + option(INSTALL_GTEST "" OFF) +-add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../third_party/googletest ${CMAKE_CURRENT_BINARY_DIR}/googletest) ++find_package( GTest) + + add_executable(ctranslate2_test + batching_test.cc +@@ -20,7 +20,7 @@ target_include_directories(ctranslate2_test PRIVATE + ) + target_link_libraries(ctranslate2_test + ${PROJECT_NAME} +- gtest_main ++ gtest + ) + + add_executable(benchmark_ops