| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- # syntax=docker/dockerfile:1.7
- # ==========================================================================
- # GLM-5.2 NF3-Hybrid vLLM image for DGX Spark (aarch64/sm_121a, GB10)
- #
- # Builds the eldritch-enlightenment vLLM + voipmonitor/b12x NF3-hybrid stack
- # from source, then overlays the NF3 Triton kernels + hybrid loader.
- #
- # Image: vllm-nf3-hybrid:probe
- # Build time: ~1h20m on a single DGX Spark
- #
- # Usage:
- # docker build -t vllm-nf3-hybrid:probe .
- #
- # Upstream:
- # vLLM: local-inference-lab/vllm @ 45c1582e9b80ba83e71c3a6458e71da4736fbdc4
- # (dev/eldritch-enlightenment — NF3 hybrid loader, DCP ag_rs dispatch,
- # low-bit MLA KV-cache dtypes, MTP/spec-decode cherries)
- # b12x: voipmonitor/b12x @ f3686b555d639823b276c2080f173145eed7f007
- # (NF3 W4A16 kernel, NVFP4 packed weights, sm_121 register table)
- # FlashInfer: 0.6.14 (aarch64 wheels from flashinfer.ai)
- # CUDA: 13.2 / PyTorch 2.12.0+cu132
- # Arch: TORCH_CUDA_ARCH_LIST=12.1a, CUTE_DSL_ARCH=sm_121a
- # ==========================================================================
- ARG CUDA_VERSION=13.2.0
- ARG UBUNTU_VERSION=24.04
- ARG PYTHON_VERSION=3.12
- ARG MAX_JOBS=16
- ARG GPU_ARCH=12.1a
- # ───── Stage 0: System base ─────────────────────────────────────────────
- FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION} AS system-base
- ARG MAX_JOBS
- ARG PYTHON_VERSION
- ARG DEBIAN_FRONTEND=noninteractive
- ENV MAX_JOBS=${MAX_JOBS}
- ENV CMAKE_BUILD_PARALLEL_LEVEL=${MAX_JOBS}
- ENV NINJAFLAGS="-j${MAX_JOBS}"
- ENV MAKEFLAGS="-j${MAX_JOBS}"
- ENV PIP_BREAK_SYSTEM_PACKAGES=1
- ENV PIP_CACHE_DIR=/root/.cache/pip
- ENV UV_SYSTEM_PYTHON=1
- ENV UV_LINK_MODE=copy
- RUN apt-get update && apt-get install -y --no-install-recommends \
- build-essential \
- ninja-build \
- cmake \
- curl \
- git \
- wget \
- python3-dev \
- python3-pip \
- python3-venv \
- ccache \
- libibverbs-dev \
- libibverbs1 \
- rdma-core \
- libcudnn9-cuda-13 \
- libcudnn9-dev-cuda-13 \
- && rm -rf /var/lib/apt/lists/* \
- && pip install uv
- # Install PyTorch 2.12.0+cu132 (aarch64)
- RUN pip install --no-cache-dir torch==2.12.0
- RUN pip install --no-cache-dir torchvision==0.22.0
- # ───── Stage 1: Build NCCL (patched, for multi-node) ───────────────────
- FROM system-base AS nccl-build
- ARG GPU_ARCH
- ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
- ENV CUTE_DSL_ARCH=sm_121a
- RUN git clone --depth=1 \
- https://github.com/local-inference-lab/nccl-canonical.git \
- /tmp/nccl
- WORKDIR /tmp/nccl
- RUN make -j${MAX_JOBS} src.build \
- CUDA_HOME=/usr/local/cuda \
- NVCC_GENCODE="-gencode=arch=compute_${GPU_ARCH},code=sm_${GPU_ARCH}" \
- && make install
- # ───── Stage 2: Build b12x ─────────────────────────────────────────────
- FROM system-base AS b12x-build
- ARG GPU_ARCH
- ARG MAX_JOBS
- ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
- ENV CUTE_DSL_ARCH=sm_121a
- ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
- # b12x NF3-hybrid fork
- RUN git clone https://github.com/voipmonitor/b12x.git /tmp/b12x \
- && cd /tmp/b12x \
- && git checkout f3686b555d639823b276c2080f173145eed7f007 \
- && pip install --no-cache-dir -e . \
- --no-build-isolation \
- -C setup.args="--cuda-arch=${GPU_ARCH}" \
- && python3 -c 'import b12x; print(f"b12x OK: {b12x.__version__}")'
- # ───── Stage 3: Build vLLM (eldritch-enlightenment) ────────────────────
- FROM system-base AS vllm-build
- ARG GPU_ARCH
- ARG MAX_JOBS
- ARG DEBIAN_FRONTEND=noninteractive
- ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
- ENV CUTE_DSL_ARCH=sm_121a
- ENV VLLM_TARGET_DEVICE=cuda
- ENV VLLM_BUILD_WHEEL=1
- # Copy b12x from previous stage
- COPY --from=b12x-build /usr/local/lib/python3.12/dist-packages/b12x* \
- /usr/local/lib/python3.12/dist-packages/
- COPY --from=b12x-build /tmp/b12x /tmp/b12x
- # Install build deps
- RUN apt-get update && apt-get install -y --no-install-recommends \
- rapidjson-dev \
- libxml2-dev \
- && rm -rf /var/lib/apt/lists/*
- # Clone vLLM at the eldritch-enlightenment pin
- RUN git clone https://github.com/local-inference-lab/vllm.git /tmp/vllm \
- && cd /tmp/vllm \
- && git checkout 45c1582e9b80ba83e71c3a6458e71da4736fbdc4
- WORKDIR /tmp/vllm
- # Install Python deps
- RUN pip install --no-cache-dir \
- -r requirements/common.txt \
- -r requirements/cuda.txt \
- pybind11 \
- setuptools-scm
- # Build vLLM
- RUN --mount=type=cache,target=/root/.cache/pip \
- python3 setup.py bdist_wheel --dist-dir=/tmp/vllm-dist \
- && pip install --no-cache-dir /tmp/vllm-dist/*.whl \
- && python3 -c 'import vllm; print(f"vLLM OK: {vllm.__version__}")'
- # ───── Stage 4: Install FlashInfer ──────────────────────────────────────
- FROM system-base AS flashinfer-build
- ARG GPU_ARCH
- ARG MAX_JOBS
- ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
- ENV MAX_JOBS=${MAX_JOBS}
- # Clone flashinfer at the eldritch-compatible pin
- RUN git clone https://github.com/flashinfer-ai/flashinfer.git /tmp/flashinfer \
- && cd /tmp/flashinfer \
- && git checkout 25dd814e03791e370f96c3148242f0dc8de504ac
- WORKDIR /tmp/flashinfer
- RUN pip install --no-cache-dir -e . \
- --no-build-isolation \
- && python3 -c 'import flashinfer; print(f"FlashInfer OK: {flashinfer.__version__}")'
- # ───── Stage 5: Final runtime image ─────────────────────────────────────
- FROM nvidia/cuda:${CUDA_VERSION}-runtime-ubuntu${UBUNTU_VERSION} AS final
- ARG GPU_ARCH
- ENV TORCH_CUDA_ARCH_LIST=${GPU_ARCH}
- ENV CUTE_DSL_ARCH=sm_121a
- ENV FLASHINFER_CUDA_ARCH_LIST=${GPU_ARCH}
- ENV DEBIAN_FRONTEND=noninteractive
- ENV PIP_BREAK_SYSTEM_PACKAGES=1
- # Runtime libs
- RUN apt-get update && apt-get install -y --no-install-recommends \
- python3 \
- python3-pip \
- libibverbs1 \
- libibverbs-dev \
- rdma-core \
- libcudnn9-cuda-13 \
- && rm -rf /var/lib/apt/lists/*
- # Copy all built artifacts
- COPY --from=vllm-build /usr/local/lib/python3.12/dist-packages/ \
- /usr/local/lib/python3.12/dist-packages/
- COPY --from=vllm-build /tmp/vllm/vllm /usr/local/lib/python3.12/dist-packages/vllm
- COPY --from=flashinfer-build /usr/local/lib/python3.12/dist-packages/flashinfer* \
- /usr/local/lib/python3.12/dist-packages/
- COPY --from=nccl-build /usr/local/lib/libnccl* /usr/local/lib/
- RUN ldconfig
- # ───── NF3 hybrid overlay ──────────────────────────────────────────────
- # These are placed in the Python path; the hybrid_loader's import hook
- # patches vllm.model_executor.layers.quantization.modelopt at import time.
- COPY overlay/hybrid_loader.py /usr/local/lib/python3.12/dist-packages/hybrid_loader.py
- COPY overlay/nf3_kernel.py /usr/local/lib/python3.12/dist-packages/nf3_kernel.py
- COPY overlay/nvfp4_kernel.py /usr/local/lib/python3.12/dist-packages/nvfp4_kernel.py
- COPY overlay/nf3_replan.py /usr/local/lib/python3.12/dist-packages/nf3_replan.py
- COPY overlay/mxfp8_tier.json /usr/local/lib/python3.12/dist-packages/mxfp8_tier.json
- # .pth hook so hybrid_loader fires before vLLM modelopt imports
- 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")'
- # Verify overlay imports
- 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__}")'
- # vLLM entrypoint
- ENTRYPOINT ["vllm", "serve"]
|