Docker Compose media stack (gluetun, *arr, Jellyfin), Ternary-Bonsai AI (Open WebUI, Forgejo, optional OpenHands), and Ansible bootstrap for the SER5 Ubuntu host.
88 lines
2.4 KiB
Bash
Executable file
88 lines
2.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Start Prism llama-server with Ternary-Bonsai defaults.
|
|
set -euo pipefail
|
|
|
|
MODEL_PATH="${MODEL_PATH:-/models/Ternary-Bonsai-27B-Q2_0.gguf}"
|
|
HOST="${HOST:-0.0.0.0}"
|
|
PORT="${PORT:-8080}"
|
|
CTX_SIZE="${CTX_SIZE:-16384}"
|
|
TEMP="${TEMP:-0.7}"
|
|
TOP_P="${TOP_P:-0.95}"
|
|
TOP_K="${TOP_K:-20}"
|
|
NGL="${NGL:-0}"
|
|
THREADS="${THREADS:-0}"
|
|
KV4="${KV4:-0}"
|
|
EXTRA_ARGS="${EXTRA_ARGS:-}"
|
|
|
|
# Prefer vulkan binary tree if present and NGL > 0
|
|
BIN=/usr/local/bin/llama-server
|
|
if [ -x /opt/bonsai/bin/vulkan/llama-server ] && [ "${NGL}" != "0" ]; then
|
|
export LD_LIBRARY_PATH="/opt/bonsai/bin/vulkan${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
BIN=/opt/bonsai/bin/vulkan/llama-server
|
|
elif [ -x /opt/bonsai/bin/cpu/llama-server ]; then
|
|
export LD_LIBRARY_PATH="/opt/bonsai/bin/cpu${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
|
BIN=/opt/bonsai/bin/cpu/llama-server
|
|
fi
|
|
|
|
if [ ! -f "$MODEL_PATH" ]; then
|
|
echo "ERROR: model not found at $MODEL_PATH"
|
|
echo "Run: ./scripts/download-bonsai-model.sh"
|
|
echo "Or set MODEL_PATH to your GGUF file."
|
|
exit 1
|
|
fi
|
|
|
|
# Optional vision projector (27B VLM)
|
|
MMPROJ_ARGS=()
|
|
if [ -n "${MMPROJ_PATH:-}" ] && [ -f "$MMPROJ_PATH" ]; then
|
|
MMPROJ_ARGS=(--mmproj "$MMPROJ_PATH")
|
|
else
|
|
# Auto-detect mmproj next to the model
|
|
_dir="$(dirname "$MODEL_PATH")"
|
|
for _mp in "$_dir"/*mmproj*.gguf; do
|
|
if [ -f "$_mp" ]; then
|
|
MMPROJ_ARGS=(--mmproj "$_mp")
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Optional 4-bit KV cache (long context on limited RAM)
|
|
KV_ARGS=()
|
|
if [ "$KV4" = "1" ]; then
|
|
KV_ARGS=(--cache-type-k q4_0 --cache-type-v q4_0)
|
|
fi
|
|
|
|
# Thread count: 0 = leave llama.cpp default (usually all physical cores)
|
|
THREAD_ARGS=()
|
|
if [ "$THREADS" != "0" ] && [ -n "$THREADS" ]; then
|
|
THREAD_ARGS=(-t "$THREADS")
|
|
fi
|
|
|
|
echo "=== Ternary-Bonsai llama-server ==="
|
|
echo " model: $MODEL_PATH"
|
|
echo " binary: $BIN"
|
|
echo " ngl: $NGL (0=CPU; for Vulkan image try 99 with /dev/dri)"
|
|
echo " context: $CTX_SIZE"
|
|
echo " api: http://${HOST}:${PORT}/v1/chat/completions"
|
|
[ "${#MMPROJ_ARGS[@]}" -gt 0 ] && echo " vision: ${MMPROJ_ARGS[1]}"
|
|
[ "$KV4" = "1" ] && echo " kv: q4_0"
|
|
echo ""
|
|
|
|
# shellcheck disable=SC2086
|
|
exec "$BIN" \
|
|
-m "$MODEL_PATH" \
|
|
--host "$HOST" \
|
|
--port "$PORT" \
|
|
-ngl "$NGL" \
|
|
-fa on \
|
|
-c "$CTX_SIZE" \
|
|
--temp "$TEMP" \
|
|
--top-p "$TOP_P" \
|
|
--top-k "$TOP_K" \
|
|
--min-p 0 \
|
|
--jinja \
|
|
"${THREAD_ARGS[@]}" \
|
|
"${MMPROJ_ARGS[@]}" \
|
|
"${KV_ARGS[@]}" \
|
|
$EXTRA_ARGS \
|
|
"$@"
|