diff --git a/pkgs/by-name/ll/llama-cpp/package.nix b/pkgs/by-name/ll/llama-cpp/package.nix index ce1ae9e3c291..e6b4bde91d43 100644 --- a/pkgs/by-name/ll/llama-cpp/package.nix +++ b/pkgs/by-name/ll/llama-cpp/package.nix @@ -15,6 +15,8 @@ rocmPackages ? { }, rocmGpuTargets ? rocmPackages.clr.localGpuTargets or rocmPackages.clr.gpuTargets, + cpuArchDynamicDispatch ? true, + openclSupport ? false, clblast, @@ -141,8 +143,7 @@ effectiveStdenv.mkDerivation (finalAttrs: { ''; cmakeFlags = [ - # -march=native is non-deterministic; override with platform-specific flags if needed - (cmakeBool "GGML_NATIVE" false) + (cmakeBool "GGML_NATIVE" false) # -march=native would make builds non-deterministic (cmakeBool "LLAMA_BUILD_EXAMPLES" false) (cmakeBool "LLAMA_BUILD_SERVER" true) (cmakeBool "LLAMA_BUILD_TESTS" (finalAttrs.finalPackage.doCheck or false)) @@ -157,6 +158,18 @@ effectiveStdenv.mkDerivation (finalAttrs: { (cmakeBool "GGML_VULKAN" vulkanSupport) (cmakeFeature "LLAMA_BUILD_NUMBER" finalAttrs.version) ] + ++ optionals cpuArchDynamicDispatch [ + # Build all CPU backend variants for runtime dynamic dispatch. + # This avoids illegal instructions on older CPUs and gives optimal performance + # on newer ones without needing separate builds. + # Enabling AVX2 can make CPU inference 13x faster compared to NixOS's x86_64 defaults. + # Note it is not a bug that the CPU variant .so files are placed in `bin/` + # (as opposed to `lib/`) alongside the executables by upstream's `CMakeLists.txt` design: + # * https://github.com/ggml-org/llama.cpp/blob/b46812de78f8fbcb6cf0154947e8633ebc78d9ac/ggml/src/CMakeLists.txt#L249-L252 + # * https://github.com/ggml-org/llama.cpp/blob/b46812de78f8fbcb6cf0154947e8633ebc78d9ac/ggml/src/ggml-backend-reg.cpp#L480-L486 + (cmakeBool "GGML_CPU_ALL_VARIANTS" true) + (cmakeBool "GGML_BACKEND_DL" true) + ] ++ optionals cudaSupport [ (cmakeFeature "CMAKE_CUDA_ARCHITECTURES" cudaPackages.flags.cmakeCudaArchitecturesString) ]