From 6915c3091121df190e7968f0012f4b0bb187c0a7 Mon Sep 17 00:00:00 2001 From: claudio Date: Wed, 13 May 2026 23:08:10 +0200 Subject: [PATCH] build(backend): cache torch wheel + pip downloads across rebuilds Splits torch+torchvision into its own RUN layer so edits to requirements.txt don't invalidate the ~200MB CPU-only torch download. Adds buildkit cache mounts on both pip-install layers so even when a layer is invalidated (or buildkit evicts it) the wheel is reused from the on-disk pip cache instead of refetching from download.pytorch.org. Triggered by two consecutive deploy failures where pytorch.org timed out mid-download (2026-05-13 ~21:41 and possibly ~22:47). Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/Dockerfile | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 2a67133..b238c75 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,3 +1,4 @@ +# syntax=docker/dockerfile:1.7 FROM python:3.12-slim # Install system dependencies @@ -22,13 +23,23 @@ RUN apt-get update && apt-get install -y \ WORKDIR /app -# Copy requirements first for better caching +# Install PyTorch CPU-only FIRST, in its own layer, so open-clip-torch +# doesn't pull the full CUDA build (~7 GB). CPU inference is all we need +# — the heavy lifting happens through ONNX Runtime. +# +# Two cache wins here: +# 1. Its own RUN layer means edits to requirements.txt don't force a +# re-pull of the ~200MB torch wheel. +# 2. The buildkit cache mount keeps pip's download cache on disk +# across builds even when the layer itself is invalidated, so a +# torch-version bump or a builder cache eviction still reuses the +# wheel from local cache instead of re-fetching from pytorch.org. +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu + COPY requirements.txt . -# Install PyTorch CPU-only FIRST so open-clip-torch doesn't pull the full -# CUDA build (~7 GB). CPU inference is all we need — the heavy lifting -# happens through ONNX Runtime. -RUN pip install --no-cache-dir torch torchvision --index-url https://download.pytorch.org/whl/cpu \ - && pip install --no-cache-dir -r requirements.txt +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install -r requirements.txt # Copy application code COPY . .