Spaces:
Sleeping
Sleeping
| # ============================================================================ | |
| # LOCAL DEVELOPMENT SETUP SCRIPT | |
| # ============================================================================ | |
| # This script is for LOCAL DEVELOPMENT ONLY. | |
| # | |
| # For HuggingFace Spaces deployment: | |
| # - The Dockerfile handles all environment setup during image build | |
| # - This script is NOT used in Docker Spaces | |
| # - Use this script only when testing locally outside Docker | |
| # | |
| # Usage (local development): | |
| # bash setup.sh | |
| # ============================================================================ | |
| set -e | |
| echo "===== Multi-Environment Setup (LOCAL DEVELOPMENT ONLY) =====" | |
| echo "⚠️ NOTE: This script is for local development only." | |
| echo " For Docker Spaces, environment setup is handled by Dockerfile." | |
| echo "" | |
| echo "Building OpenPI environment (OpenVLA temporarily disabled)..." | |
| # Install build dependencies first (bazel for labmaze, Rust for safetensors) | |
| echo "" | |
| echo "===== Installing Build Dependencies =====" | |
| # Install bazel (required for labmaze) | |
| # Use bazelisk with Bazel 7.x for labmaze compatibility (Bazel 8.x has issues) | |
| if ! command -v bazel &> /dev/null; then | |
| echo "Installing bazelisk (Bazel wrapper)..." | |
| BAZELISK_VERSION="v1.19.0" | |
| BAZELISK_URL="https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-amd64" | |
| mkdir -p ~/.local/bin | |
| wget -q ${BAZELISK_URL} -O ~/.local/bin/bazel | |
| chmod +x ~/.local/bin/bazel | |
| export PATH="${HOME}/.local/bin:${PATH}" | |
| # Use Bazel 7.5.0 for labmaze compatibility | |
| export USE_BAZEL_VERSION=7.5.0 | |
| echo "✓ Bazelisk installed (will use Bazel 7.5.0)" | |
| else | |
| echo "✓ Bazel already installed" | |
| # Still set version for consistency | |
| export USE_BAZEL_VERSION=7.5.0 | |
| fi | |
| # Install Rust (required for safetensors) | |
| if ! command -v rustc &> /dev/null; then | |
| echo "Installing Rust..." | |
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y | |
| source ${HOME}/.cargo/env | |
| export PATH="${HOME}/.cargo/bin:${PATH}" | |
| echo "✓ Rust installed" | |
| else | |
| echo "✓ Rust already installed" | |
| # Make sure cargo is in PATH | |
| if [ -f "${HOME}/.cargo/env" ]; then | |
| source ${HOME}/.cargo/env | |
| fi | |
| fi | |
| # Try to install via apt-get if available (for additional build tools) | |
| if command -v apt-get &> /dev/null && [ "$EUID" -eq 0 ]; then | |
| echo "Installing additional build tools via apt-get..." | |
| apt-get update -qq | |
| apt-get install -y -qq \ | |
| build-essential \ | |
| g++ \ | |
| gcc \ | |
| make \ | |
| cmake \ | |
| pkg-config \ | |
| || echo "Warning: Some build tools may not be available" | |
| echo "✓ Additional build tools installed" | |
| else | |
| echo "⚠️ Skipping apt-get installation (not root or not available)" | |
| fi | |
| # Check if conda is installed, install if not | |
| if ! command -v conda &> /dev/null; then | |
| echo "" | |
| echo "===== Installing Miniconda =====" | |
| echo "Conda not found. Installing Miniconda..." | |
| # Download and install Miniconda | |
| MINICONDA_INSTALLER="/tmp/miniconda.sh" | |
| MINICONDA_PREFIX="${HOME}/miniconda3" | |
| wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ${MINICONDA_INSTALLER} | |
| bash ${MINICONDA_INSTALLER} -b -p ${MINICONDA_PREFIX} | |
| rm ${MINICONDA_INSTALLER} | |
| # Initialize conda | |
| ${MINICONDA_PREFIX}/bin/conda init bash | |
| source ${MINICONDA_PREFIX}/etc/profile.d/conda.sh | |
| # Add conda to PATH for this script | |
| export PATH="${MINICONDA_PREFIX}/bin:${PATH}" | |
| # Accept conda Terms of Service | |
| echo "Accepting conda Terms of Service..." | |
| ${MINICONDA_PREFIX}/bin/conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main || true | |
| ${MINICONDA_PREFIX}/bin/conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r || true | |
| echo "✓ Miniconda installed at ${MINICONDA_PREFIX}" | |
| else | |
| echo "✓ Conda already installed" | |
| # Initialize conda if not already done | |
| if [ -f "${HOME}/miniconda3/etc/profile.d/conda.sh" ]; then | |
| source ${HOME}/miniconda3/etc/profile.d/conda.sh | |
| # Accept TOS if using miniconda | |
| conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main 2>/dev/null || true | |
| conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r 2>/dev/null || true | |
| elif [ -f "/opt/conda/etc/profile.d/conda.sh" ]; then | |
| source /opt/conda/etc/profile.d/conda.sh | |
| # Accept TOS if using system conda | |
| conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main 2>/dev/null || true | |
| conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r 2>/dev/null || true | |
| fi | |
| fi | |
| # Install RoboEval in base (shared by both) | |
| echo "" | |
| echo "===== Installing RoboEval (shared) =====" | |
| CLONE_DIR="/tmp/roboeval_install" | |
| rm -rf $CLONE_DIR | |
| # Clone with submodules | |
| echo "Cloning RoboEval repository with submodules..." | |
| git clone --recurse-submodules https://${GH_TOKEN}@github.com/helen9975/RoboEval.git $CLONE_DIR | |
| # Install RoboEval (this will build labmaze which requires bazel) | |
| echo "Installing RoboEval from cloned repository..." | |
| echo "Note: This may take several minutes as it builds labmaze with bazel..." | |
| # Set environment variables for building | |
| # PyO3 compatibility for Python 3.13 (safetensors) | |
| export PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1 | |
| # Use older bazel version for labmaze compatibility (Bazel 7.x works better) | |
| export USE_BAZEL_VERSION=7.5.0 | |
| # Install RoboEval | |
| pip install $CLONE_DIR --no-cache-dir || { | |
| echo "⚠️ RoboEval installation had some errors, but continuing..." | |
| echo "Some optional dependencies may not be available" | |
| echo "Trying to install pre-built safetensors wheel..." | |
| # Try to install safetensors from pre-built wheel | |
| pip install safetensors --only-binary :all: || pip install "safetensors>=0.4.1" --no-build-isolation || true | |
| } | |
| SITE_PACKAGES=$(python -c "import site; print(site.getsitepackages()[0])") | |
| cp -r $CLONE_DIR/thirdparty $SITE_PACKAGES/ | |
| echo "RoboEval installed in base environment" | |
| # Create OpenPI environment | |
| echo "" | |
| echo "===== Creating OpenPI Environment =====" | |
| # Use Python 3.12 instead of 3.10 to avoid PyO3 compatibility issues | |
| # Python 3.12 is the latest supported by PyO3 (for safetensors) | |
| conda create -n openpi_env python=3.12 -y | |
| conda run -n openpi_env pip install -r requirements_openpi.txt --no-cache-dir | |
| # Install lerobot and OpenPI in openpi_env | |
| echo "Installing lerobot in openpi_env..." | |
| conda run -n openpi_env pip install git+https://github.com/huggingface/lerobot@0cf864870cf29f4738d3ade893e6fd13fbd7cdb5 --no-cache-dir | |
| echo "lerobot installed successfully" | |
| echo "Installing safetensors in openpi_env..." | |
| # Python 3.12 should work fine with safetensors, but use pre-built wheel if available | |
| conda run -n openpi_env pip install "safetensors>=0.4.1" --only-binary :all: --no-cache-dir || { | |
| echo "⚠️ Pre-built wheel not available, trying to build from source..." | |
| # Set PyO3 compatibility flag just in case | |
| conda run -n openpi_env bash -c "export PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1 && pip install 'safetensors>=0.4.1' --no-cache-dir" || { | |
| echo "⚠️ safetensors build failed, will try again later or install manually" | |
| } | |
| } | |
| echo "safetensors installed successfully" | |
| echo "Installing openpi-client in openpi_env..." | |
| conda run -n openpi_env pip install git+https://${GH_TOKEN}@github.com/tan7271/OpenPiRoboEval.git#subdirectory=packages/openpi-client --no-cache-dir --no-deps | |
| echo "openpi-client installed successfully" | |
| echo "Installing OpenPI in openpi_env..." | |
| conda run -n openpi_env pip install git+https://${GH_TOKEN}@github.com/tan7271/OpenPiRoboEval.git --no-cache-dir --no-deps --force-reinstall | |
| echo "OpenPI installed successfully" | |
| # Copy RoboEval to openpi_env | |
| OPENPI_SITE=$(conda run -n openpi_env python -c "import site; print(site.getsitepackages()[0])") | |
| cp -r $SITE_PACKAGES/roboeval* $OPENPI_SITE/ || true | |
| cp -r $SITE_PACKAGES/thirdparty $OPENPI_SITE/ || true | |
| echo "OpenPI environment ready" | |
| # Create OpenVLA environment (TEMPORARILY DISABLED - uncomment to enable) | |
| # echo "" | |
| # echo "===== Creating OpenVLA Environment =====" | |
| # conda create -n openvla_env python=3.10 -y | |
| # | |
| # # OpenVLA requires older PyTorch versions | |
| # echo "Installing OpenVLA-compatible PyTorch in openvla_env..." | |
| # conda run -n openvla_env pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu121 --no-cache-dir | |
| # echo "PyTorch installed successfully" | |
| # | |
| # echo "Installing OpenVLA dependencies in openvla_env..." | |
| # conda run -n openvla_env pip install -r requirements_openvla.txt --no-cache-dir | |
| # echo "Dependencies installed successfully" | |
| # | |
| # # Install OpenVLA from GitHub | |
| # echo "Installing OpenVLA from openvla/openvla..." | |
| # conda run -n openvla_env pip install git+https://github.com/openvla/openvla.git --no-cache-dir | |
| # echo "OpenVLA installed successfully" | |
| # | |
| # # Copy RoboEval to openvla_env | |
| # OPENVLA_SITE=$(conda run -n openvla_env python -c "import site; print(site.getsitepackages()[0])") | |
| # cp -r $SITE_PACKAGES/roboeval* $OPENVLA_SITE/ || true | |
| # cp -r $SITE_PACKAGES/thirdparty $OPENVLA_SITE/ || true | |
| # echo "OpenVLA environment ready" | |
| echo "" | |
| echo "===== Setup Complete =====" | |
| echo "✓ Base environment: Gradio + RoboEval" | |
| echo "✓ openpi_env: PyTorch 2.7+ + OpenPI" | |
| echo "ℹ openvla_env: Disabled (uncomment in setup.sh to enable)" | |