| #!/usr/bin/env bash
|
| set -euo pipefail
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| env_name="pxdbench"
|
| pkg_manager="conda"
|
| cuda_version=""
|
|
|
|
|
|
|
|
|
| OPTIONS=e:p:c:
|
| LONGOPTIONS=env:,pkg_manager:,cuda-version:
|
|
|
| PARSED=$(getopt --options="${OPTIONS}" --longoptions="${LONGOPTIONS}" --name "$0" -- "$@") || {
|
| echo "Error: failed to parse command line options."
|
| exit 1
|
| }
|
| eval set -- "${PARSED}"
|
|
|
| while true; do
|
| case "$1" in
|
| -e|--env)
|
| env_name="$2"
|
| shift 2
|
| ;;
|
| -p|--pkg_manager)
|
| pkg_manager="$2"
|
| shift 2
|
| ;;
|
| -c|--cuda-version)
|
| cuda_version="$2"
|
| shift 2
|
| ;;
|
| --)
|
| shift
|
| break
|
| ;;
|
| *)
|
| echo "Invalid option: $1" >&2
|
| exit 1
|
| ;;
|
| esac
|
| done
|
|
|
| echo "=================================================="
|
| echo " PXDesignBench Installation"
|
| echo " Environment name : ${env_name}"
|
| echo " Package manager : ${pkg_manager}"
|
| echo " CUDA version : ${cuda_version:-<not specified>}"
|
| echo "=================================================="
|
|
|
| SECONDS=0
|
|
|
|
|
|
|
|
|
|
|
|
|
| check_cuda_ge_12_1() {
|
| local ver="$1"
|
| local major="${ver%%.*}"
|
| local rest="${ver#*.}"
|
| local minor="${rest%%.*}"
|
|
|
| if (( major > 12 )); then
|
| return 0
|
| elif (( major == 12 && minor >= 1 )); then
|
| return 0
|
| else
|
| return 1
|
| fi
|
| }
|
|
|
| if [ -z "${cuda_version}" ]; then
|
| echo "Error: --cuda-version must be specified (e.g., --cuda-version 12.1)."
|
| exit 1
|
| fi
|
|
|
| if ! check_cuda_ge_12_1 "${cuda_version}"; then
|
| echo "Error: CUDA version must be >= 12.1, but got '${cuda_version}'."
|
| exit 1
|
| fi
|
|
|
|
|
|
|
| torch_tag=""
|
| torch_version="2.3.1"
|
|
|
| if [[ "${cuda_version}" == 12.1* || "${cuda_version}" == 12.2* ]]; then
|
| torch_tag="cu121"
|
| elif [[ "${cuda_version}" == 12.4* || "${cuda_version}" == 12.5* ]]; then
|
| torch_tag="cu124"
|
| else
|
| echo "Error: unsupported CUDA version '${cuda_version}' for this installer."
|
| echo " Currently supported: 12.1, 12.2 (cu121) and 12.4+ (cu124)."
|
| exit 1
|
| fi
|
|
|
|
|
|
|
|
|
|
|
| case "${pkg_manager}" in
|
| conda)
|
| if ! command -v conda >/dev/null 2>&1; then
|
| echo "Error: conda is not installed or not in PATH."
|
| exit 1
|
| fi
|
| env_tool="conda"
|
| ;;
|
| mamba)
|
| if ! command -v mamba >/dev/null 2>&1; then
|
| echo "Error: mamba is not installed or not in PATH."
|
| exit 1
|
| fi
|
| if ! command -v conda >/dev/null 2>&1; then
|
| echo "Error: mamba is installed but conda is not available."
|
| exit 1
|
| fi
|
| env_tool="mamba"
|
| ;;
|
| micromamba)
|
| if ! command -v micromamba >/dev/null 2>&1; then
|
| echo "Error: micromamba is not installed or not in PATH."
|
| exit 1
|
| fi
|
| env_tool="micromamba"
|
| ;;
|
| *)
|
| echo "Error: unsupported pkg_manager '${pkg_manager}'. Use 'conda', 'mamba', or 'micromamba'."
|
| exit 1
|
| ;;
|
| esac
|
|
|
| install_dir=$(pwd)
|
| echo "Install root : ${install_dir}"
|
|
|
|
|
|
|
|
|
|
|
| if [ "${env_tool}" = "micromamba" ]; then
|
| echo ">>> Using micromamba to manage environments"
|
|
|
|
|
| export MAMBA_ROOT_PREFIX="${MAMBA_ROOT_PREFIX:-$HOME/micromamba}"
|
|
|
|
|
| eval "$(micromamba shell hook -s bash)"
|
|
|
| echo ">>> Creating environment '${env_name}' (Python 3.11) with micromamba"
|
| micromamba create -y -n "${env_name}" python=3.11 || {
|
| echo "Error: failed to create environment ${env_name} with micromamba"
|
| exit 1
|
| }
|
|
|
| echo ">>> Activating environment '${env_name}' (micromamba)"
|
| micromamba activate "${env_name}" || {
|
| echo "Error: failed to activate environment ${env_name} with micromamba"
|
| exit 1
|
| }
|
|
|
| else
|
| echo ">>> Using ${env_tool} to manage environments"
|
|
|
| CONDA_BASE=$(conda info --base 2>/dev/null) || {
|
| echo "Error: conda is not installed or cannot be initialized."
|
| exit 1
|
| }
|
|
|
| echo "Conda base : ${CONDA_BASE}"
|
|
|
| echo ">>> Creating environment '${env_name}' (Python 3.11) with ${env_tool}"
|
| "${env_tool}" create -y -n "${env_name}" python=3.11 || {
|
| echo "Error: failed to create environment ${env_name} with ${env_tool}"
|
| exit 1
|
| }
|
|
|
| echo ">>> Activating environment '${env_name}' (${env_tool})"
|
|
|
| source "${CONDA_BASE}/bin/activate" "${env_name}" || {
|
| echo "Error: failed to activate environment ${env_name}"
|
| exit 1
|
| }
|
|
|
| if [ "${CONDA_DEFAULT_ENV:-}" != "${env_name}" ]; then
|
| echo "Error: expected environment '${env_name}' to be active, but got '${CONDA_DEFAULT_ENV:-}'."
|
| exit 1
|
| fi
|
| fi
|
|
|
| echo "Environment '${env_name}' successfully activated."
|
|
|
|
|
|
|
|
|
|
|
| echo ">>> Upgrading pip"
|
| python -m pip install --upgrade pip
|
|
|
|
|
|
|
|
|
| echo ">>> Installing PyTorch (GPU, CUDA ${cuda_version}, tag ${torch_tag})"
|
| pip install --no-cache-dir \
|
| "torch==${torch_version}" \
|
| --index-url "https://download.pytorch.org/whl/${torch_tag}" \
|
| || { echo "Error: failed to install PyTorch ${torch_version} with ${torch_tag} wheels."; exit 1; }
|
|
|
| python - << 'PYTORCH_CHECK'
|
| import torch
|
| print("PyTorch version:", torch.__version__)
|
| print("CUDA available :", torch.cuda.is_available())
|
| print("Torch CUDA :", torch.version.cuda)
|
| if torch.cuda.is_available():
|
| print("CUDA devices :", torch.cuda.device_count())
|
| PYTORCH_CHECK
|
|
|
|
|
|
|
|
|
|
|
| echo ">>> Installing Protenix"
|
| pip install --no-cache-dir "git+https://github.com/bytedance/Protenix.git@v0.5.0+pxd" \
|
| || { echo "Error: failed to install Protenix."; exit 1; }
|
|
|
| echo ">>> Installing PXDesignBench base dependencies"
|
| pip install --no-cache-dir \
|
| einops \
|
| natsort \
|
| dm-tree \
|
| posix_ipc \
|
| "transformers==4.51.3" \
|
| "dm-haiku==0.0.13" \
|
| "optax==0.2.5" \
|
| || { echo "Error: failed to install base Python dependencies."; exit 1; }
|
|
|
| echo ">>> Installing ColabDesign (without dependencies)"
|
| pip install --no-cache-dir git+https://github.com/sokrypton/ColabDesign.git --no-deps \
|
| || { echo "Error: failed to install ColabDesign."; exit 1; }
|
|
|
| echo ">>> Installing JAX with CUDA support"
|
| pip install --no-cache-dir \
|
| "jax[cuda]==0.4.29" \
|
| -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html \
|
| || { echo "Error: failed to install JAX (CUDA build)."; exit 1; }
|
|
|
|
|
| pip install --no-cache-dir \
|
| "numpy==1.26.3" \
|
| || { echo "Error: failed to install numpy 1.26.3."; exit 1; }
|
|
|
| echo ">>> Installing PXDesignBench"
|
| pip install -e .
|
|
|
|
|
|
|
|
|
|
|
| echo ">>> Running sanity checks (import tests)"
|
|
|
| python - << 'PYCODE'
|
| import sys
|
|
|
| def check(mod):
|
| try:
|
| __import__(mod)
|
| print(f"[OK] import {mod}")
|
| except Exception as e:
|
| print(f"[FAIL] import {mod}: {e}", file=sys.stderr)
|
| raise
|
|
|
| modules = [
|
| "torch",
|
| "jax",
|
| "jax.numpy",
|
| "colabdesign",
|
| "protenix",
|
| "pxdbench"
|
| ]
|
|
|
| for m in modules:
|
| check(m)
|
|
|
| import jax
|
| print("JAX devices:", jax.devices())
|
| PYCODE
|
|
|
| echo "Sanity checks completed."
|
|
|
|
|
|
|
|
|
|
|
| echo ">>> Cleaning up package manager caches"
|
|
|
| if [ "${env_tool}" = "micromamba" ]; then
|
| micromamba clean -a -y || echo "Warning: failed to clean micromamba caches."
|
| micromamba deactivate || true
|
| else
|
| "${env_tool}" clean -a -y || echo "Warning: failed to clean ${env_tool} caches."
|
| conda deactivate || true
|
| fi
|
|
|
| t=${SECONDS}
|
| echo "=================================================="
|
| echo " PXDesignBench environment setup done!"
|
| echo " Environment name : ${env_name}"
|
| echo " Package manager : ${pkg_manager}"
|
| echo " CUDA version : ${cuda_version} (torch tag: ${torch_tag})"
|
| echo
|
| echo " Activate with:"
|
| if [ "${env_tool}" = "micromamba" ]; then
|
| echo " micromamba activate ${env_name}"
|
| else
|
| echo " conda activate ${env_name}"
|
| fi
|
| echo
|
| echo " Installation time: $((t / 3600))h $(((t / 60) % 60))m $((t % 60))s"
|
| echo "=================================================="
|
|
|