diff --git a/pkgs/tools/audio/openai-whisper-cpp/download-models.patch b/pkgs/by-name/wh/whisper-cpp/download-models.patch similarity index 100% rename from pkgs/tools/audio/openai-whisper-cpp/download-models.patch rename to pkgs/by-name/wh/whisper-cpp/download-models.patch diff --git a/pkgs/by-name/wh/whisper-cpp/package.nix b/pkgs/by-name/wh/whisper-cpp/package.nix new file mode 100644 index 000000000000..e8ddeb672a19 --- /dev/null +++ b/pkgs/by-name/wh/whisper-cpp/package.nix @@ -0,0 +1,199 @@ +{ + lib, + stdenv, + cmake, + apple-sdk_11, + ninja, + fetchFromGitHub, + SDL2, + wget, + which, + autoAddDriverRunpath, + makeWrapper, + + metalSupport ? stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64, + coreMLSupport ? stdenv.hostPlatform.isDarwin && false, # FIXME currently broken + + config, + cudaSupport ? config.cudaSupport, + cudaPackages ? { }, + + rocmSupport ? config.rocmSupport, + rocmPackages ? { }, + rocmGpuTargets ? builtins.concatStringsSep ";" rocmPackages.clr.gpuTargets, + + vulkanSupport ? false, + shaderc, + vulkan-headers, + vulkan-loader, + + withSDL ? true, +}: + +assert metalSupport -> stdenv.hostPlatform.isDarwin; +assert coreMLSupport -> stdenv.hostPlatform.isDarwin; + +let + # It's necessary to consistently use backendStdenv when building with CUDA support, + # otherwise we get libstdc++ errors downstream. + # cuda imposes an upper bound on the gcc version, e.g. the latest gcc compatible with cudaPackages_11 is gcc11 + effectiveStdenv = if cudaSupport then cudaPackages.backendStdenv else stdenv; + inherit (lib) + cmakeBool + cmakeFeature + optional + optionals + optionalString + forEach + ; + + darwinBuildInputs = [ apple-sdk_11 ]; + + cudaBuildInputs = with cudaPackages; [ + cuda_cccl # + + # A temporary hack for reducing the closure size, remove once cudaPackages + # have stopped using lndir: https://github.com/NixOS/nixpkgs/issues/271792 + cuda_cudart + libcublas + ]; + + rocmBuildInputs = with rocmPackages; [ + clr + hipblas + rocblas + ]; + + vulkanBuildInputs = [ + shaderc + vulkan-headers + vulkan-loader + ]; + +in +effectiveStdenv.mkDerivation (finalAttrs: { + pname = "whisper-cpp"; + version = "1.7.2"; + + src = fetchFromGitHub { + owner = "ggerganov"; + repo = "whisper.cpp"; + rev = "refs/tags/v${finalAttrs.version}"; + hash = "sha256-y30ZccpF3SCdRGa+P3ddF1tT1KnvlI4Fexx81wZxfTk="; + }; + + # The upstream download script tries to download the models to the + # directory of the script, which is not writable due to being + # inside the nix store. This patch changes the script to download + # the models to the current directory of where it is being run from. + patches = [ ./download-models.patch ]; + + postPatch = '' + for target in examples/{bench,command,main,quantize,server,stream,talk}/CMakeLists.txt; do + if ! grep -q -F 'install('; then + echo 'install(TARGETS ''${TARGET} RUNTIME)' >> $target + fi + done + ''; + + nativeBuildInputs = + [ + cmake + ninja + which + makeWrapper + ] + ++ lib.optionals cudaSupport [ + cudaPackages.cuda_nvcc + autoAddDriverRunpath + ]; + + buildInputs = + optional withSDL SDL2 + ++ optionals effectiveStdenv.hostPlatform.isDarwin darwinBuildInputs + ++ optionals cudaSupport cudaBuildInputs + ++ optionals rocmSupport rocmBuildInputs + ++ optionals vulkanSupport vulkanBuildInputs; + + cmakeFlags = + [ + (cmakeBool "WHISPER_BUILD_EXAMPLES" true) + (cmakeBool "GGML_CUDA" cudaSupport) + (cmakeBool "GGML_HIPBLAS" rocmSupport) + (cmakeBool "GGML_VULKAN" vulkanSupport) + (cmakeBool "WHISPER_SDL2" withSDL) + (cmakeBool "GGML_LTO" true) + (cmakeBool "GGML_NATIVE" false) + (cmakeBool "BUILD_SHARED_LIBS" (!effectiveStdenv.hostPlatform.isStatic)) + ] + ++ optionals (effectiveStdenv.hostPlatform.isx86 && !effectiveStdenv.hostPlatform.isStatic) [ + (cmakeBool "GGML_BACKEND_DL" true) + (cmakeBool "GGML_CPU_ALL_VARIANTS" true) + ] + ++ optionals cudaSupport [ + (cmakeFeature "CMAKE_CUDA_ARCHITECTURES" cudaPackages.flags.cmakeCudaArchitecturesString) + ] + ++ optionals rocmSupport [ + (cmakeFeature "CMAKE_C_COMPILER" "hipcc") + (cmakeFeature "CMAKE_CXX_COMPILER" "hipcc") + + # Build all targets supported by rocBLAS. When updating search for TARGET_LIST_ROCM + # in https://github.com/ROCmSoftwarePlatform/rocBLAS/blob/develop/CMakeLists.txt + # and select the line that matches the current nixpkgs version of rocBLAS. + "-DAMDGPU_TARGETS=${rocmGpuTargets}" + ] + ++ optionals coreMLSupport [ + (cmakeBool "WHISPER_COREML" true) + (cmakeBool "WHISPER_COREML_ALLOW_FALLBACK" true) + ] + ++ optionals metalSupport [ + (cmakeFeature "CMAKE_C_FLAGS" "-D__ARM_FEATURE_DOTPROD=1") + (cmakeBool "GGML_METAL" true) + (cmakeBool "GGML_METAL_EMBED_LIBRARY" true) + ]; + + postInstall = '' + # Add "whisper-cpp" prefix before every command + mv -v $out/bin/{main,whisper-cpp} + + for file in $out/bin/*; do + if [[ -x "$file" && -f "$file" && "$(basename $file)" != "whisper-cpp" ]]; then + mv -v "$file" "$out/bin/whisper-cpp-$(basename $file)" + fi + done + + install -v -D -m755 $src/models/download-ggml-model.sh $out/bin/whisper-cpp-download-ggml-model + + wrapProgram $out/bin/whisper-cpp-download-ggml-model \ + --prefix PATH : ${lib.makeBinPath [ wget ]} + ''; + + requiredSystemFeatures = optionals rocmSupport [ "big-parallel" ]; # rocmSupport multiplies build time by the number of GPU targets, which takes arround 30 minutes on a 16-cores system to build + + doInstallCheck = true; + + installCheckPhase = '' + runHook preInstallCheck + $out/bin/whisper-cpp --help >/dev/null + runHook postInstallCheck + ''; + + meta = { + description = "Port of OpenAI's Whisper model in C/C++"; + longDescription = '' + To download the models as described in the project's readme, you may + use the `whisper-cpp-download-ggml-model` binary from this package. + ''; + homepage = "https://github.com/ggerganov/whisper.cpp"; + license = lib.licenses.mit; + mainProgram = "whisper-cpp"; + platforms = lib.platforms.all; + broken = coreMLSupport; + badPlatforms = optionals cudaSupport lib.platforms.darwin; + maintainers = with lib.maintainers; [ + dit7ya + hughobrien + aviallon + ]; + }; +}) diff --git a/pkgs/tools/audio/openai-whisper-cpp/default.nix b/pkgs/tools/audio/openai-whisper-cpp/default.nix deleted file mode 100644 index e65d909b41f8..000000000000 --- a/pkgs/tools/audio/openai-whisper-cpp/default.nix +++ /dev/null @@ -1,113 +0,0 @@ -{ lib -, stdenv -, fetchFromGitHub -, SDL2 -, makeWrapper -, wget -, which -, Accelerate -, CoreGraphics -, CoreML -, CoreVideo -, MetalKit - -, config -, autoAddDriverRunpath -, cudaSupport ? config.cudaSupport -, cudaPackages ? {} -}: - -let - # It's necessary to consistently use backendStdenv when building with CUDA support, - # otherwise we get libstdc++ errors downstream. - # cuda imposes an upper bound on the gcc version, e.g. the latest gcc compatible with cudaPackages_11 is gcc11 - effectiveStdenv = if cudaSupport then cudaPackages.backendStdenv else stdenv; -in -effectiveStdenv.mkDerivation (finalAttrs: { - pname = "whisper-cpp"; - version = "1.7.2"; - - src = fetchFromGitHub { - owner = "ggerganov"; - repo = "whisper.cpp"; - rev = "refs/tags/v${finalAttrs.version}" ; - hash = "sha256-y30ZccpF3SCdRGa+P3ddF1tT1KnvlI4Fexx81wZxfTk="; - }; - - # The upstream download script tries to download the models to the - # directory of the script, which is not writable due to being - # inside the nix store. This patch changes the script to download - # the models to the current directory of where it is being run from. - patches = [ ./download-models.patch ]; - - nativeBuildInputs = [ - which - makeWrapper - ] ++ lib.optionals cudaSupport [ - cudaPackages.cuda_nvcc - autoAddDriverRunpath - ]; - - buildInputs = [ - SDL2 - ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ - Accelerate - CoreGraphics - CoreML - CoreVideo - MetalKit - ] ++ lib.optionals cudaSupport ( with cudaPackages; [ - cuda_cccl # provides nv/target - cuda_cudart - libcublas - ]); - - postPatch = let - cudaOldStr = "-lcuda "; - cudaNewStr = "-lcuda -L${cudaPackages.cuda_cudart}/lib/stubs "; - in lib.optionalString cudaSupport '' - substituteInPlace Makefile \ - --replace-fail '${cudaOldStr}' '${cudaNewStr}' - ''; - - env = lib.optionalAttrs stdenv.hostPlatform.isDarwin { - WHISPER_COREML = "1"; - WHISPER_COREML_ALLOW_FALLBACK = "1"; - WHISPER_METAL_EMBED_LIBRARY = "1"; - } // lib.optionalAttrs cudaSupport { - GGML_CUDA = "1"; - }; - - installPhase = '' - runHook preInstall - - mkdir -p $out/bin - - cp ./main $out/bin/whisper-cpp - - for file in *; do - if [[ -x "$file" && -f "$file" && "$file" != "main" ]]; then - cp "$file" "$out/bin/whisper-cpp-$file" - fi - done - - cp models/download-ggml-model.sh $out/bin/whisper-cpp-download-ggml-model - - wrapProgram $out/bin/whisper-cpp-download-ggml-model \ - --prefix PATH : ${lib.makeBinPath [wget]} - - runHook postInstall - ''; - - meta = with lib; { - description = "Port of OpenAI's Whisper model in C/C++"; - longDescription = '' - To download the models as described in the project's readme, you may - use the `whisper-cpp-download-ggml-model` binary from this package. - ''; - homepage = "https://github.com/ggerganov/whisper.cpp"; - license = licenses.mit; - platforms = platforms.all; - maintainers = with maintainers; [ dit7ya hughobrien ]; - }; -}) diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index ee2a80376cf1..a0db6ec6d3fb 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -999,6 +999,7 @@ mapAliases { oauth2_proxy = throw "'oauth2_proxy' has been renamed to/replaced by 'oauth2-proxy'"; # Converted to throw 2024-10-17 oil = lib.warnOnInstantiate "Oil has been replaced with the faster native C++ version and renamed to 'oils-for-unix'. See also https://github.com/oils-for-unix/oils/wiki/Oils-Deployments" oils-for-unix; # Added 2024-10-22 onevpl-intel-gpu = lib.warnOnInstantiate "onevpl-intel-gpu has been renamed to vpl-gpu-rt" vpl-gpu-rt; # Added 2024-06-04 + openai-whisper-cpp = whisper-cpp; # Added 2024-12-13 opencv2 = throw "opencv2 has been removed as it is obsolete and was not used by any other package; please migrate to OpenCV 4"; # Added 2024-08-20 opencv3 = throw "opencv3 has been removed as it is obsolete and was not used by any other package; please migrate to OpenCV 4"; # Added 2024-08-20 openafs_1_8 = openafs; # Added 2022-08-22 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 18a9a9d8e9ca..e4c00c5bcb56 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -8137,10 +8137,6 @@ with pkgs; openai-whisper = with python3.pkgs; toPythonApplication openai-whisper; - openai-whisper-cpp = darwin.apple_sdk_11_0.callPackage ../tools/audio/openai-whisper-cpp { - inherit (darwin.apple_sdk_11_0.frameworks) Accelerate CoreGraphics CoreML CoreVideo MetalKit; - }; - openocd-rp2040 = openocd.overrideAttrs (old: { pname = "openocd-rp2040"; src = fetchFromGitHub { @@ -8412,6 +8408,10 @@ with pkgs; inherit (llvmPackages) clang-unwrapped; }; + whisper-cpp-vulkan = whisper-cpp.override { + vulkanSupport = true; + }; + watson-ruby = callPackage ../development/tools/misc/watson-ruby { }; xmake = darwin.apple_sdk_11_0.callPackage ../development/tools/build-managers/xmake {