Files
hermes-arch-stack/scripts/install-llama-cpp.sh
T

62 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Baut in einem neuen Verzeichnis. Kein Ersetzen von /usr/bin oder laufenden Builds.
set -Eeuo pipefail
umask 077
revision=""
jobs=4
cuda_arch=86
base_dir="$HOME/.local/opt/llama.cpp"
usage() {
printf 'Aufruf: %s --ref TAG_ODER_COMMIT [--jobs N] [--cuda-arch 86] [--prefix ABSOLUTER_PFAD]\n' "$0"
printf 'Explizit --ref master für aktuellen Stand; aufgelöster Commit wird gespeichert.\n'
}
while (($#)); do
case "$1" in
--ref) [[ $# -ge 2 ]] || exit 2; revision="$2"; shift ;;
--jobs) [[ $# -ge 2 ]] || exit 2; jobs="$2"; shift ;;
--cuda-arch) [[ $# -ge 2 ]] || exit 2; cuda_arch="$2"; shift ;;
--prefix) [[ $# -ge 2 ]] || exit 2; base_dir="$2"; shift ;;
-h|--help) usage; exit 0 ;;
*) usage >&2; exit 2 ;;
esac
shift
done
[[ "$revision" =~ ^[A-Za-z0-9][A-Za-z0-9._/-]*$ ]] || { usage >&2; exit 2; }
[[ "$jobs" =~ ^[1-9][0-9]*$ && "$cuda_arch" =~ ^[1-9][0-9]*$ ]] || exit 2
[[ "$base_dir" == /* && "$base_dir" != / && "$base_dir" != "$HOME" ]] || exit 2
for dependency in git cmake ninja c++ nvidia-smi; do
command -v "$dependency" >/dev/null || {
printf '%s fehlt. Siehe docs/LLAMA_INSTALL.md.\n' "$dependency" >&2; exit 1;
}
done
nvidia-smi >/dev/null
nvcc_path="${CUDACXX:-/opt/cuda/bin/nvcc}"
[[ -x "$nvcc_path" ]] || { printf 'CUDA nvcc fehlt: %s\n' "$nvcc_path" >&2; exit 1; }
mkdir -p "$base_dir"
exec 9>"$base_dir/build.lock"
flock -n 9 || { printf 'Ein CUDA-Build läuft bereits.\n' >&2; exit 1; }
build_dir="$(mktemp -d "$base_dir/build.XXXXXXXX")"
printf 'Neuer Build unter %s (bleibt auch bei Fehler zur Diagnose erhalten).\n' "$build_dir"
git init -q "$build_dir/source"
git -C "$build_dir/source" remote add origin https://github.com/ggml-org/llama.cpp.git
GIT_TERMINAL_PROMPT=0 timeout 300 git -C "$build_dir/source" fetch --depth 1 origin "$revision"
git -C "$build_dir/source" checkout --detach FETCH_HEAD
commit="$(git -C "$build_dir/source" rev-parse HEAD)"
cmake -S "$build_dir/source" -B "$build_dir/build" -G Ninja \
-DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DBUILD_SHARED_LIBS=OFF \
-DCMAKE_CUDA_COMPILER="$nvcc_path" -DCMAKE_CUDA_ARCHITECTURES="$cuda_arch"
cmake --build "$build_dir/build" --parallel "$jobs" --target llama-server llama-cli llama-bench
cp -a -- "$build_dir/build/bin" "$build_dir/bin"
"$build_dir/bin/llama-server" --version
"$build_dir/bin/llama-cli" --version
printf 'upstream=https://github.com/ggml-org/llama.cpp.git\nref=%s\ncommit=%s\ncuda_arch=%s\nbuilt=%s\n' \
"$revision" "$commit" "$cuda_arch" "$(date --iso-8601=seconds)" >"$build_dir/BUILD-INFO.txt"
if [[ ! -e "$base_dir/current" && ! -L "$base_dir/current" ]]; then
ln -s -- "$build_dir" "$base_dir/current"
printf 'Erster verwalteter Build ausgewählt; noch kein Dienst gestartet.\n'
else
printf 'Bestehender current-Build bleibt unverändert.\n'
fi
printf 'Neue Binary: %s/bin/llama-server\nCommit: %s\n' "$build_dir" "$commit"
printf 'Zur bewussten Auswahl LLAMA_SERVER_BIN in llama.env setzen. Keine automatische Aktualisierung.\n'