diff --git a/README.md b/README.md index 940bc24..34a815b 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,13 @@ Quick start: This creates or refreshes `backend/.venv`, installs Python dependencies, installs npm dependencies, and starts the dev stack. +On Linux `x86_64`, `run.sh` now selects a PyTorch flavor before installing `openai-whisper`: + +- Steam Deck / SteamOS and other non-NVIDIA Linux hosts default to CPU-only PyTorch, which avoids downloading NVIDIA CUDA runtime wheels that Whisper does not need there. +- NVIDIA Linux hosts keep the default PyTorch install path. +- Override with `HEIMGEIST_TORCH_FLAVOR=default`, `HEIMGEIST_TORCH_FLAVOR=cpu`, or `HEIMGEIST_TORCH_FLAVOR=rocm6.4`. +- Use `HEIMGEIST_TORCH_INDEX_URL=...` if you need a custom PyTorch wheel index. + Manual startup: ```bash diff --git a/run.sh b/run.sh index 9d2b691..7ce05dc 100755 --- a/run.sh +++ b/run.sh @@ -3,17 +3,132 @@ set -eu PYTHON_BIN="${PYTHON_BIN:-python3.13}" VENV_DIR="backend/.venv" +TORCH_FLAVOR_FILE="$VENV_DIR/.heimgeist-torch-flavor" +HEIMGEIST_TORCH_FLAVOR="${HEIMGEIST_TORCH_FLAVOR:-auto}" +HEIMGEIST_TORCH_INDEX_URL="${HEIMGEIST_TORCH_INDEX_URL:-}" + +is_linux_x86_64() { + [ "$(uname -s)" = "Linux" ] && [ "$(uname -m)" = "x86_64" ] +} + +has_nvidia_gpu() { + if command -v nvidia-smi >/dev/null 2>&1; then + return 0 + fi + + for vendor_file in /sys/class/drm/card*/device/vendor; do + [ -r "$vendor_file" ] || continue + if grep -qi "0x10de" "$vendor_file"; then + return 0 + fi + done + + return 1 +} + +is_steam_deck() { + if [ -r /etc/os-release ] && grep -Eiq '(^ID=steamos$|^NAME=.*SteamOS|^PRETTY_NAME=.*SteamOS)' /etc/os-release; then + return 0 + fi + + for dmi_file in \ + /sys/devices/virtual/dmi/id/product_name \ + /sys/devices/virtual/dmi/id/product_version \ + /sys/devices/virtual/dmi/id/board_name + do + [ -r "$dmi_file" ] || continue + if grep -Eiq 'steam deck|jupiter|galileo' "$dmi_file"; then + return 0 + fi + done + + return 1 +} + +resolve_torch_flavor() { + case "$HEIMGEIST_TORCH_FLAVOR" in + auto) + if is_linux_x86_64; then + if is_steam_deck; then + printf '%s\n' "cpu" + return + fi + if has_nvidia_gpu; then + printf '%s\n' "default" + return + fi + printf '%s\n' "cpu" + return + fi + printf '%s\n' "default" + ;; + default|cpu|cuda|rocm|rocm6.4) + printf '%s\n' "%s" "$HEIMGEIST_TORCH_FLAVOR" + ;; + *) + echo "Unsupported HEIMGEIST_TORCH_FLAVOR '$HEIMGEIST_TORCH_FLAVOR'. Use auto, default, cpu, cuda, rocm, or rocm6.4." >&2 + exit 1 + ;; + esac +} + +install_selected_torch() { + torch_flavor="$1" + + if [ -n "$HEIMGEIST_TORCH_INDEX_URL" ]; then + echo "Installing PyTorch from custom index: $HEIMGEIST_TORCH_INDEX_URL" + "$VENV_DIR/bin/python" -m pip install --upgrade --index-url "$HEIMGEIST_TORCH_INDEX_URL" torch + return + fi + + case "$torch_flavor" in + default|cuda) + return + ;; + cpu) + echo "Installing CPU-only PyTorch for Whisper" + "$VENV_DIR/bin/python" -m pip install --upgrade --index-url https://download.pytorch.org/whl/cpu torch + ;; + rocm|rocm6.4) + echo "Installing ROCm PyTorch for Whisper" + "$VENV_DIR/bin/python" -m pip install --upgrade --index-url https://download.pytorch.org/whl/rocm6.4 torch + ;; + esac +} if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then echo "Python 3.13 is required. Set PYTHON_BIN to a Python 3.13 executable if needed." >&2 exit 1 fi +TORCH_FLAVOR="$(resolve_torch_flavor)" +RECREATE_VENV=0 + if [ ! -x "$VENV_DIR/bin/python" ] || ! "$VENV_DIR/bin/python" -c 'import sys; raise SystemExit(0 if sys.version_info[:2] == (3, 13) else 1)'; then + RECREATE_VENV=1 +fi + +if [ "$RECREATE_VENV" -eq 0 ]; then + PREVIOUS_TORCH_FLAVOR="" + if [ -r "$TORCH_FLAVOR_FILE" ]; then + PREVIOUS_TORCH_FLAVOR="$(cat "$TORCH_FLAVOR_FILE")" + fi + if [ -n "$PREVIOUS_TORCH_FLAVOR" ] && [ "$PREVIOUS_TORCH_FLAVOR" != "$TORCH_FLAVOR" ]; then + RECREATE_VENV=1 + elif [ -z "$PREVIOUS_TORCH_FLAVOR" ] && [ "$TORCH_FLAVOR" != "default" ]; then + RECREATE_VENV=1 + fi +fi + +if [ "$RECREATE_VENV" -eq 1 ]; then rm -rf "$VENV_DIR" "$PYTHON_BIN" -m venv "$VENV_DIR" fi +printf '%s\n' "$TORCH_FLAVOR" > "$TORCH_FLAVOR_FILE" +echo "Using PyTorch flavor: $TORCH_FLAVOR" +"$VENV_DIR/bin/python" -m pip install --upgrade pip +install_selected_torch "$TORCH_FLAVOR" "$VENV_DIR/bin/python" -m pip install -r backend/requirements.txt npm install npm run dev