#!/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 | down | 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 |down }" ;; esac