# syntax=docker/dockerfile:1.7
# ==========================================================================
# GLM-5.2 NF3-Hybrid — DGX Spark (aarch64/sm_121a)
#
# Builds vLLM (local-inference-lab/eldritch-enlightenment) + b12x
# + FlashInfer from source, then overlays the NF3 Triton kernels.
#
# Usage:
#   docker build \
#     --build-arg VLLM_SRC=/path/to/vllm \
#     --build-arg B12X_SRC=/path/to/b12x \
#     --build-arg NCCL_SRC=/path/to/nccl \
#     -t vllm-nf3-hybrid:probe .
#
# On dgx4.lan:
#   VLLM_SRC=/home/kilork/projects/github.com/vllm-eldritch
#   B12X_SRC=/home/kilork/projects/github.com/b12x-nf3
#   NCCL_SRC=/home/kilork/projects/github.com/nccl-canonical
# ==========================================================================

ARG CUDA_VERSION=13.2.0
ARG UBUNTU_VERSION=24.04
ARG GPU_ARCH=12.1a

FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION}

ARG GPU_ARCH
ARG DEBIAN_FRONTEND=noninteractive

ENV DEBIAN_FRONTEND=noninteractive \
    PIP_BREAK_SYSTEM_PACKAGES=1 \
    TORCH_CUDA_ARCH_LIST=${GPU_ARCH} \
    CUTE_DSL_ARCH=sm_121a \
    FLASHINFER_CUDA_ARCH_LIST=${GPU_ARCH} \
    MAX_JOBS=$(nproc) \
    CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)

# ── System packages ─────────────────────────────────────────────────
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 \
    rapidjson-dev libxml2-dev \
    && rm -rf /var/lib/apt/lists/*

# ── Python build essentials ─────────────────────────────────────────
RUN pip install --no-cache-dir uv pybind11 setuptools-scm wheel

# ── PyTorch 2.12.0+cu132 (aarch64) ──────────────────────────────────
RUN pip install --no-cache-dir --no-deps torch==2.12.0 \
    && pip install --no-cache-dir --no-deps torchvision==0.22.0

# ── NCCL ────────────────────────────────────────────────────────────
COPY nccl /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

# ── b12x ────────────────────────────────────────────────────────────
COPY b12x /opt/b12x
WORKDIR /opt/b12x
RUN pip install --no-cache-dir -e . --no-build-isolation \
    -C setup.args="--cuda-arch=${GPU_ARCH}"

# ── FlashInfer ──────────────────────────────────────────────────────
RUN git clone --recursive https://github.com/flashinfer-ai/flashinfer.git /opt/flashinfer \
    && cd /opt/flashinfer \
    && git checkout 25dd814e03791e370f96c3148242f0dc8de504ac \
    && git submodule update --init --recursive
WORKDIR /opt/flashinfer
RUN 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

# ── vLLM (eldritch-enlightenment) ───────────────────────────────────
COPY vllm /opt/vllm
WORKDIR /opt/vllm
RUN git checkout 45c1582e9b80ba83e71c3a6458e71da4736fbdc4 2>/dev/null || true \
    && git submodule update --init --recursive 2>/dev/null || true

# Build vLLM wheel
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

# ── 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

# .pth hook: hybrid_loader fires when any Python process imports from vllm
RUN python3 -c "import sys; open('/usr/local/lib/python3.12/dist-packages/hybrid_loader.pth','w').write('import hybrid_loader\n')"

# ── Verify ──────────────────────────────────────────────────────────
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__}, CUDA: {torch.version.cuda}'); import b12x; print(f'b12x OK: {b12x.__version__}'); import vllm; print(f'vLLM OK: {vllm.__version__}')"

ENTRYPOINT ["vllm", "serve"]
