CI and images / lint (push) Successful in 3s
CI and images / extension-version (push) Successful in 3s
extension / lint (push) Successful in 16s
CI and images / frontend-build (push) Successful in 19s
CI and images / backend-lint-and-test (push) Successful in 31s
CI and images / integration (push) Successful in 2m22s
CI and images / sign-extension (push) Successful in 3s
CI and images / build-web (push) Successful in 3m7s
CI and images / smoke-web (push) Successful in 59s
CI and images / build-agent (push) Successful in 6m41s
CI and images / promote (push) Successful in 2s
Agent: - The image ran PyPI's CUDA-13 torch 2.14 and onnxruntime-gpu 1.30 on a CUDA 12.9 cudnn-runtime base. requirements.txt had silently replaced the Dockerfile's torch 2.6+cu124, because ultralytics pulls torchvision, which pulls its own torch. That left ~3 GB of base libraries and a ~3 GB torch nothing loaded: 10 GB compressed. - Now: an nvidia/cuda 13.0.3 `base` image, with torch and torchvision installed together from cu130. CUDA and cuDNN come from the nvidia-* pip packages; onnxruntime-gpu declares its [cuda,cudnn] extras. - fc_agent/accel.py preloads those libraries for onnxruntime. It then logs, and reports in /status, whether torch and the ONNX CUDA provider actually got the GPU, since both fall back to the CPU silently. Web image: - Drop opencv-python-headless and onnxruntime, plus the opencv-only apt libs. Both have been listed since the scaffold and nothing in backend/ imports them. - torch/torchvision move to 2.14/0.29, and the unexplained caps are lifted (rule 154). Redis: 8-alpine in both compose files and both CI service containers. That gives an AGPLv3 licence option, where 7.4 was RSAL/SSPL only. The client moves to >=8.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
64 lines
3.2 KiB
Docker
64 lines
3.2 KiB
Docker
# FabledCurator GPU agent — runs on the desktop with the GPU.
|
|
#
|
|
# The `base` flavour, not `cudnn-runtime`: CUDA and cuDNN arrive as the
|
|
# `nvidia-*` pip packages torch and onnxruntime-gpu depend on, so the base only
|
|
# has to hand the container the driver (it sets NVIDIA_VISIBLE_DEVICES /
|
|
# NVIDIA_DRIVER_CAPABILITIES for the Container Toolkit). Until #1451 this was
|
|
# `12.9.2-cudnn-runtime` under a `torch==2.6.0+cu124` — and requirements.txt then
|
|
# REPLACED that torch with PyPI's CUDA-13 build (ultralytics pulls torchvision,
|
|
# which pulls its matching torch), beside a CUDA-13 onnxruntime-gpu. The image
|
|
# ran CUDA 13 on a CUDA-12 base, carrying ~3 GB of base libraries and a ~3 GB
|
|
# torch nothing loaded: 10 GB compressed.
|
|
#
|
|
# 13.0 because that is the line both wheels are built for (torch's cu130 index,
|
|
# onnxruntime-gpu's `nvidia-cuda-runtime~=13.0`). Needs an NVIDIA driver that
|
|
# supports CUDA 13 (580+); fc_agent/accel.py logs at startup whether torch and
|
|
# onnxruntime actually got the GPU, since both fall back to the CPU silently.
|
|
# ffmpeg for video frames. Ubuntu 24.04 → Python 3.12.
|
|
FROM nvidia/cuda:13.0.3-base-ubuntu24.04
|
|
|
|
# PIP_BREAK_SYSTEM_PACKAGES: Ubuntu 24.04 marks its system Python as externally
|
|
# managed (PEP 668), so a global `pip install` errors without this. It's a
|
|
# single-purpose container — we own the whole environment, so installing into
|
|
# the system site-packages is fine (and simplest — no venv on PATH to manage).
|
|
ENV DEBIAN_FRONTEND=noninteractive PYTHONUNBUFFERED=1 PIP_BREAK_SYSTEM_PACKAGES=1
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends python3 python3-pip ffmpeg \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
# torch AND torchvision from the cu130 index, together and first. Installing
|
|
# torch alone is what let the next step swap it out: ultralytics needs
|
|
# torchvision, PyPI's torchvision pins its own torch, and pip replaced ours to
|
|
# match. With both present, requirements.txt finds them satisfied.
|
|
RUN pip3 install --no-cache-dir --index-url https://download.pytorch.org/whl/cu130 \
|
|
torch torchvision
|
|
COPY requirements.txt .
|
|
RUN pip3 install --no-cache-dir -r requirements.txt
|
|
COPY fc_agent ./fc_agent
|
|
|
|
# imgutils ONNX models + the transformers SigLIP weights both cache here; mount
|
|
# a volume to persist them across restarts (the SigLIP download is ~3.5 GB once).
|
|
ENV HF_HOME=/models
|
|
|
|
# Declared LAST on purpose, exactly as the web Dockerfile does: an ARG/ENV
|
|
# invalidates every layer below it, and these are the only values that differ
|
|
# between builds of otherwise identical source. Any earlier and the ~6.3 GB
|
|
# CUDA + torch layers could never be shared between the dev and main builds of
|
|
# one commit — which is the cost #3114 measured at 9m26s cold.
|
|
#
|
|
# Three values, never folded together (rule 149) — the NAME a person reads, the
|
|
# CHANNEL it came from, and the REVISION that identifies the content. See
|
|
# fc_agent/build_info.py; CI derives all three from scripts/artifacts.sh.
|
|
ARG FC_CHANNEL=""
|
|
ENV FC_CHANNEL=${FC_CHANNEL}
|
|
ARG FC_VERSION=""
|
|
ENV FC_VERSION=${FC_VERSION}
|
|
ARG FC_REVISION=""
|
|
ENV FC_REVISION=${FC_REVISION}
|
|
|
|
EXPOSE 8770
|
|
|
|
# The control UI; the worker is started from it (or POST /start).
|
|
CMD ["uvicorn", "fc_agent.app:app", "--host", "0.0.0.0", "--port", "8770"]
|