Dockerfile 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. # syntax=docker/dockerfile:1.7
  2. # GLM-5.3-Flash r27 (jovian-judgement, qualified 2026-09-06) — GB10/Spark build.
  3. #
  4. # Clone-at-pin build, NO staged tarballs: the Dockerfile clones every source
  5. # at the pins in versions.env and gates each one (HEAD commit + tree hash).
  6. # A fresh clone of this repo + `bash build.sh` reproduces this image end to
  7. # end. Source contract: local-inference-lab/rtx6kpro master
  8. # models/glm-5.3-flash/build/glm53-jovian-judgement-community-20260906-r27.source.lock
  9. # (vLLM 63a82f8d / tree f54cd9ca, B12X e8ad299b / f3cd8a9e [includes
  10. # comm.roce RoCEnante, PR #295 + follow-ups — see state doc], LMCache
  11. # 822330db / 008ac3e0, FlashKDA 3b225bf2; merge order documented in vLLM
  12. # issue 651).
  13. #
  14. # Runtime: CUDA 13.2 devel aarch64 base + torch 2.13.0 cu130 + flashinfer
  15. # 0.6.17 — the same pins the r27 tree's requirements/cuda.txt asks for,
  16. # proven on GB10 (deviation from their RTX-PRO-6000 cu133 runtime documented
  17. # in versions.env). GB10 sm_121 fixes baked in (patch_cuda_sm12x.py, eugr
  18. # patch set). LMCache wheel + cuMem interposer built from the locked source
  19. # in-container (engine-driven cache transfers sidecar for vram/native/lmcache
  20. # cache modes).
  21. #
  22. # Build: cd docker-images/glm53-jovian-r27 && TAG=... bash build.sh
  23. ARG CUDA_BASE_IMAGE
  24. ARG CUDA_BASE_DIGEST
  25. ARG UV_VERSION
  26. FROM ${CUDA_BASE_IMAGE}@${CUDA_BASE_DIGEST} AS apt-base
  27. ARG PYPI_INDEX_URL
  28. ENV DEBIAN_FRONTEND=noninteractive \
  29. PIP_BREAK_SYSTEM_PACKAGES=1 \
  30. UV_SYSTEM_PYTHON=1 UV_BREAK_SYSTEM_PACKAGES=1 UV_LINK_MODE=copy
  31. COPY locks/apt-sources.list /tmp/apt-sources.list
  32. COPY locks/apt-packages.txt /tmp/apt-packages.txt
  33. COPY locks/python-bootstrap.txt /tmp/python-bootstrap.txt
  34. RUN rm -f /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d/*.sources \
  35. && cp /tmp/apt-sources.list /etc/apt/sources.list \
  36. && apt-get update \
  37. && grep -vE '^\s*(#|$)' /tmp/apt-packages.txt \
  38. | xargs apt-get install -y --no-install-recommends \
  39. && rm -rf /var/lib/apt/lists/* \
  40. && python3 -m pip install --no-cache-dir --no-deps \
  41. -r /tmp/python-bootstrap.txt --index-url ${PYPI_INDEX_URL}
  42. FROM apt-base AS torch-base
  43. ARG PYPI_INDEX_URL
  44. ARG PYTORCH_INDEX_URL
  45. ARG TORCH_VERSION TORCHVISION_VERSION TORCHAUDIO_VERSION
  46. ARG FLASHINFER_VERSION
  47. RUN --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
  48. uv pip install \
  49. --index-url ${PYPI_INDEX_URL} \
  50. --extra-index-url ${PYTORCH_INDEX_URL} \
  51. --index-strategy unsafe-best-match \
  52. "torch==${TORCH_VERSION}" \
  53. "torchvision==${TORCHVISION_VERSION}" \
  54. "torchaudio==${TORCHAUDIO_VERSION}" \
  55. "flashinfer-python==${FLASHINFER_VERSION}"
  56. # DeepGEMM: cloned in-build (proven to work on the nodes via git; pins are
  57. # gated again in fetch-deps.sh against the vLLM tree's own declaration).
  58. FROM torch-base AS deepgemm-builder
  59. ARG DEEPGEMM_REPO DEEPGEMM_BRANCH DEEPGEMM_REF
  60. RUN set -eux; \
  61. git config --global protocol.version 0; \
  62. git clone --branch ${DEEPGEMM_BRANCH} ${DEEPGEMM_REPO} /deps/deepgemm; \
  63. cd /deps/deepgemm; \
  64. git checkout ${DEEPGEMM_REF}; \
  65. git submodule update --init --depth 1 -- third-party/cutlass third-party/fmt
  66. # ---- vLLM @ r27 integration branch, gated by commit + tree hash ----
  67. FROM torch-base AS vllm-clone
  68. ARG VLLM_REPO VLLM_PIN VLLM_TREE
  69. RUN set -eux; \
  70. git config --global protocol.version 0; \
  71. git init -q /workspace/vllm; \
  72. git -C /workspace/vllm fetch -q --depth 1 ${VLLM_REPO} ${VLLM_PIN}; \
  73. git -C /workspace/vllm checkout -q FETCH_HEAD; \
  74. cd /workspace/vllm; \
  75. test "$(git rev-parse HEAD)" = "${VLLM_PIN}"; \
  76. test "$(git rev-parse HEAD^{tree})" = "${VLLM_TREE}"; \
  77. git config --global --add safe.directory /workspace/vllm
  78. # ---- All build sub-deps, cloned at pins the r27 tree itself declares ----
  79. FROM vllm-clone AS deps-fetched
  80. COPY fetch-deps.sh /tmp/fetch-deps.sh
  81. RUN bash /tmp/fetch-deps.sh
  82. FROM deps-fetched AS vllm-builder
  83. WORKDIR /workspace/vllm
  84. # Hard-declared (do NOT rely on stage-inherited ENVs): the buildkit build
  85. # has no GPU, so torch's device-capability autodetect is unavailable and
  86. # the wheel must be told the target arch explicitly (the r27 slip: kernels
  87. # came out sm120-only -> cudaErrorNoKernelImageForDevice at boot).
  88. ENV TORCH_CUDA_ARCH_LIST=12.1a GIT_PROTOCOL=0
  89. ARG DEEPGEMM_REF
  90. ARG VLLM_PRETEND_VERSION
  91. ARG SOURCE_DATE_EPOCH
  92. ARG BUILD_JOBS
  93. # eugr/spark-vllm-docker build-time patches (main, 2026-09-02): all are
  94. # source-aware/idempotent (skip when the vulnerable pattern is absent), so
  95. # running the full set is safe on the r27 tree. Env gates are opt-in and ON
  96. # for this build (sm_121a + b12x):
  97. # - preserve_sm12x_target: keep 12.1a in CUDA_SUPPORTED_ARCHS (their
  98. # standard CUDA build collapses 12.1a -> 12.0)
  99. # - sm120_cooperative_topk: keep SM90-only (Spark fix)
  100. # - mrv2_speculator_cudagraph_pool / spark_kv_cache_cleanup (UMA snapshot
  101. # flow) / b12x c128a alignment / flashinfer b12x swigluoai / routed
  102. # expert weight shape / topk_softplus_sqrt / others: see each script.
  103. COPY patches-eugr/patch_vllm_*.py /tmp/eugr-patches/
  104. COPY --from=deepgemm-builder /deps/deepgemm /deps/deepgemm
  105. RUN VLLM_PRESERVE_SM12X_TARGET=1 \
  106. VLLM_PATCH_B12X_C128A_ALIGNMENT=1 \
  107. python3 /tmp/eugr-patches/patch_vllm_mrv2_speculator_cudagraph_pool.py . \
  108. && python3 /tmp/eugr-patches/patch_vllm_b12x_c128a_topk_alignment.py . \
  109. && python3 /tmp/eugr-patches/patch_vllm_flashinfer_b12x_swigluoai.py . \
  110. && python3 /tmp/eugr-patches/patch_vllm_topk_softplus_sqrt_control_flow.py . \
  111. && python3 /tmp/eugr-patches/patch_vllm_preserve_sm12x_target.py . \
  112. && python3 /tmp/eugr-patches/patch_vllm_diffusion_tensor_causal.py . \
  113. && python3 /tmp/eugr-patches/patch_vllm_gemma4_mtp_embedding_share.py . \
  114. && python3 /tmp/eugr-patches/patch_vllm_sm120_cooperative_topk.py . \
  115. && python3 /tmp/eugr-patches/patch_vllm_autogptq_symmetric_moe_qzeros.py . \
  116. && python3 /tmp/eugr-patches/patch_vllm_disable_minimax_qk_rmsnorm_ipc.py . \
  117. && python3 /tmp/eugr-patches/patch_vllm_routed_experts_weight_shape.py . \
  118. && python3 /tmp/eugr-patches/patch_vllm_spark_kv_cache_cleanup.py .
  119. RUN --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
  120. --mount=type=cache,id=ccache,target=/root/.ccache \
  121. --mount=type=cache,id=cargo-registry,target=/root/.cargo/registry \
  122. --mount=type=cache,id=rust-target,target=/workspace/vllm/vllm/target \
  123. git config --global protocol.version 0 \
  124. && uv pip install setuptools-rust setuptools-scm \
  125. && (command -v cargo >/dev/null 2>&1 || curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --no-modify-path) \
  126. && export PATH=/root/.cargo/bin:$PATH \
  127. && (command -v protoc >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y --no-install-recommends protobuf-compiler libprotobuf-dev >/dev/null && rm -rf /var/lib/apt/lists/*)) \
  128. && _j="${BUILD_JOBS:-$(nproc)}" \
  129. && export GIT_PROTOCOL=0 MAX_JOBS="${_j}" CMAKE_BUILD_PARALLEL_LEVEL="${_j}" \
  130. VLLM_REQUIRE_RUST_FRONTEND=1 CARGO_BUILD_JOBS="${_j}" \
  131. SETUPTOOLS_SCM_PRETEND_VERSION="${VLLM_PRETEND_VERSION}" \
  132. TRITON_KERNELS_SRC_DIR=/deps2/triton_kernels \
  133. FMHA_SM100_SRC_DIR=/deps2/MSA \
  134. FLASH_MLA_SRC_DIR=/deps2/FlashMLA \
  135. FLASH_KDA_SRC_DIR=/deps2/FlashKDA \
  136. VLLM_FLASH_ATTN_SRC_DIR=/deps2/flash-attention \
  137. QUTLASS_SRC_DIR=/deps2/qutlass \
  138. TML_FA4_SRC_DIR=/deps2/tml-fa4 \
  139. VLLM_CUTLASS_SRC_DIR=/deps2/cutlass \
  140. CUTLASS_INCLUDE_DIR_PRE=/deps2/cutlass/include \
  141. && python3 use_existing_torch.py \
  142. && uv build --no-build-isolation --wheel . --out-dir=/wheels -v
  143. # ---- B12X @ r27 integration branch, gated; pure-python CuTe-DSL wheel ----
  144. FROM torch-base AS b12x-clone
  145. ARG B12X_REPO B12X_PIN B12X_TREE
  146. RUN set -eux; \
  147. git config --global protocol.version 0; \
  148. git init -q /workspace/b12x; \
  149. git -C /workspace/b12x fetch -q --depth 1 ${B12X_REPO} ${B12X_PIN}; \
  150. git -C /workspace/b12x checkout -q FETCH_HEAD; \
  151. cd /workspace/b12x; \
  152. test "$(git rev-parse HEAD)" = "${B12X_PIN}"; \
  153. test "$(git rev-parse HEAD^{tree})" = "${B12X_TREE}"; \
  154. git config --global --add safe.directory /workspace/b12x
  155. FROM b12x-clone AS b12x-builder
  156. WORKDIR /workspace/b12x
  157. ARG B12X_PRETEND_VERSION
  158. RUN --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
  159. SETUPTOOLS_SCM_PRETEND_VERSION_FOR_B12X="${B12X_PRETEND_VERSION}" \
  160. uv build --no-build-isolation --wheel . --out-dir=/wheels -v
  161. # ---- LMCache @ r27 source lock: wheel + cuMem interposer from source ----
  162. FROM torch-base AS lmcache-builder
  163. ARG LMCACHE_REPO LMCACHE_PIN LMCACHE_TREE LMCACHE_VERSION
  164. ARG BUILD_JOBS
  165. RUN set -eux; \
  166. git config --global protocol.version 0; \
  167. git init -q /workspace/lmcache; \
  168. git -C /workspace/lmcache fetch -q --depth 1 ${LMCACHE_REPO} ${LMCACHE_PIN}; \
  169. git -C /workspace/lmcache checkout -q FETCH_HEAD; \
  170. cd /workspace/lmcache; \
  171. test "$(git rev-parse HEAD^{tree})" = "${LMCACHE_TREE}"; \
  172. git config --global --add safe.directory /workspace/lmcache
  173. WORKDIR /workspace/lmcache
  174. RUN --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
  175. uv pip install "setuptools>=77.0.3,<81.0.0" setuptools_scm wheel packaging ninja \
  176. && SETUPTOOLS_SCM_PRETEND_VERSION_FOR_LMCACHE="${LMCACHE_VERSION}" \
  177. BUILD_WITH_CUDA=1 \
  178. LMCACHE_CUDA_MAJOR=13 \
  179. TORCH_CUDA_ARCH_LIST=12.1a \
  180. ENABLE_CXX11_ABI=1 \
  181. MAX_JOBS="${BUILD_JOBS:-4}" \
  182. NVCC_THREADS=auto \
  183. python3 -m pip wheel --no-build-isolation --no-deps --wheel-dir /lmcache-artifacts . \
  184. && make -C csrc/cumem_ipc_interposer CUDA_HOME=/usr/local/cuda \
  185. && install -Dm755 csrc/cumem_ipc_interposer/liblmcache_cumem_shareable.so \
  186. /lmcache-artifacts/liblmcache_cumem_shareable.so \
  187. && cd /lmcache-artifacts && sha256sum *.whl liblmcache_cumem_shareable.so > SHA256SUMS
  188. # ---- Runner: flattened GB10 serving image ----
  189. FROM torch-base AS runner
  190. ARG PYPI_INDEX_URL
  191. ARG LMCACHE_VERSION
  192. COPY checksums/tiktoken.sha256 /tmp/tiktoken.sha256
  193. COPY patch_cuda_sm12x.py /tmp/patch_cuda_sm12x.py
  194. COPY lmcache-runtime-requirements.txt /tmp/lmcache-runtime-requirements.txt
  195. WORKDIR /workspace
  196. RUN mkdir -p tiktoken_encodings \
  197. && wget -O tiktoken_encodings/o200k_base.tiktoken https://openaipublic.blob.core.windows.net/encodings/o200k_base.tiktoken \
  198. && wget -O tiktoken_encodings/cl100k_base.tiktoken https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken \
  199. && cd tiktoken_encodings && sha256sum -c /tmp/tiktoken.sha256
  200. ENV TIKTOKEN_ENCODINGS_BASE=/workspace/tiktoken_encodings
  201. RUN --mount=type=bind,from=vllm-builder,source=/wheels,target=/vllm-wheels \
  202. --mount=type=bind,from=b12x-builder,source=/wheels,target=/b12x-wheels \
  203. --mount=type=bind,from=lmcache-builder,source=/lmcache-artifacts,target=/lmcache-artifacts \
  204. --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
  205. pip install --no-cache-dir --no-build-isolation /vllm-wheels/*.whl \
  206. && pip install --no-cache-dir --no-deps -r /tmp/lmcache-runtime-requirements.txt \
  207. && pip install --no-cache-dir --no-deps --force-reinstall /b12x-wheels/*.whl \
  208. && pip install --no-cache-dir --no-deps --force-reinstall /lmcache-artifacts/*.whl \
  209. && install -Dm755 /lmcache-artifacts/liblmcache_cumem_shareable.so \
  210. /opt/lmcache/lib/liblmcache_cumem_shareable.so \
  211. && install -m 644 /tmp/lmcache-runtime-requirements.txt /opt/lmcache/ \
  212. && python3 /tmp/patch_cuda_sm12x.py \
  213. && find /usr/local/lib/python3.12/dist-packages/vllm /opt/lmcache \
  214. -name "__pycache__" -type d -prune -exec rm -rf {} + 2>/dev/null || true
  215. # b12x loader allocation patch (discord, 2026-09-07): pinned_wc -> managed
  216. # in b12x/integration/vllm/loader.py — two occurrences (the weight_pool call
  217. # and the matching audit label). Reported prefill 1350 -> ~2000 tok/s. No
  218. # recompiles; hard-gated: any pinned_wc left behind fails the build.
  219. RUN set -eux; \
  220. F=/usr/local/lib/python3.12/dist-packages/b12x/integration/vllm/loader.py; \
  221. sed -i 's/allocation="pinned_wc"/allocation="managed"/; \
  222. s/"allocation": "pinned_wc"/"allocation": "managed"/' "$F"; \
  223. test "$(grep -c 'allocation="managed"' "$F")" = "1"; \
  224. grep -Fq '"allocation": "managed"' "$F"; \
  225. ! grep -q 'pinned_wc' "$F"
  226. # Build gate: the r27 stack must import with the GB10 patches in place and
  227. # carry the qualified package trees (marker spot-checks from the source lock).
  228. RUN set -eux; \
  229. python3 -c "import vllm; print('vllm', vllm.__version__)"; \
  230. python3 -c "from importlib.metadata import version; print('b12x', version('b12x'))"; \
  231. python3 -c "from importlib.metadata import version as v; \
  232. assert v('lmcache') == '${LMCACHE_VERSION}', v('lmcache'); print('lmcache', v('lmcache'))"; \
  233. python3 -c "import lmcache, lmcache.cuda_ops, lmcache.lmcache_native, lmcache.lmcache_fs; print('lmcache modules ok')"; \
  234. python3 -c "import vllm._flashkda_C; print('flashkda_C ok')"; \
  235. python3 -c "from vllm.config.attention import AttentionBackendEnum as E; \
  236. assert E.B12X.value and 'b12x' in E.B12X.value.lower(); print('B12X enum ok')"; \
  237. grep -q "AttentionBackendEnum.B12X," /usr/local/lib/python3.12/dist-packages/vllm/platforms/cuda.py; \
  238. grep -Fq 'def apply_top_k_top_p_probs' /usr/local/lib/python3.12/dist-packages/vllm/v1/sample/ops/topk_topp_sampler.py; \
  239. grep -Fq 'B12X_PCIE_ONESHOT_PDL' /usr/local/lib/python3.12/dist-packages/b12x/comm/pcie/_oneshot_cute.py; \
  240. grep -Fq 'self._transfer_workspace_slot_count = self._commit_workers' /usr/local/lib/python3.12/dist-packages/lmcache/v1/multiprocess/transfer_context/async_engine_driven.py; \
  241. test -s /opt/lmcache/lib/liblmcache_cumem_shareable.so
  242. ENV LMCACHE_EXPECTED_SOURCE_ROOT=/usr/local/lib/python3.12/site-packages/lmcache
  243. ENTRYPOINT []
  244. CMD ["bash"]