61 lines
2.3 KiB
Bash
Executable File
61 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# vLLM na Apple Silicon przez plugin vllm-project/vllm-metal (backend MLX).
|
|
#
|
|
# Docker na macOS nie ma dostępu do Metala, więc to jedyna ścieżka z akceleracją.
|
|
# Plugin instaluje się do własnego venva (~/.venv-vllm-metal) i wymaga natywnego
|
|
# arm64 Pythona 3.12 oraz Xcode Command Line Tools.
|
|
#
|
|
# Użycie: vllm-metal.sh up <model> <port> <log> <pid> | down <pid> | install
|
|
set -euo pipefail
|
|
|
|
VENV="${VLLM_METAL_VENV:-$HOME/.venv-vllm-metal}"
|
|
INSTALLER_URL="https://raw.githubusercontent.com/vllm-project/vllm-metal/main/install.sh"
|
|
|
|
fail() { echo "błąd: $*" >&2; exit 1; }
|
|
|
|
check_platform() {
|
|
[ "$(uname -s)" = "Darwin" ] || fail "ten backend działa wyłącznie na macOS (wykryto $(uname -s))"
|
|
[ "$(uname -m)" = "arm64" ] || fail "wymagany Apple Silicon (wykryto $(uname -m))"
|
|
xcode-select -p >/dev/null 2>&1 || fail "brak Xcode Command Line Tools - uruchom: xcode-select --install"
|
|
}
|
|
|
|
install_plugin() {
|
|
check_platform
|
|
if [ -x "$VENV/bin/vllm" ]; then
|
|
echo "vllm-metal już zainstalowany w $VENV"
|
|
return 0
|
|
fi
|
|
echo "instaluję vllm-metal do $VENV (to potrwa kilka minut)..."
|
|
curl -fsSL "$INSTALLER_URL" | bash
|
|
[ -x "$VENV/bin/vllm" ] || fail "instalacja nie powiodła się - sprawdź https://github.com/vllm-project/vllm-metal"
|
|
}
|
|
|
|
case "${1:-}" in
|
|
install)
|
|
install_plugin
|
|
;;
|
|
up)
|
|
model="${2:?podaj model}"; port="${3:-8000}"; log="${4:-.runs/llm/vllm-metal.log}"; pidfile="${5:-.runs/llm/vllm-metal.pid}"
|
|
install_plugin
|
|
mkdir -p "$(dirname "$log")" "$(dirname "$pidfile")"
|
|
if [ -f "$pidfile" ] && kill -0 "$(cat "$pidfile")" 2>/dev/null; then
|
|
echo "vllm-metal już działa (pid $(cat "$pidfile"))"; exit 0
|
|
fi
|
|
echo "startuję vllm serve $model na porcie $port (log: $log)"
|
|
python3 "$(dirname "$0")/daemonize.py" --pidfile "$pidfile" --log "$log" -- \
|
|
"$VENV/bin/vllm" serve "$model" \
|
|
--port "$port" \
|
|
--max-model-len 16384 \
|
|
--enable-auto-tool-choice \
|
|
--tool-call-parser hermes
|
|
echo "pierwsze uruchomienie pobiera model - to może potrwać (log: $log)"
|
|
;;
|
|
down)
|
|
pidfile="${2:-.runs/llm/vllm-metal.pid}"
|
|
python3 "$(dirname "$0")/daemonize.py" --pidfile "$pidfile" --log /dev/null --stop
|
|
;;
|
|
*)
|
|
fail "użycie: $0 {install|up <model> <port> <log> <pid>|down <pid>}"
|
|
;;
|
|
esac
|