| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # syntax=docker/dockerfile:1.7
- # GLM-5.2 NF3-Hybrid for DGX Spark (aarch64/sm_121a)
- # Adapted from timothystewart6/vllm-gb10
- 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
- ENV DEBIAN_FRONTEND=noninteractive \
- 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} \
- CUTE_DSL_ARCH=sm_121a
- RUN git clone --recursive "${B12X_REPO}" /opt/b12x \
- && cd /opt/b12x && git checkout "${B12X_REF}"
- WORKDIR /opt/b12x
- RUN pip install --no-cache-dir -e . --no-build-isolation \
- -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 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
- 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
- ENTRYPOINT ["vllm", "serve"]
|