diff options
-rw-r--r-- | Biz/Bild/Deps.nix | 2 | ||||
-rw-r--r-- | Biz/Bild/Deps/ollama.nix | 193 | ||||
-rw-r--r-- | Biz/Bild/Nixpkgs.nix | 17 | ||||
-rw-r--r-- | Biz/Dev/Beryllium/Ollama.nix | 7 |
4 files changed, 17 insertions, 202 deletions
diff --git a/Biz/Bild/Deps.nix b/Biz/Bild/Deps.nix index 23b096d..9ba0b31 100644 --- a/Biz/Bild/Deps.nix +++ b/Biz/Bild/Deps.nix @@ -30,7 +30,7 @@ _self: super: nostr-rs-relay = super.callPackage ./Deps/nostr-rs-relay.nix { }; - ollama = super.callPackage ./Deps/ollama.nix { acceleration = "cuda"; }; + ollama = super.ollama.override { acceleration = "cuda"; }; # https://github.com/NixOS/nixpkgs/issues/317147#issuecomment-2147343125 radicale = super.radicale.overrideAttrs (_old: rec { diff --git a/Biz/Bild/Deps/ollama.nix b/Biz/Bild/Deps/ollama.nix deleted file mode 100644 index 72e31f7..0000000 --- a/Biz/Bild/Deps/ollama.nix +++ /dev/null @@ -1,193 +0,0 @@ -# This was cribbed from an open pull request: https://github.com/NixOS/nixpkgs/pull/309330 -{ lib, buildGo122Module, fetchFromGitHub, fetchpatch, buildEnv, linkFarm -, overrideCC, makeWrapper, stdenv, nixosTests - -, pkgs, cmake, gcc12, clblast, libdrm, rocmPackages, cudaPackages, linuxPackages -, darwin - -, testers, ollama - -, config -# one of `[ null false "rocm" "cuda" ]` -, acceleration ? null }: - -let - pname = "ollama"; - # don't forget to invalidate all hashes each update - version = "0.1.33"; - - src = fetchFromGitHub { - owner = "jmorganca"; - repo = "ollama"; - rev = "v${version}"; - hash = "sha256-+iZIuHr90d5OijrXl6kzPycsHmx5XnKAKKOtppycjsk="; - fetchSubmodules = true; - }; - vendorHash = "sha256-7x/n60WiKmwHFFuN0GfzkibUREvxAXNHcD3fHmihZvs="; - # ollama's patches of llama.cpp's example server - # `ollama/llm/generate/gen_common.sh` -> "apply temporary patches until fix is upstream" - # each update, these patches should be synchronized with the contents of `ollama/llm/patches/` - llamacppPatches = [ - (preparePatch "02-clip-log.diff" - "sha256-rMWbl3QgrPlhisTeHwD7EnGRJyOhLB4UeS7rqa0tdXM=") - (preparePatch "03-load_exception.diff" - "sha256-1DfNahFYYxqlx4E4pwMKQpL+XR0bibYnDFGt6dCL4TM=") - (preparePatch "04-metal.diff" - "sha256-Ne8J9R8NndUosSK0qoMvFfKNwqV5xhhce1nSoYrZo7Y=") - ]; - - preparePatch = patch: hash: - fetchpatch { - url = "file://${src}/llm/patches/${patch}"; - inherit hash; - stripLen = 1; - extraPrefix = "llm/llama.cpp/"; - }; - - accelIsValid = builtins.elem acceleration [ null false "rocm" "cuda" ]; - validateFallback = lib.warnIf (config.rocmSupport && config.cudaSupport) - (lib.concatStrings [ - "both `nixpkgs.config.rocmSupport` and `nixpkgs.config.cudaSupport` are enabled, " - "but they are mutually exclusive; falling back to cpu" - ]) (!(config.rocmSupport && config.cudaSupport)); - validateLinux = api: - (lib.warnIfNot stdenv.isLinux - "building ollama with `${api}` is only supported on linux; falling back to cpu" - stdenv.isLinux); - shouldEnable = assert accelIsValid; - mode: fallback: - ((acceleration == mode) - || (fallback && acceleration == null && validateFallback)) - && (validateLinux mode); - - enableRocm = shouldEnable "rocm" config.rocmSupport; - enableCuda = shouldEnable "cuda" config.cudaSupport; - - rocmClang = linkFarm "rocm-clang" { llvm = rocmPackages.llvm.clang; }; - rocmPath = buildEnv { - name = "rocm-path"; - paths = [ - rocmPackages.clr - rocmPackages.hipblas - rocmPackages.rocblas - rocmPackages.rocsolver - rocmPackages.rocsparse - rocmPackages.rocm-device-libs - rocmClang - ]; - }; - - cudaToolkit = buildEnv { - name = "cuda-toolkit"; - ignoreCollisions = - true; # FIXME: find a cleaner way to do this without ignoring collisions - paths = [ - cudaPackages.cudatoolkit - cudaPackages.cuda_cudart - cudaPackages.cuda_cudart.static - ]; - }; - - runtimeLibs = lib.optionals enableRocm [ rocmPackages.rocm-smi ] - ++ lib.optionals enableCuda [ linuxPackages.nvidia_x11 ]; - - appleFrameworks = darwin.apple_sdk_11_0.frameworks; - metalFrameworks = [ - appleFrameworks.Accelerate - appleFrameworks.Metal - appleFrameworks.MetalKit - appleFrameworks.MetalPerformanceShaders - ]; - - goBuild = if enableCuda then - buildGo122Module.override { stdenv = overrideCC stdenv gcc12; } - else - buildGo122Module; - inherit (lib) licenses platforms maintainers; -in goBuild ((lib.optionalAttrs enableRocm { - ROCM_PATH = rocmPath; - CLBlast_DIR = "${clblast}/lib/cmake/CLBlast"; -}) // (lib.optionalAttrs enableCuda { - CUDA_LIB_DIR = "${cudaToolkit}/lib"; - CUDACXX = "${cudaToolkit}/bin/nvcc"; - CUDAToolkit_ROOT = cudaToolkit; -}) // { - inherit pname version src vendorHash; - - nativeBuildInputs = [ cmake ] - ++ lib.optionals enableRocm [ rocmPackages.llvm.bintools ] - ++ lib.optionals (enableRocm || enableCuda) [ makeWrapper ] - ++ lib.optionals stdenv.isDarwin metalFrameworks; - - buildInputs = lib.optionals enableRocm [ - rocmPackages.clr - rocmPackages.hipblas - rocmPackages.rocblas - rocmPackages.rocsolver - rocmPackages.rocsparse - libdrm - ] ++ lib.optionals enableCuda [ cudaPackages.cuda_cudart ] - ++ lib.optionals stdenv.isDarwin metalFrameworks; - - patches = [ - # disable uses of `git` in the `go generate` script - # ollama's build script assumes the source is a git repo, but nix removes the git directory - # this also disables necessary patches contained in `ollama/llm/patches/` - # those patches are added to `llamacppPatches`, and reapplied here in the patch phase - (fetchpatch { - url = - "https://raw.githubusercontent.com/NixOS/nixpkgs/70998b85f2dd9b48faa474134678277a03dfa107/pkgs/by-name/ol/ollama/disable-git.patch"; - hash = "sha256-7DthNfvk4VACdJb5L+4n9JmFzQn9qqDP2N4Hwuuhtgg="; - }) - ] ++ llamacppPatches; - postPatch = '' - # replace inaccurate version number with actual release version - substituteInPlace version/version.go --replace-fail 0.0.0 '${version}' - ''; - preBuild = '' - # disable uses of `git`, since nix removes the git directory - export OLLAMA_SKIP_PATCHING=true - # build llama.cpp libraries for ollama - go generate ./... - ''; - postFixup = '' - # the app doesn't appear functional at the moment, so hide it - mv "$out/bin/app" "$out/bin/.ollama-app" - '' + lib.optionalString (enableRocm || enableCuda) '' - # expose runtime libraries necessary to use the gpu - mv "$out/bin/ollama" "$out/bin/.ollama-unwrapped" - makeWrapper "$out/bin/.ollama-unwrapped" "$out/bin/ollama" ${ - lib.optionalString enableRocm "--set-default HIP_PATH '${rocmPath}' " - } \ - --suffix LD_LIBRARY_PATH : '/run/opengl-driver/lib:${ - lib.makeLibraryPath runtimeLibs - }' - ''; - - ldflags = [ - "-s" - "-w" - "-X=github.com/jmorganca/ollama/version.Version=${version}" - "-X=github.com/jmorganca/ollama/server.mode=release" - ]; - - passthru.tests = { - service = nixosTests.ollama; - rocm = pkgs.ollama.override { acceleration = "rocm"; }; - cuda = pkgs.ollama.override { acceleration = "cuda"; }; - version = testers.testVersion { - inherit version; - package = ollama; - }; - }; - - meta = { - description = "Get up and running with large language models locally"; - homepage = "https://github.com/ollama/ollama"; - changelog = "https://github.com/ollama/ollama/releases/tag/v${version}"; - license = licenses.mit; - platforms = platforms.unix; - mainProgram = "ollama"; - maintainers = with maintainers; [ abysssol dit7ya elohmeier ]; - }; -}) diff --git a/Biz/Bild/Nixpkgs.nix b/Biz/Bild/Nixpkgs.nix index d53a125..212e3f1 100644 --- a/Biz/Bild/Nixpkgs.nix +++ b/Biz/Bild/Nixpkgs.nix @@ -24,13 +24,20 @@ let (import ./Python.nix) (import ./Haskell.nix) ]; -in { - nixos-24_05 = import sources.nixos-24_05 { - inherit system config overlays; - - }; nixos-unstable-small = import sources.nixos-unstable-small { inherit system config overlays; }; +in { + nixos-24_05 = import sources.nixos-24_05 { + inherit system config; + overlays = overlays ++ [ + (_: _: { + # backport newer packages from unstable + unstable = nixos-unstable-small.pkgs; + }) + ]; + }; + + inherit nixos-unstable-small; } diff --git a/Biz/Dev/Beryllium/Ollama.nix b/Biz/Dev/Beryllium/Ollama.nix index 00aa327..35b4fe1 100644 --- a/Biz/Dev/Beryllium/Ollama.nix +++ b/Biz/Dev/Beryllium/Ollama.nix @@ -7,7 +7,8 @@ If you want to spend time on it, spend time over there. */ -{ +let pkg = pkgs.unstable.ollama; +in { systemd.services.ollama = { description = "ollama"; @@ -23,7 +24,7 @@ }; serviceConfig = { - ExecStart = "${pkgs.ollama}/bin/ollama serve"; + ExecStart = "${pkg}/bin/ollama serve"; User = "ollama"; Group = "ollama"; Type = "simple"; @@ -35,7 +36,7 @@ }; # for administration, make this available to users' PATH - environment.systemPackages = [ pkgs.ollama ]; + environment.systemPackages = [ pkg ]; users.groups.ollama = { }; |