Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

whisper-cpp: add ROCm and Vulkan support, rename from openai-whisper-cpp #365033

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
199 changes: 199 additions & 0 deletions pkgs/by-name/wh/whisper-cpp/package.nix
Original file line number Diff line number Diff line change
@@ -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 # <nv/target>

# 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
];
};
})
113 changes: 0 additions & 113 deletions pkgs/tools/audio/openai-whisper-cpp/default.nix

This file was deleted.

1 change: 1 addition & 0 deletions pkgs/top-level/aliases.nix
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,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
Expand Down
8 changes: 4 additions & 4 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8342,10 +8342,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 {
Expand Down Expand Up @@ -8620,6 +8616,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 {
Expand Down