sd-cli / Dockerfile.sd-cli-cu12
decntai's picture
Upload folder using huggingface_hub
2066a7d verified
Raw
History Blame Contribute Delete
6.03 kB
# Dockerfile.sd-cli-cu12 β€” arch-correct multi-arch sd-cli (CUDA 12.8 toolchain)
# ---------------------------------------------------------------------------
# WHY THIS EXISTS
# The prebuilt sd-cli currently shipped at /download/sd-cli-cu12 was compiled
# on CUDA 12.4 with NO CMAKE_CUDA_ARCHITECTURES, so it emits no sm_120 SASS
# and throws "no kernel image is available for execution on the device" on
# Blackwell (RTX 50-series, sm_120) cards. sd-cli powers EVERY sdcpp model
# (z-image, SD3.5, FLUX.2-klein, HiDream, WAN), so all of them are dead on
# Blackwell until this fat binary replaces it.
#
# WHAT CHANGED vs the golden recipe
# NOTHING except the architecture list. Same upstream repo, same pinned ref,
# same feature flags (-DSD_CUDA=ON -DSD_WEBM=ON -DSD_WEBP=ON). The ONLY added
# flag is -DCMAKE_CUDA_ARCHITECTURES, which makes this a strict SUPERSET of
# the current binary: it still runs on every card the old one did (Turing,
# Ampere, Ada, Hopper) AND adds Blackwell (sm_120) + a 120-virtual PTX tail
# for forward-compat JIT on future archs.
#
# ARCH LIST (CUDA 12.8 β€” broad coverage of older cards)
# 70-real Volta (V100)
# 75-real Turing (RTX 20xx, T4, GTX 16xx)
# 80-real Ampere (A100)
# 86-real Ampere (RTX 30xx, A10, A40)
# 89-real Ada (RTX 40xx, L4, L40)
# 90-real Hopper (H100, H200)
# 100-real Blackwell DC (B100/B200, GB100)
# 120-real Blackwell (RTX 50xx, GB202) <-- the whole point
# 120-virtual PTX tail for compute_120 (JIT forward-compat)
# The "-real" suffix bakes SASS cubins; "-virtual" bakes PTX. CUDA 12.8 is the
# first toolkit that supports sm_100 + sm_120, so 12.8.x is the FLOOR for this
# image β€” do not downgrade the base.
#
# VERIFY THE LIST: the build prints `nvcc --list-gpu-arch` below. If cmake errors
# with "unsupported gpu architecture", reconcile CUDA_ARCHS against that printout
# (a listed-but-unsupported arch fails the build β€” that is the guard, by design).
#
# This image is NOT shipped. The operator builds it, extracts /out/sd-cli, and
# (after Blackwell validation + Ada/Ampere regression) scp's the binary to the
# VPS. See docs/build/build-and-validate-sd-cli.sh.
# ---------------------------------------------------------------------------
# CUDA 12.8 devel (toolchain + headers). 22.04 base β†’ glibc 2.35 floor, which
# keeps the extracted binary portable across the varied provider boxes that pull
# it. Bump the patch tag (12.8.x) only to another tag that exists on Docker Hub.
# Tag VERIFIED present on Docker Hub 2026-06-11 (nvidia/cuda registry).
FROM nvidia/cuda:12.8.1-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
git cmake build-essential binutils ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# --- Identical upstream source to the golden recipe ------------------------
# Repo + ref are LOCKED to what docs/golden-provider-image.md validated. These
# pin the feature set (--ref-image, --llm_vision, vid_gen, --diffusion-fa) that
# image-edit + video depend on. DO NOT change the repo or ref to "add arches" β€”
# arches are added purely via CMAKE_CUDA_ARCHITECTURES below.
ARG SDCPP_REPO=https://github.com/leejet/stable-diffusion.cpp
# Pinned to the leejet release TAG master-656-0e4ee04 (full SHA
# 0e4ee04488159b81d95a9ffcd983a077fd5dcb77, dated 2026-05-28). A named release
# tag is preferred over a bare 7-char short hash: immutable, unambiguous as the
# repo grows, and self-documenting. This is the SAME commit the golden recipe
# validated β€” all four required flags (--ref-image, --llm_vision, vid_gen,
# --diffusion-fa) are registered in examples/common/common.cpp at this ref, so
# the build carries them. See docs/golden-provider-image.md (SOURCE OF TRUTH).
ARG SDCPP_REF=master-656-0e4ee04
# Broadest set CUDA 12.8 supports, ALWAYS including 120-real + 120-virtual.
ARG CUDA_ARCHS="70-real;75-real;80-real;86-real;89-real;90-real;100-real;120-real;120-virtual"
WORKDIR /opt
RUN git clone "${SDCPP_REPO}" sdcpp \
&& cd sdcpp \
&& git checkout "${SDCPP_REF}" \
&& git submodule update --init --recursive
WORKDIR /opt/sdcpp
# Print the toolkit's ground-truth arch list for operator verification. The
# build log will show this right before configure; cross-check CUDA_ARCHS here.
RUN echo "=== nvcc --list-gpu-arch (CUDA 12.8) ===" && nvcc --list-gpu-arch && \
echo "=== CMAKE_CUDA_ARCHITECTURES = ${CUDA_ARCHS} ==="
# IDENTICAL cmake flags to the golden recipe + the one functional add:
# -DCMAKE_CUDA_ARCHITECTURES. ggml (sd.cpp's CUDA backend) honors the standard
# CMAKE_CUDA_ARCHITECTURES var; if a future ggml bump ignores it, the fallback
# is -DGGML_CUDA_ARCHITECTURES with the same value.
RUN cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DSD_CUDA=ON -DSD_WEBM=ON -DSD_WEBP=ON \
-DCMAKE_CUDA_ARCHITECTURES="${CUDA_ARCHS}" \
&& cmake --build build --config Release --target sd-cli -j"$(nproc)"
# Park the binary at a known path for `docker create` + `docker cp` extraction.
RUN mkdir -p /out \
&& cp "$(find build -name sd-cli -type f -perm -u+x | head -n1)" /out/sd-cli \
&& chmod 755 /out/sd-cli \
&& echo "sd-cli (cu12 fat binary) staged at /out/sd-cli"
# Flag sanity β€” GPU-FREE. Do NOT run the binary here. The docker BUILD sandbox has
# no GPU: libcuda is only present at `docker run --gpus`, so `/out/sd-cli --help`
# can fail to init the CUDA backend and error out BEFORE printing its flags β€” which
# would falsely trip "missing flags" on a perfectly good build. Instead, confirm the
# flag literals are baked into the binary's string table; `strings` needs no CUDA.
# The real runtime check (--help + a generation) runs WITH the GPU in
# build-and-validate-sd-cli.sh, the only place the binary can actually execute.
RUN strings /out/sd-cli | grep -E -- '--ref-image|--llm_vision|vid_gen|--diffusion-fa' \
|| (echo "BUILD MISSING REQUIRED FLAG LITERALS β€” wrong ref?" && exit 1)