From 5b57a5b72676540b6a45a3f527126299969ad241 Mon Sep 17 00:00:00 2001 From: jacobi petrucciani <8117202+jpetrucciani@users.noreply.github.com> Date: Wed, 7 Jun 2023 00:15:31 -0400 Subject: [PATCH] flake : update to support metal on m1/m2 (#1724) --- flake.lock | 30 ++++++++++++++++++++++++------ flake.nix | 26 ++++++++++++++++++-------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/flake.lock b/flake.lock index 343996d..33164e0 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,15 @@ { "nodes": { "flake-utils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1676283394, - "narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=", + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", "owner": "numtide", "repo": "flake-utils", - "rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", "type": "github" }, "original": { @@ -17,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1678470307, - "narHash": "sha256-OEeMUr3ueLIXyW/OaFUX5jUdimyQwMg/7e+/Q0gC/QE=", + "lastModified": 1685931219, + "narHash": "sha256-8EWeOZ6LKQfgAjB/USffUSELPRjw88A+xTcXnOUvO5M=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "0c4800d579af4ed98ecc47d464a5e7b0870c4b1f", + "rev": "7409480d5c8584a1a83c422530419efe4afb0d19", "type": "github" }, "original": { @@ -36,6 +39,21 @@ "flake-utils": "flake-utils", "nixpkgs": "nixpkgs" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 2c9edbb..6191004 100644 --- a/flake.nix +++ b/flake.nix @@ -6,6 +6,13 @@ outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let + inherit (pkgs.stdenv) isAarch64 isDarwin; + inherit (pkgs.lib) optionals; + isM1 = isAarch64 && isDarwin; + osSpecific = + if isM1 then with pkgs.darwin.apple_sdk_11_0.frameworks; [ Accelerate MetalKit MetalPerformanceShaders MetalPerformanceShadersGraph ] + else if isDarwin then with pkgs.darwin.apple_sdk.frameworks; [ Accelerate CoreGraphics CoreVideo ] + else [ ]; pkgs = import nixpkgs { inherit system; }; @@ -18,17 +25,22 @@ packages.default = pkgs.stdenv.mkDerivation { name = "llama.cpp"; src = ./.; + postPatch = + if isM1 then '' + substituteInPlace ./ggml-metal.m \ + --replace '[[NSBundle mainBundle] pathForResource:@"ggml-metal" ofType:@"metal"];' "@\"$out/ggml-metal.metal\";" + '' else ""; nativeBuildInputs = with pkgs; [ cmake ]; - buildInputs = with pkgs; lib.optionals stdenv.isDarwin [ - darwin.apple_sdk.frameworks.Accelerate - ]; - cmakeFlags = with pkgs; lib.optionals (system == "aarch64-darwin") [ + buildInputs = osSpecific; + cmakeFlags = [ "-DLLAMA_BUILD_SERVER=ON" ] ++ (optionals isM1 [ "-DCMAKE_C_FLAGS=-D__ARM_FEATURE_DOTPROD=1" - ]; + "-DLLAMA_METAL=ON" + ]); installPhase = '' mkdir -p $out/bin mv bin/* $out/bin/ mv $out/bin/main $out/bin/llama + mv $out/bin/server $out/bin/llama-server echo "#!${llama-python}/bin/python" > $out/bin/convert.py cat ${./convert.py} >> $out/bin/convert.py @@ -40,9 +52,7 @@ packages = with pkgs; [ cmake llama-python - ] ++ lib.optionals stdenv.isDarwin [ - darwin.apple_sdk.frameworks.Accelerate - ]; + ] ++ osSpecific; }; } );