|
@@ -1,140 +1,42 @@
|
|
|
# syntax=docker/dockerfile:1.7
|
|
# syntax=docker/dockerfile:1.7
|
|
|
-# GLM-5.2 NF3-Hybrid for DGX Spark (aarch64/sm_121a)
|
|
|
|
|
-# Adapted from timothystewart6/vllm-gb10
|
|
|
|
|
|
|
+# GLM-5.2 NF3-Hybrid — rapid build atop community DGX Spark image
|
|
|
|
|
+# Base: ghcr.io/timothystewart6/vllm-gb10:v0.23.0-gb10.1
|
|
|
|
|
+# (torch 2.11.0+cu130, vLLM, flashinfer, aarch64/sm_121a)
|
|
|
|
|
+# Adds: b12x (voipmonitor NF3-hybrid fork) + Triton NF3 overlay
|
|
|
|
|
|
|
|
-ARG CUDA_BASE_IMAGE
|
|
|
|
|
-
|
|
|
|
|
-# ───── Stage 1: system-base ──────────────────────────────────────────
|
|
|
|
|
-FROM ${CUDA_BASE_IMAGE} AS system-base
|
|
|
|
|
-
|
|
|
|
|
-ARG UV_VERSION
|
|
|
|
|
-ARG PYTORCH_INDEX_URL
|
|
|
|
|
-ARG DEBIAN_FRONTEND=noninteractive
|
|
|
|
|
|
|
+ARG BASE_IMAGE=ghcr.io/timothystewart6/vllm-gb10:v0.23.0-gb10.1
|
|
|
|
|
+FROM ${BASE_IMAGE}
|
|
|
|
|
|
|
|
|
|
+ARG TORCH_CUDA_ARCH_LIST=12.1a
|
|
|
ENV DEBIAN_FRONTEND=noninteractive \
|
|
ENV DEBIAN_FRONTEND=noninteractive \
|
|
|
PIP_BREAK_SYSTEM_PACKAGES=1 \
|
|
PIP_BREAK_SYSTEM_PACKAGES=1 \
|
|
|
- UV_SYSTEM_PYTHON=1 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 ccache \
|
|
|
|
|
- libibverbs-dev rdma-core libcudnn9-cuda-13 libcudnn9-dev-cuda-13 \
|
|
|
|
|
- && rm -rf /var/lib/apt/lists/* \
|
|
|
|
|
- && pip install --no-cache-dir uv==0.11.28
|
|
|
|
|
-
|
|
|
|
|
-# ───── Stage 2: torch-base ───────────────────────────────────────────
|
|
|
|
|
-FROM system-base AS torch-base
|
|
|
|
|
-
|
|
|
|
|
-ARG TORCH_VERSION
|
|
|
|
|
-ARG TORCHVISION_VERSION
|
|
|
|
|
-ARG TRITON_VERSION
|
|
|
|
|
-ARG PYTORCH_INDEX_URL
|
|
|
|
|
-
|
|
|
|
|
-RUN pip install --no-cache-dir --no-deps \
|
|
|
|
|
- torch==2.12.0 torchvision==0.22.0 \
|
|
|
|
|
- --index-url "${PYTORCH_INDEX_URL}"
|
|
|
|
|
-
|
|
|
|
|
-# ───── Stage 3: NCCL (nccl-canonical) ────────────────────────────────
|
|
|
|
|
-FROM torch-base AS nccl-build
|
|
|
|
|
-
|
|
|
|
|
-ARG NCCL_REPO
|
|
|
|
|
-ARG NCCL_REF
|
|
|
|
|
-
|
|
|
|
|
-RUN git clone --depth=1 -b "${NCCL_REF}" "${NCCL_REPO}" /opt/nccl
|
|
|
|
|
-WORKDIR /opt/nccl
|
|
|
|
|
-RUN make -j$(nproc) src.build \
|
|
|
|
|
- CUDA_HOME=/usr/local/cuda \
|
|
|
|
|
- NVCC_GENCODE="-gencode=arch=compute_121,code=sm_121" \
|
|
|
|
|
- && make install PREFIX=/usr/local && ldconfig
|
|
|
|
|
-
|
|
|
|
|
-# ───── Stage 4: b12x ─────────────────────────────────────────────────
|
|
|
|
|
-FROM torch-base AS b12x-build
|
|
|
|
|
-
|
|
|
|
|
-ARG B12X_REPO
|
|
|
|
|
-ARG B12X_REF
|
|
|
|
|
-ARG TORCH_CUDA_ARCH_LIST=12.1a
|
|
|
|
|
-
|
|
|
|
|
-ENV TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST} \
|
|
|
|
|
|
|
+ TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST} \
|
|
|
CUTE_DSL_ARCH=sm_121a
|
|
CUTE_DSL_ARCH=sm_121a
|
|
|
|
|
|
|
|
-RUN git clone --recursive "${B12X_REPO}" /opt/b12x \
|
|
|
|
|
- && cd /opt/b12x && git checkout "${B12X_REF}"
|
|
|
|
|
|
|
+# Install build tools + b12x deps
|
|
|
|
|
+RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
|
|
|
+ build-essential ninja-build cmake git curl wget python3-dev ccache \
|
|
|
|
|
+ libibverbs-dev rdma-core \
|
|
|
|
|
+ && rm -rf /var/lib/apt/lists/*
|
|
|
|
|
+
|
|
|
|
|
+# Build b12x from source (NVFP4 + NF3 CuTe-DSL kernels)
|
|
|
|
|
+RUN pip install --no-cache-dir uv setuptools-rust
|
|
|
|
|
+RUN git clone --recursive https://github.com/voipmonitor/b12x.git /opt/b12x \
|
|
|
|
|
+ && cd /opt/b12x \
|
|
|
|
|
+ && git checkout f3686b555d639823b276c2080f173145eed7f007
|
|
|
WORKDIR /opt/b12x
|
|
WORKDIR /opt/b12x
|
|
|
RUN pip install --no-cache-dir -e . --no-build-isolation \
|
|
RUN pip install --no-cache-dir -e . --no-build-isolation \
|
|
|
-C setup.args="--cuda-arch=${TORCH_CUDA_ARCH_LIST}"
|
|
-C setup.args="--cuda-arch=${TORCH_CUDA_ARCH_LIST}"
|
|
|
|
|
|
|
|
-# ───── Stage 5: FlashInfer ───────────────────────────────────────────
|
|
|
|
|
-FROM torch-base AS flashinfer-build
|
|
|
|
|
-
|
|
|
|
|
-ARG FLASHINFER_REPO
|
|
|
|
|
-ARG FLASHINFER_REF
|
|
|
|
|
-ARG FLASHINFER_CUDA_ARCH_LIST=12.1a
|
|
|
|
|
-ARG TORCH_CUDA_ARCH_LIST=12.1a
|
|
|
|
|
-
|
|
|
|
|
-ENV FLASHINFER_CUDA_ARCH_LIST=${FLASHINFER_CUDA_ARCH_LIST} \
|
|
|
|
|
- TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST}
|
|
|
|
|
-
|
|
|
|
|
-RUN git clone --recursive "${FLASHINFER_REPO}" /opt/flashinfer \
|
|
|
|
|
- && cd /opt/flashinfer && git checkout "${FLASHINFER_REF}" \
|
|
|
|
|
- && git submodule update --init --recursive
|
|
|
|
|
-WORKDIR /opt/flashinfer
|
|
|
|
|
-RUN --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
|
|
|
|
|
- uv build --no-build-isolation --wheel . --out-dir=/wheels -v \
|
|
|
|
|
- && cd flashinfer-cubin \
|
|
|
|
|
- && uv build --no-build-isolation --wheel . --out-dir=/wheels -v \
|
|
|
|
|
- && cd ../flashinfer-jit-cache \
|
|
|
|
|
- && uv build --no-build-isolation --wheel . --out-dir=/wheels -v \
|
|
|
|
|
- && pip install --no-cache-dir /wheels/*.whl
|
|
|
|
|
-
|
|
|
|
|
-# ───── Stage 6: vLLM (eldritch-enlightenment) ────────────────────────
|
|
|
|
|
-FROM torch-base AS vllm-build
|
|
|
|
|
-
|
|
|
|
|
-ARG VLLM_REPO
|
|
|
|
|
-ARG VLLM_REF
|
|
|
|
|
-ARG TORCH_CUDA_ARCH_LIST=12.1a
|
|
|
|
|
-
|
|
|
|
|
-ENV TORCH_CUDA_ARCH_LIST=${TORCH_CUDA_ARCH_LIST} \
|
|
|
|
|
- CUTE_DSL_ARCH=sm_121a
|
|
|
|
|
-
|
|
|
|
|
-# Clone vLLM at eldritch-enlightenment pin
|
|
|
|
|
-RUN git clone --recursive "${VLLM_REPO}" /opt/vllm \
|
|
|
|
|
- && cd /opt/vllm && git checkout "${VLLM_REF}" \
|
|
|
|
|
- && git submodule update --init --recursive
|
|
|
|
|
-
|
|
|
|
|
-WORKDIR /opt/vllm
|
|
|
|
|
-RUN --mount=type=cache,id=uv-cache,target=/root/.cache/uv \
|
|
|
|
|
- uv build --no-build-isolation --wheel . --out-dir=/wheels -v \
|
|
|
|
|
- && pip install --no-cache-dir /wheels/vllm*.whl
|
|
|
|
|
-
|
|
|
|
|
-# ───── Stage 7: runner (final image) ─────────────────────────────────
|
|
|
|
|
-FROM torch-base AS runner
|
|
|
|
|
-
|
|
|
|
|
-# Copy built artifacts from each stage
|
|
|
|
|
-COPY --from=nccl-build /usr/local/lib/libnccl* /usr/local/lib/
|
|
|
|
|
-COPY --from=nccl-build /usr/local/include/nccl.h /usr/local/include/
|
|
|
|
|
-RUN ldconfig
|
|
|
|
|
-
|
|
|
|
|
-COPY --from=b12x-build /usr/local/lib/python3.12/dist-packages/b12x* \
|
|
|
|
|
- /usr/local/lib/python3.12/dist-packages/
|
|
|
|
|
-COPY --from=flashinfer-build /usr/local/lib/python3.12/dist-packages/flashinfer* \
|
|
|
|
|
- /usr/local/lib/python3.12/dist-packages/
|
|
|
|
|
-COPY --from=vllm-build /usr/local/lib/python3.12/dist-packages/ \
|
|
|
|
|
- /usr/local/lib/python3.12/dist-packages/
|
|
|
|
|
-
|
|
|
|
|
-# ── NF3 hybrid overlay ──────────────────────────────────────────────
|
|
|
|
|
|
|
+# Copy NF3 hybrid overlay
|
|
|
COPY overlay/hybrid_loader.py /usr/local/lib/python3.12/dist-packages/hybrid_loader.py
|
|
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/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/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/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
|
|
COPY overlay/mxfp8_tier.json /usr/local/lib/python3.12/dist-packages/mxfp8_tier.json
|
|
|
|
|
+RUN python3 -c "open('/usr/local/lib/python3.12/dist-packages/hybrid_loader.pth','w').write('import hybrid_loader\n')"
|
|
|
|
|
|
|
|
-RUN python3 -c "import sys; open('/usr/local/lib/python3.12/dist-packages/hybrid_loader.pth','w').write('import hybrid_loader\n')"
|
|
|
|
|
-
|
|
|
|
|
-# Verify imports
|
|
|
|
|
-RUN python3 -c "import hybrid_loader; print('OK hybrid_loader'); import nf3_kernel; print('OK nf3_kernel'); import nvfp4_kernel; print('OK nvfp4_kernel'); import nf3_replan; print('OK nf3_replan'); import flashinfer; print(f'OK flashinfer {flashinfer.__version__}'); import torch; print(f'OK torch {torch.__version__} cuda {torch.version.cuda}'); import b12x; print(f'OK b12x {b12x.__version__}'); import vllm; print(f'OK vllm {vllm.__version__}')"
|
|
|
|
|
-
|
|
|
|
|
-ENV TORCH_CUDA_ARCH_LIST=12.1a \
|
|
|
|
|
- CUTE_DSL_ARCH=sm_121a \
|
|
|
|
|
- FLASHINFER_CUDA_ARCH_LIST=12.1a
|
|
|
|
|
|
|
+# Verify
|
|
|
|
|
+RUN python3 -c "import hybrid_loader; print('OK'); import nf3_kernel; print('OK'); import nvfp4_kernel; print('OK'); import nf3_replan; print('OK'); import b12x; print(f'OK b12x'); import torch; print(f'OK torch {torch.__version__} cuda {torch.version.cuda}'); import vllm; print(f'OK vllm {vllm.__version__}')"
|
|
|
|
|
|
|
|
ENTRYPOINT ["vllm", "serve"]
|
|
ENTRYPOINT ["vllm", "serve"]
|