File size: 4,466 Bytes
2066a7d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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)