setup_reranker_venv.sh 2.47 KB
#!/bin/bash
#
# Create isolated venv for one reranker backend.
#
set -euo pipefail

PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "${PROJECT_ROOT}"

PYTHON_BIN="${PYTHON_BIN:-python3}"
TMP_DIR="${RERANKER_PIP_TMPDIR:-${PROJECT_ROOT}/.tmp/reranker-pip}"

# shellcheck source=scripts/lib/load_env.sh
source "${PROJECT_ROOT}/scripts/lib/load_env.sh"
load_env_file "${PROJECT_ROOT}/.env"
# shellcheck source=scripts/lib/reranker_backend_env.sh
source "${PROJECT_ROOT}/scripts/lib/reranker_backend_env.sh"

BACKEND="${1:-$(detect_rerank_backend "${PROJECT_ROOT}")}"
VENV_DIR="${RERANKER_VENV:-$(reranker_backend_venv_dir "${PROJECT_ROOT}" "${BACKEND}")}"
REQ_FILE="$(reranker_backend_requirements_file "${PROJECT_ROOT}" "${BACKEND}")"

if [[ ! -f "${REQ_FILE}" ]]; then
  echo "ERROR: requirements file not found for reranker backend ${BACKEND}: ${REQ_FILE}" >&2
  exit 1
fi

if ! command -v "${PYTHON_BIN}" >/dev/null 2>&1; then
  echo "ERROR: python not found: ${PYTHON_BIN}" >&2
  exit 1
fi

if [[ -d "${VENV_DIR}" && ! -f "${VENV_DIR}/bin/activate" ]]; then
  echo "Found broken venv at ${VENV_DIR}, recreating..."
  rm -rf "${VENV_DIR}"
fi

if [[ ! -d "${VENV_DIR}" ]]; then
  echo "Creating ${VENV_DIR}"
  "${PYTHON_BIN}" -m venv "${VENV_DIR}"
else
  echo "Reusing ${VENV_DIR}"
fi

mkdir -p "${TMP_DIR}"
export TMPDIR="${TMP_DIR}"
PIP_ARGS=(--no-cache-dir)

echo "Using TMPDIR=${TMPDIR}"
"${VENV_DIR}/bin/python" -m pip install "${PIP_ARGS[@]}" --upgrade pip wheel
"${VENV_DIR}/bin/python" -m pip install "${PIP_ARGS[@]}" -r "${REQ_FILE}"

if [[ "${BACKEND}" == qwen3_gguf* ]]; then
  if [[ -x "/usr/local/cuda/bin/nvcc" ]]; then
    "${VENV_DIR}/bin/python" -m pip install "${PIP_ARGS[@]}" \
      cmake \
      ninja \
      scikit-build-core \
      flit_core \
      setuptools-scm
    echo "Rebuilding llama-cpp-python with CUDA support for ${BACKEND}"
    PATH="/usr/local/cuda/bin:/usr/bin:/bin" \
    CC="/usr/bin/x86_64-linux-gnu-gcc" \
    CXX="/usr/bin/x86_64-linux-gnu-g++" \
    CUDACXX="/usr/local/cuda/bin/nvcc" \
    CMAKE_ARGS="-DGGML_CUDA=on" \
    FORCE_CMAKE=1 \
    "${VENV_DIR}/bin/python" -m pip install "${PIP_ARGS[@]}" \
      --force-reinstall \
      --no-build-isolation \
      "llama-cpp-python==0.3.18"
  else
    echo "WARNING: /usr/local/cuda/bin/nvcc not found; ${BACKEND} will be installed without CUDA support." >&2
  fi
fi

echo
echo "Done."
echo "Backend: ${BACKEND}"
echo "Reranker venv: ${VENV_DIR}"
echo "Requirements: ${REQ_FILE}"
echo "Start service: ./scripts/start_reranker.sh"