#!/usr/bin/env bash # # Tower-side launcher for the transcribe worker. # # CTranslate2 4.7.2 needs libcublas.so.12 + libcudnn.so.9. Arch/EndeavourOS # now ships CUDA 13, so we install the matching CUDA-12 runtime as pip # wheels under the `tower` extra (nvidia-cublas-cu12, nvidia-cudnn-cu12). # Those wheels drop their .so files into the venv's # `site-packages/nvidia/{cublas,cudnn}/lib/` dirs, but nothing exports # those onto LD_LIBRARY_PATH — systemd doesn't inherit Travis's shell. # # This wrapper resolves those paths at runtime from the venv's own # Python (so it's robust to python-3.X upgrades, venv moves, and wheel # version bumps), prepends them to LD_LIBRARY_PATH, and execs the # worker. If the nvidia packages aren't importable we abort loudly so # systemd surfaces a clear error instead of a silent libcublas load # failure deep inside ctranslate2. set -euo pipefail cd "$(dirname "$(readlink -f "$0")")/../.." # project root: deploy/tower → ../.. # Resolve lib dirs from inside the project venv via `uv run`. Both # packages must import cleanly — uv exits non-zero if not, and the # `set -e` above propagates that. NVIDIA_LIB_DIRS="$( uv run python - <<'PY' import os, sys # nvidia.cublas / nvidia.cudnn are PEP 420 namespace packages — they # have __path__ but no __init__.py and no __file__. Resolve via __path__ # (which is a _NamespacePath; treat as iterable of strings). mods = ("nvidia.cublas", "nvidia.cudnn") dirs = [] for m in mods: try: pkg = __import__(m, fromlist=["_"]) except ImportError as exc: sys.stderr.write( f"[run-transcribe-worker] missing CUDA-12 runtime package {m!r}: {exc}\n" "Install with: uv sync --extra tower\n" ) sys.exit(1) paths = list(getattr(pkg, "__path__", []) or []) if not paths: sys.stderr.write( f"[run-transcribe-worker] {m} has no __path__ — broken install?\n" ) sys.exit(1) lib = os.path.join(paths[0], "lib") if not os.path.isdir(lib): sys.stderr.write( f"[run-transcribe-worker] {m} is installed but {lib!r} is not a directory\n" ) sys.exit(1) dirs.append(lib) print(":".join(dirs)) PY )" # Prepend so our pinned CUDA-12 libs win over any system CUDA 13 left on # the loader path. Preserve any existing LD_LIBRARY_PATH (rare but cheap). export LD_LIBRARY_PATH="${NVIDIA_LIB_DIRS}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" exec uv run second-brain transcribe-worker "$@"