diff options
Diffstat (limited to 'pkgs/by-name/ll/llama-cpp/package.nix')
-rw-r--r-- | pkgs/by-name/ll/llama-cpp/package.nix | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/pkgs/by-name/ll/llama-cpp/package.nix b/pkgs/by-name/ll/llama-cpp/package.nix new file mode 100644 index 00000000000..7328416b93d --- /dev/null +++ b/pkgs/by-name/ll/llama-cpp/package.nix @@ -0,0 +1,142 @@ +{ lib +, cmake +, darwin +, fetchFromGitHub +, fetchpatch +, nix-update-script +, stdenv +, symlinkJoin + +, config +, cudaSupport ? config.cudaSupport +, cudaPackages ? { } + +, rocmSupport ? config.rocmSupport +, rocmPackages ? { } + +, openclSupport ? false +, clblast + +, openblasSupport ? true +, openblas +, pkg-config +}: + +let + cudatoolkit_joined = symlinkJoin { + name = "${cudaPackages.cudatoolkit.name}-merged"; + paths = [ + cudaPackages.cudatoolkit.lib + cudaPackages.cudatoolkit.out + ] ++ lib.optionals (lib.versionOlder cudaPackages.cudatoolkit.version "11") [ + # for some reason some of the required libs are in the targets/x86_64-linux + # directory; not sure why but this works around it + "${cudaPackages.cudatoolkit}/targets/${stdenv.system}" + ]; + }; + metalSupport = stdenv.isDarwin && stdenv.isAarch64; +in +stdenv.mkDerivation (finalAttrs: { + pname = "llama-cpp"; + version = "1538"; + + src = fetchFromGitHub { + owner = "ggerganov"; + repo = "llama.cpp"; + rev = "refs/tags/b${finalAttrs.version}"; + hash = "sha256-3JPGKJbO7Z3Jxz9KNSLYBAM7zQ+RJwBqsfRtpK6JS48="; + }; + + patches = [ + # openblas > v0.3.21 64-bit pkg-config file is now named openblas64.pc + # can remove when patch is accepted upstream + # https://github.com/ggerganov/llama.cpp/pull/4134 + (fetchpatch { + name = "openblas64-pkg-config.patch"; + url = "https://github.com/ggerganov/llama.cpp/commit/c885cc9f76c00557601b877136191b0f7aadc320.patch"; + hash = "sha256-GBTxCiNrCazYRvcHwbqVMAALuJ+Svzf5BE7+nkxw064="; + }) + ]; + + postPatch = '' + substituteInPlace ./ggml-metal.m \ + --replace '[bundle pathForResource:@"ggml-metal" ofType:@"metal"];' "@\"$out/bin/ggml-metal.metal\";" + ''; + + nativeBuildInputs = [ cmake ] ++ lib.optionals openblasSupport [ pkg-config ]; + + buildInputs = lib.optionals metalSupport + (with darwin.apple_sdk.frameworks; [ + Accelerate + CoreGraphics + CoreVideo + Foundation + MetalKit + ]) + ++ lib.optionals cudaSupport [ + cudatoolkit_joined + ] ++ lib.optionals rocmSupport [ + rocmPackages.clr + rocmPackages.hipblas + rocmPackages.rocblas + ] ++ lib.optionals openclSupport [ + clblast + ] ++ lib.optionals openblasSupport [ + openblas + ]; + + cmakeFlags = [ + "-DLLAMA_NATIVE=OFF" + "-DLLAMA_BUILD_SERVER=ON" + ] + ++ lib.optionals metalSupport [ + "-DCMAKE_C_FLAGS=-D__ARM_FEATURE_DOTPROD=1" + "-DLLAMA_METAL=ON" + ] + ++ lib.optionals cudaSupport [ + "-DLLAMA_CUBLAS=ON" + ] + ++ lib.optionals rocmSupport [ + "-DLLAMA_HIPBLAS=1" + "-DCMAKE_C_COMPILER=hipcc" + "-DCMAKE_CXX_COMPILER=hipcc" + "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" + ] + ++ lib.optionals openclSupport [ + "-DLLAMA_CLBLAST=ON" + ] + ++ lib.optionals openblasSupport [ + "-DLLAMA_BLAS=ON" + "-DLLAMA_BLAS_VENDOR=OpenBLAS" + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin + + for f in bin/*; do + test -x "$f" || continue + cp "$f" $out/bin/llama-cpp-"$(basename "$f")" + done + + ${lib.optionalString metalSupport "cp ./bin/ggml-metal.metal $out/bin/ggml-metal.metal"} + + runHook postInstall + ''; + + passthru.updateScript = nix-update-script { + attrPath = "llama-cpp"; + extraArgs = [ "--version-regex" "b(.*)" ]; + }; + + meta = with lib; { + description = "Port of Facebook's LLaMA model in C/C++"; + homepage = "https://github.com/ggerganov/llama.cpp/"; + license = licenses.mit; + mainProgram = "llama-cpp-main"; + maintainers = with maintainers; [ dit7ya elohmeier ]; + broken = stdenv.isDarwin && stdenv.isx86_64; + platforms = platforms.unix; + }; +}) |