sd-cli / Dockerfile.sd-cli-cu13
decntai's picture
Upload folder using huggingface_hub
2066a7d verified
Raw
History Blame Contribute Delete
4.47 kB
# Dockerfile.sd-cli-cu13 β€” arch-correct multi-arch sd-cli (CUDA 13 toolchain)
# ---------------------------------------------------------------------------
# Companion to Dockerfile.sd-cli-cu12. Same upstream repo + ref + feature flags;
# the ONLY difference between the two images is the CUDA toolkit and therefore
# the architecture list. See Dockerfile.sd-cli-cu12 for the full "why".
#
# WHY A SEPARATE CUDA 13 IMAGE
# setup.py picks the prebuilt by driver: `cu13` when the host CUDA major >= 13,
# else `cu12` (downloads/setup.py fetch_or_build_sdcli). A binary built against
# the CUDA 13 runtime needs the CUDA 13 toolchain. Blackwell boxes on a CUDA 13
# driver pull THIS one.
#
# CUDA 13 RAISED ITS ARCH FLOOR β€” the lists differ BY DESIGN.
# CUDA 13 dropped the older virtual/real arches (Maxwell sm_50/52/53, Pascal
# sm_60/61/62, and Volta sm_70). Its supported floor is Turing sm_75. So the
# cu13 list starts at 75-real (NOT 70-real like cu12) and runs up through 120:
# 75-real Turing (RTX 20xx, T4)
# 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)
# 120-real Blackwell (RTX 50xx) <-- the whole point
# 120-virtual PTX tail for compute_120 (JIT forward-compat)
# Putting 70-real here would FAIL the build (sm_70 unsupported in CUDA 13) β€”
# that is the intended divergence, not an omission. Volta/Pascal/Maxwell users
# stay on the cu12 binary, which setup.py already routes them to.
#
# VERIFY: the build prints `nvcc --list-gpu-arch` (CUDA 13) below. If cmake errors
# on an unsupported arch, reconcile CUDA_ARCHS against that printout.
# ---------------------------------------------------------------------------
# CUDA 13 devel. Keep ubuntu22.04 (glibc 2.35) for binary portability, matching
# the cu12 image. VERIFIED 2026-06-11: nvidia/cuda:13.0.1-devel-ubuntu22.04 DOES
# exist on Docker Hub, so cu13 stays on 22.04 / glibc 2.35 β€” NO elevated glibc
# floor vs cu12. (13.0.1-devel-ubuntu24.04 also exists; only fall back to it if a
# future 13.x drops the 22.04 variant β€” that would raise the binary's floor to
# glibc 2.39 on provider boxes, so note it on swap if you ever do.)
FROM nvidia/cuda:13.0.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/*
# Same locked upstream as the golden recipe and the cu12 image. Pinned to the
# leejet release TAG master-656-0e4ee04 (full SHA
# 0e4ee04488159b81d95a9ffcd983a077fd5dcb77, dated 2026-05-28) β€” a named tag,
# not a bare short hash. All four required flags (--ref-image, --llm_vision,
# vid_gen, --diffusion-fa) are present in examples/common/common.cpp at this ref.
ARG SDCPP_REPO=https://github.com/leejet/stable-diffusion.cpp
ARG SDCPP_REF=master-656-0e4ee04
# Broadest set CUDA 13 supports (floor = sm_75), ALWAYS including 120-real +
# 120-virtual. NOTE the absence of 70-real vs the cu12 list β€” intentional.
ARG CUDA_ARCHS="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
RUN echo "=== nvcc --list-gpu-arch (CUDA 13) ===" && nvcc --list-gpu-arch && \
echo "=== CMAKE_CUDA_ARCHITECTURES = ${CUDA_ARCHS} ==="
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)"
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 (cu13 fat binary) staged at /out/sd-cli"
# Flag sanity β€” GPU-FREE (see Dockerfile.sd-cli-cu12 for the full why). The build
# sandbox has no GPU, so running `/out/sd-cli --help` can error before printing and
# falsely report "missing flags". Check the binary's string table instead β€” no CUDA
# needed. The real runtime check runs WITH the GPU in build-and-validate-sd-cli.sh.
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)