Skip to content
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
2 changes: 2 additions & 0 deletions src/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
oneTBB = callPackage ./onetbb.nix {
#inherit llvm;
};
openvino = callPackage ./openvino.nix {};

spirv-llvm-translator = callPackage ./spirv-llvm-translator.nix {};
spirv-llvm-translator-test =
Expand Down Expand Up @@ -72,6 +73,7 @@
oneDNN
oneMath
oneTBB
openvino
;
};
llama-cpp = callPackage ./ggml/llama-cpp.nix {
Expand Down
171 changes: 128 additions & 43 deletions src/ggml/whisper-cpp.nix
Original file line number Diff line number Diff line change
@@ -1,52 +1,137 @@
{
fetchFromGitHub,
llvm,
cmake,
ninja,
oneDNN,
oneMath,
oneTBB,
# mkl,
git,
opencl-headers,
ocl-icd,
}: let
version = "1.7.6";
in
llvm.stdenv.mkDerivation {
pname = "whisper-cpp";
inherit version;

src = fetchFromGitHub {
owner = "ggml-org";
repo = "whisper.cpp";
tag = "v${version}";
hash = "sha256-dppBhiCS4C3ELw/Ckx5W0KOMUvOHUiisdZvkS7gkxj4=";
};

nativeBuildInputs = [
cmake
ninja
git
];
{ autoAddDriverRunpath
, cmake
, fetchFromGitHub
, git
, lib
, llvm
, llvmPackages
, makeWrapper
, oneDNN
, oneMath
, oneTBB
, openvino
, SDL2
, opencl-headers
, ocl-icd
, openblas # NOTE: needed for now until whisper.cpp moves to OneMath
, runCommand
}:

let
oneMathCmakeShim = runCommand "oneMathCmakeShim" {
buildInputs = [
oneDNN
oneMath
oneTBB
# mkl
opencl-headers
ocl-icd
llvm.baseLlvm.openmp
];
} ''
mkdir -p $out/lib/cmake/OpenCL
mkdir -p $out/lib/cmake/MKL

hardeningDisable = [
"zerocallusedregs"
"pacret"
# "shadowstack"
];
cat > $out/lib/cmake/MKL/MKLConfig.cmake <<EOF
add_library(MKL::MKL UNKNOWN IMPORTED GLOBAL)
set_target_properties(MKL::MKL PROPERTIES
IMPORTED_LOCATION "${oneMath}/lib/libonemath.so"
INTERFACE_INCLUDE_DIRECTORIES "${oneMath}/include"
)

add_library(MKL::MKL_SYCL::BLAS UNKNOWN IMPORTED GLOBAL)
set_target_properties(MKL::MKL_SYCL::BLAS PROPERTIES
IMPORTED_LOCATION "${oneMath}/lib/libonemath_blas_generic.so"
INTERFACE_LINK_LIBRARIES "${oneMath}/lib/libonemath.so;${llvm.baseLlvm.openmp}/lib/libiomp5.so"
INTERFACE_INCLUDE_DIRECTORIES "${oneMath}/include"
)
EOF

cat > $out/lib/cmake/OpenCL/OpenCLConfig.cmake <<EOF
if(NOT TARGET OpenCL::OpenCL)
add_library(OpenCL::OpenCL UNKNOWN IMPORTED GLOBAL)
set_target_properties(OpenCL::OpenCL PROPERTIES
IMPORTED_LOCATION "${ocl-icd}/lib/libOpenCL.so"
INTERFACE_INCLUDE_DIRECTORIES "${opencl-headers}/include"
INTERFACE_LINK_LIBRARIES "${ocl-icd}/lib/libOpenCL.so"
)
set(OpenCL_FOUND TRUE PARENT_SCOPE)
set(OpenCL_INCLUDE_DIRS "${opencl-headers}/include" PARENT_SCOPE)
set(OpenCL_LIBRARIES "${ocl-icd}/lib/libOpenCL.so" PARENT_SCOPE)
set(OpenCL_FOUND TRUE CACHE BOOL "OpenCL found")
set(OpenCL_INCLUDE_DIRS "${opencl-headers}/include" CACHE PATH "OpenCL include dirs")
set(OpenCL_LIBRARIES "${ocl-icd}/lib/libOpenCL.so" CACHE FILEPATH "OpenCL libraries")
endif()
EOF
'';
in

llvm.stdenv.mkDerivation rec {
name = "whisper-cpp";
pname = "whisper-cpp";

src = fetchFromGitHub {
owner = "ggml-org";
repo = "whisper.cpp";
rev = "5527454cdb3e15d7e2b8a6e2afcb58cb61651fd2";
hash = "sha256-dppBhiCS4C3ELw/Ckx5W0KOMUvOHUiisdZvkS7gkxj4=";
};

nativeBuildInputs = [
cmake
makeWrapper
git
oneMathCmakeShim
autoAddDriverRunpath
];

buildInputs = [
oneDNN
oneTBB
llvm.baseLlvm.openmp
SDL2
openvino
oneMath
opencl-headers
ocl-icd
openblas # NOTE: Needed currently for blas symbols
];

postPatch = ''
substituteInPlace ggml/src/ggml-sycl/dpct/helper.hpp \
--replace 'namespace math = mkl;' '/* namespace math = mkl; */'
'';

preConfigure = ''
if [ -f "ggml/src/ggml-sycl/CMakeLists.txt" ]; then
echo "Modifying SYCL CMakeLists.txt to find OpenCL first"
sed -i '/if (GGML_SYCL_TARGET STREQUAL "INTEL")/i\
find_package(OpenCL REQUIRED)' ggml/src/ggml-sycl/CMakeLists.txt
fi

source ${openvino}/setupvars.sh || echo "OpenVINO setup completed with warnings!"
'';

hardeningDisable = [ "all" ]; # NOTE: Enable most hardenings eventually

cmakeFlags = [
"-DGGML_SYCL=ON"
"-DWHISPER_OPENVINO=1"
"-DWHISPER_SDL2=ON"

"-DGGML_BLAS=ON"
"-DGGML_BLAS_VENDOR=Generic"
"-DBLAS_LIBRARIES=${oneMath}/lib/libonemath_blas_generic.so;${llvm.baseLlvm.openmp}/lib/libiomp5.so;${openblas}/lib/libopenblas.so"
"-DBLAS_INCLUDE_DIRS=${openblas}/include"

"-DCMAKE_PREFIX_PATH=${oneMathCmakeShim}/lib/cmake"
];

# NOTE: TODO: Uncommenting/removing this today causes runtime problems later, granted I didnt rebase master yet
postInstall = ''
for binary in $out/bin/*; do
if [[ -f "$binary" && -x "$binary" ]]; then
wrapProgram "$binary" \
--prefix LD_LIBRARY_PATH : "/run/opengl-driver/lib:/run/opengl-driver-32/lib"
fi
done
'';
}

cmakeFlags = [
"-DWHISPER_SYCL=ON"
];
}
Loading