Dockerfile 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. # syntax=docker/dockerfile:1.7
  2. # ==========================================================================
  3. # GLM-5.2 NF3-Hybrid vLLM image for DGX Spark (aarch64/sm_121a, GB10)
  4. #
  5. # Builds the eldritch-enlightenment vLLM + voipmonitor/b12x NF3-hybrid stack
  6. # from source, then overlays the NF3 Triton kernels + hybrid loader.
  7. #
  8. # Image: vllm-nf3-hybrid:probe
  9. # Build time: ~1h20m on a single DGX Spark
  10. #
  11. # Usage:
  12. # docker build -t vllm-nf3-hybrid:probe .
  13. #
  14. # Upstream:
  15. # vLLM: local-inference-lab/vllm @ 45c1582e9b80ba83e71c3a6458e71da4736fbdc4
  16. # (dev/eldritch-enlightenment — NF3 hybrid loader, DCP ag_rs dispatch,
  17. # low-bit MLA KV-cache dtypes, MTP/spec-decode cherries)
  18. # b12x: voipmonitor/b12x @ f3686b555d639823b276c2080f173145eed7f007
  19. # (NF3 W4A16 kernel, NVFP4 packed weights, sm_121 register table)
  20. # FlashInfer: 0.6.14 (aarch64 wheels from flashinfer.ai)
  21. # CUDA: 13.2 / PyTorch 2.12.0+cu132
  22. # Arch: TORCH_CUDA_ARCH_LIST=12.1a, CUTE_DSL_ARCH=sm_121a
  23. # ==========================================================================
  24. ARG CUDA_VERSION=13.2.0
  25. ARG UBUNTU_VERSION=24.04
  26. ARG PYTHON_VERSION=3.12
  27. ARG MAX_JOBS=16
  28. ARG GPU_ARCH=12.1a
  29. # ───── Stage 0: System base ─────────────────────────────────────────────
  30. FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION} AS system-base
  31. ARG MAX_JOBS
  32. ARG PYTHON_VERSION
  33. ARG DEBIAN_FRONTEND=noninteractive
  34. ENV MAX_JOBS=${MAX_JOBS}
  35. ENV CMAKE_BUILD_PARALLEL_LEVEL=${MAX_JOBS}
  36. ENV NINJAFLAGS="-j${MAX_JOBS}"
  37. ENV MAKEFLAGS="-j${MAX_JOBS}"
  38. ENV PIP_BREAK_SYSTEM_PACKAGES=1
  39. ENV PIP_CACHE_DIR=/root/.cache/pip
  40. ENV UV_SYSTEM_PYTHON=1
  41. ENV UV_LINK_MODE=copy
  42. RUN apt-get update && apt-get install -y --no-install-recommends \
  43. build-essential \
  44. ninja-build \
  45. cmake \
  46. curl \
  47. git \
  48. wget \
  49. python3-dev \
  50. python3-pip \
  51. python3-venv \
  52. ccache \
  53. libibverbs-dev \
  54. libibverbs1 \
  55. rdma-core \
  56. libcudnn9-cuda-13 \
  57. libcudnn9-dev-cuda-13 \
  58. && rm -rf /var/lib/apt/lists/* \
  59. && pip install uv
  60. # Install PyTorch 2.12.0+cu132 (aarch64)
  61. RUN pip install --no-cache-dir torch==2.12.0
  62. RUN pip install --no-cache-dir torchvision==0.22.0
  63. # ───── Stage 1: Build NCCL (patched, for multi-node) ───────────────────
  64. FROM system-base AS nccl-build
  65. ARG GPU_ARCH
  66. ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
  67. ENV CUTE_DSL_ARCH=sm_121a
  68. RUN git clone --depth=1 \
  69. https://github.com/local-inference-lab/nccl-canonical.git \
  70. /tmp/nccl
  71. WORKDIR /tmp/nccl
  72. RUN make -j${MAX_JOBS} src.build \
  73. CUDA_HOME=/usr/local/cuda \
  74. NVCC_GENCODE="-gencode=arch=compute_${GPU_ARCH},code=sm_${GPU_ARCH}" \
  75. && make install
  76. # ───── Stage 2: Build b12x ─────────────────────────────────────────────
  77. FROM system-base AS b12x-build
  78. ARG GPU_ARCH
  79. ARG MAX_JOBS
  80. ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
  81. ENV CUTE_DSL_ARCH=sm_121a
  82. ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
  83. # b12x NF3-hybrid fork
  84. RUN git clone https://github.com/voipmonitor/b12x.git /tmp/b12x \
  85. && cd /tmp/b12x \
  86. && git checkout f3686b555d639823b276c2080f173145eed7f007 \
  87. && pip install --no-cache-dir -e . \
  88. --no-build-isolation \
  89. -C setup.args="--cuda-arch=${GPU_ARCH}" \
  90. && python3 -c 'import b12x; print(f"b12x OK: {b12x.__version__}")'
  91. # ───── Stage 3: Build vLLM (eldritch-enlightenment) ────────────────────
  92. FROM system-base AS vllm-build
  93. ARG GPU_ARCH
  94. ARG MAX_JOBS
  95. ARG DEBIAN_FRONTEND=noninteractive
  96. ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
  97. ENV CUTE_DSL_ARCH=sm_121a
  98. ENV VLLM_TARGET_DEVICE=cuda
  99. ENV VLLM_BUILD_WHEEL=1
  100. # Copy b12x from previous stage
  101. COPY --from=b12x-build /usr/local/lib/python3.12/dist-packages/b12x* \
  102. /usr/local/lib/python3.12/dist-packages/
  103. COPY --from=b12x-build /tmp/b12x /tmp/b12x
  104. # Install build deps
  105. RUN apt-get update && apt-get install -y --no-install-recommends \
  106. rapidjson-dev \
  107. libxml2-dev \
  108. && rm -rf /var/lib/apt/lists/*
  109. # Clone vLLM at the eldritch-enlightenment pin
  110. RUN git clone https://github.com/local-inference-lab/vllm.git /tmp/vllm \
  111. && cd /tmp/vllm \
  112. && git checkout 45c1582e9b80ba83e71c3a6458e71da4736fbdc4
  113. WORKDIR /tmp/vllm
  114. # Install Python deps
  115. RUN pip install --no-cache-dir \
  116. -r requirements/common.txt \
  117. -r requirements/cuda.txt \
  118. pybind11 \
  119. setuptools-scm
  120. # Build vLLM
  121. RUN --mount=type=cache,target=/root/.cache/pip \
  122. python3 setup.py bdist_wheel --dist-dir=/tmp/vllm-dist \
  123. && pip install --no-cache-dir /tmp/vllm-dist/*.whl \
  124. && python3 -c 'import vllm; print(f"vLLM OK: {vllm.__version__}")'
  125. # ───── Stage 4: Install FlashInfer ──────────────────────────────────────
  126. FROM system-base AS flashinfer-build
  127. ARG GPU_ARCH
  128. ARG MAX_JOBS
  129. ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
  130. ENV MAX_JOBS=${MAX_JOBS}
  131. # Clone flashinfer at the eldritch-compatible pin
  132. RUN git clone https://github.com/flashinfer-ai/flashinfer.git /tmp/flashinfer \
  133. && cd /tmp/flashinfer \
  134. && git checkout 25dd814e03791e370f96c3148242f0dc8de504ac
  135. WORKDIR /tmp/flashinfer
  136. RUN pip install --no-cache-dir -e . \
  137. --no-build-isolation \
  138. && python3 -c 'import flashinfer; print(f"FlashInfer OK: {flashinfer.__version__}")'
  139. # ───── Stage 5: Final runtime image ─────────────────────────────────────
  140. FROM nvidia/cuda:${CUDA_VERSION}-runtime-ubuntu${UBUNTU_VERSION} AS final
  141. ARG GPU_ARCH
  142. ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
  143. ENV CUTE_DSL_ARCH=sm_121a
  144. ENV FLASHINFER_CUDA_ARCH_LIST=${GPU_ARCH}
  145. ENV DEBIAN_FRONTEND=noninteractive
  146. ENV PIP_BREAK_SYSTEM_PACKAGES=1
  147. # Runtime libs
  148. RUN apt-get update && apt-get install -y --no-install-recommends \
  149. python3 \
  150. python3-pip \
  151. libibverbs1 \
  152. libibverbs-dev \
  153. rdma-core \
  154. libcudnn9-cuda-13 \
  155. && rm -rf /var/lib/apt/lists/*
  156. # Copy all built artifacts
  157. COPY --from=vllm-build /usr/local/lib/python3.12/dist-packages/ \
  158. /usr/local/lib/python3.12/dist-packages/
  159. COPY --from=vllm-build /tmp/vllm/vllm /usr/local/lib/python3.12/dist-packages/vllm
  160. COPY --from=flashinfer-build /usr/local/lib/python3.12/dist-packages/flashinfer* \
  161. /usr/local/lib/python3.12/dist-packages/
  162. COPY --from=nccl-build /usr/local/lib/libnccl* /usr/local/lib/
  163. RUN ldconfig
  164. # ───── NF3 hybrid overlay ──────────────────────────────────────────────
  165. # These are placed in the Python path; the hybrid_loader's import hook
  166. # patches vllm.model_executor.layers.quantization.modelopt at import time.
  167. COPY overlay/hybrid_loader.py /usr/local/lib/python3.12/dist-packages/hybrid_loader.py
  168. COPY overlay/nf3_kernel.py /usr/local/lib/python3.12/dist-packages/nf3_kernel.py
  169. COPY overlay/nvfp4_kernel.py /usr/local/lib/python3.12/dist-packages/nvfp4_kernel.py
  170. COPY overlay/nf3_replan.py /usr/local/lib/python3.12/dist-packages/nf3_replan.py
  171. COPY overlay/mxfp8_tier.json /usr/local/lib/python3.12/dist-packages/mxfp8_tier.json
  172. # .pth hook so hybrid_loader fires before vLLM modelopt imports
  173. RUN python3 -c 'import sys; open("/usr/local/lib/python3.12/dist-packages/hybrid_loader.pth", "w").write("import hybrid_loader\n"); print("hybrid_loader import hook installed")'
  174. # Verify overlay imports
  175. RUN python3 -c 'import hybrid_loader; print("hybrid_loader OK"); import nf3_kernel; print("nf3_kernel OK"); import nvfp4_kernel; print("nvfp4_kernel OK"); import nf3_replan; print("nf3_replan OK"); import flashinfer; print(f"flashinfer OK: {flashinfer.__version__}"); import torch; print(f"PyTorch OK: {torch.__version__}"); import b12x; print(f"b12x OK: {b12x.__version__}"); import vllm; print(f"vLLM OK: {vllm.__version__}")'
  176. # vLLM entrypoint
  177. ENTRYPOINT ["vllm", "serve"]