62 lines
2.9 KiB
Bash
62 lines
2.9 KiB
Bash
#!/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'
|