FROM python:3.11-slim # System deps RUN apt-get update && apt-get install -y \ libgl1 libglib2.0-0 libsm6 libxext6 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # ── CPU-only torch (saves ~4 GB vs the CUDA wheel) ─────────────────────────── RUN pip install --no-cache-dir \ torch==2.3.0 \ --index-url https://download.pytorch.org/whl/cpu # ── Explorer deps ───────────────────────────────────────────────────────────── RUN pip install --no-cache-dir \ bokeh==3.4.3 \ numpy \ opencv-python-headless \ pillow \ matplotlib \ huggingface_hub \ transformers \ google-genai \ h5py \ timm \ overcomplete \ nilearn \ nibabel \ scipy # ── Pre-download models so first use is instant ───────────────── RUN python -c "\ from transformers import CLIPModel, CLIPProcessor; \ CLIPModel.from_pretrained('openai/clip-vit-large-patch14'); \ CLIPProcessor.from_pretrained('openai/clip-vit-large-patch14')" RUN python -c "\ import torch; \ torch.hub.load('facebookresearch/dinov2', 'dinov2_vitb14', pretrained=True)" # ── Explorer code ───────────────────────────────────────────────────────────── COPY scripts/explorer/ /app/scripts/explorer/ COPY scripts/dynadiff_loader.py /app/scripts/dynadiff_loader.py COPY src/clip_utils.py /app/src/clip_utils.py COPY src/backbone_runners.py /app/src/backbone_runners.py COPY src/precompute_utils.py /app/src/precompute_utils.py COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh EXPOSE 7860 CMD ["/app/entrypoint.sh"]