FROM nvidia/cuda:12.1.1-devel-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive ENV PYTHONUNBUFFERED=1 ENV OMP_NUM_THREADS=1 ENV PYTORCH_ALLOC_CONF=expandable_segments:True,max_split_size_mb=128 ENV ENABLE_CUDNN_BENCHMARK=true ENV ENABLE_TORCH_COMPILE=false ENV INFERENCE_TIMEOUT=1800 ENV MAX_GRADIO_CONCURRENCY=1 ENV TORCH_CUDA_ARCH_LIST=8.9 ENV CUDA_HOME=/usr/local/cuda ENV MPLCONFIGDIR=/tmp/matplotlib # Cap CUDA-extension build parallelism. mamba_ssm hardcodes 8+ GPU arches # in setup.py (sm_53..sm_90) which makes the build both memory-heavy AND # wall-clock heavy on HF Spaces (~16 GB RAM, ~60 min build cap). # We further patch mamba_ssm below to compile for only sm_89 (L40S target), # so MAX_JOBS=2 is now safe and ~6x faster than the all-arch serial build. ENV MAX_JOBS=2 ENV NVCC_THREADS=2 RUN apt-get update && apt-get install -y \ python3.10 \ python3.10-venv \ python3-pip \ git \ build-essential \ ninja-build \ libgl1 \ libglib2.0-0 \ && rm -rf /var/lib/apt/lists/* RUN nvcc --version ENV VENV=/opt/venv RUN python3.10 -m venv $VENV ENV PATH="$VENV/bin:$PATH" RUN pip install --upgrade pip wheel setuptools packaging ninja RUN pip install --index-url https://download.pytorch.org/whl/cu121 \ torch torchvision torchaudio WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # Download mamba-ssm source, patch its hardcoded cc_flag list to only build # for sm_89 (L40S / Ada / RTX 40-series), then install. This avoids HF # Spaces 60-minute build timeouts when compiling for all 8+ archs serially. COPY scripts/patch_mamba_ssm.py /tmp/patch_mamba_ssm.py RUN set -eux; \ pip download "mamba-ssm>=2.2.2" --no-deps --no-binary=:all: -d /tmp/mamba-src; \ cd /tmp/mamba-src; \ SDIST=$(ls mamba_ssm*.tar.gz mamba-ssm*.tar.gz 2>/dev/null | head -1); \ tar -xzf "$SDIST"; \ SRCDIR=$(tar -tzf "$SDIST" | head -1 | sed 's:/.*::'); \ cd "$SRCDIR"; \ python /tmp/patch_mamba_ssm.py setup.py; \ pip install . --no-build-isolation -v RUN python - <<'PY' import torch, sys print("Torch:", torch.__version__, "CUDA:", torch.version.cuda, "Avail:", torch.cuda.is_available()) PY RUN python - <<'PY' import os setup_path = 'SRMA-Mamba/selective_scan/setup.py' with open(setup_path, 'r') as f: content = f.read() old_func = '''def get_compute_capability(): device = torch.device("cuda") capability = torch.cuda.get_device_capability(device) return int(str(capability[0]) + str(capability[1]))''' new_func = '''def get_compute_capability(): if not torch.cuda.is_available(): arch_list = os.getenv("TORCH_CUDA_ARCH_LIST", "8.9") arch = arch_list.split(";")[0].split(",")[0].strip() if "." in arch: major, minor = arch.split(".") return int(major + minor) else: return int(arch) device = torch.device("cuda") capability = torch.cuda.get_device_capability(device) return int(str(capability[0]) + str(capability[1]))''' if old_func in content: content = content.replace(old_func, new_func) with open(setup_path, 'w') as f: f.write(content) print("Patched setup.py to use TORCH_CUDA_ARCH_LIST when CUDA not available") else: print("WARNING: Could not find function to patch") PY RUN cd SRMA-Mamba/selective_scan && pip install --no-build-isolation -e . -v RUN python - <<'PY' import torch, sys print("Torch:", torch.__version__, "CUDA:", torch.version.cuda, "Avail:", torch.cuda.is_available()) import mamba_ssm print("mamba_ssm OK:", mamba_ssm.__file__) import selective_scan_cuda_oflex as s print("selective_scan_cuda_oflex OK:", s.__file__) print("All CUDA extensions verified successfully.") PY EXPOSE 7860 ENV APP_FILE=app.py CMD ["sh", "-c", "exec python ${APP_FILE}"]