FROM lmsysorg/sglang:v0.5.10.post1-runtime AS builder
ARG VARIANT=sglang
WORKDIR /
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
cmake \
ccache \
kmod \
libibverbs-dev \
librdmacm-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN pip install -U pip uv
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy
ENV UV_TOOL_BIN_DIR=/usr/local/bin
ENV NVTE_WITH_USERBUFFERS=1
ENV NVTE_FRAMEWORK=pytorch
ENV MPI_HOME=/usr/local/mpi
ENV TORCH_CUDA_ARCH_LIST="8.0 8.9 9.0 9.0a"
ENV MAX_JOBS=32
ENV VIRTUAL_ENV=/opt/.venv
ENV CUDA_HOME=/usr/local/cuda
RUN uv venv $VIRTUAL_ENV \
&& if [ "$VARIANT" = "vllm" ]; then TORCH_VER="2.10.0"; else TORCH_VER="2.9.1"; fi \
&& uv pip install --index-url https://download.pytorch.org/whl/cu129 \
"torch==${TORCH_VER}+cu129" "torchaudio" "torchvision"
RUN uv pip install "setuptools>=77.0.3,<80" pybind11 nvidia-mathdx wheel
RUN TMS_CUDA_MAJOR=12 uv pip install --no-build-isolation --no-cache-dir --force-reinstall \
git+https://github.com/fzyzcjy/torch_memory_saver.git
RUN uv pip install --no-build-isolation --no-cache-dir \
git+https://github.com/fanshiqing/grouped_gemm@v1.1.4
RUN NVCC_APPEND_FLAGS="--threads 4" APEX_PARALLEL_BUILD=8 APEX_CPP_EXT=1 APEX_CUDA_EXT=1 \
uv pip -v install --disable-pip-version-check --no-cache-dir --no-build-isolation \
git+https://github.com/NVIDIA/apex.git
RUN uv pip -v install --no-build-isolation --no-cache-dir \
git+https://github.com/NVIDIA/TransformerEngine.git@stable
RUN git clone https://github.com/deepseek-ai/FlashMLA.git /flash-mla \
&& cd /flash-mla && git checkout 71c7379 \
&& git submodule update --init --recursive \
&& uv pip install -v . --no-build-isolation --no-cache-dir \
&& rm -rf /flash-mla
RUN git clone https://github.com/deepseek-ai/DeepGEMM /DeepGEMM \
&& cd /DeepGEMM && git checkout d30fc36 \
&& git submodule update --init --recursive \
&& uv pip install -v . --no-build-isolation --no-cache-dir \
&& rm -rf /DeepGEMM
RUN git clone https://github.com/deepseek-ai/DeepEP /DeepEP \
&& cd /DeepEP && git checkout 567632d \
&& TORCH_CUDA_ARCH_LIST="9.0 9.0a" uv pip install -v . --no-build-isolation --no-cache-dir \
&& rm -rf /DeepEP
RUN git clone https://github.com/Dao-AILab/causal-conv1d -b v1.6.0 /causal-conv1d \
&& cd /causal-conv1d \
&& uv pip install -v . --no-build-isolation --no-cache-dir \
&& rm -rf /causal-conv1d
RUN set -ex \
&& FA_VER="2.8.3" \
&& FA_RELEASE="v0.7.16" \
&& if [ "$VARIANT" = "vllm" ]; then TORCH_TAG="torch2.10"; else TORCH_TAG="torch2.9"; fi \
&& PY_TAG=$(python3 -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')") \
&& LOCAL="+cu128${TORCH_TAG}" \
&& WHL="flash_attn-${FA_VER}${LOCAL}-${PY_TAG}-${PY_TAG}-linux_x86_64.whl" \
&& URL="https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/${FA_RELEASE}/${WHL}" \
&& WORK="/tmp/flash-attn-repack" \
&& mkdir -p "$WORK" \
&& curl -fSL --retry 3 -o "$WORK/$WHL" "$URL" \
&& $VIRTUAL_ENV/bin/wheel unpack "$WORK/$WHL" -d "$WORK/unpacked" \
&& SRC="$WORK/unpacked/flash_attn-${FA_VER}${LOCAL}" \
&& sed -i "s/^Version: .*/Version: ${FA_VER}/" "$SRC/flash_attn-${FA_VER}${LOCAL}.dist-info/METADATA" \
&& mv "$SRC/flash_attn-${FA_VER}${LOCAL}.dist-info" "$SRC/flash_attn-${FA_VER}.dist-info" \
&& mv "$SRC" "$WORK/unpacked/flash_attn-${FA_VER}" \
&& $VIRTUAL_ENV/bin/wheel pack "$WORK/unpacked/flash_attn-${FA_VER}" -d "$WORK" \
&& uv pip install "$WORK/flash_attn-${FA_VER}-${PY_TAG}-${PY_TAG}-linux_x86_64.whl" --no-build-isolation \
&& rm -rf "$WORK"
RUN set -ex \
&& FA3_VER="3.0.0" \
&& FA3_RELEASE="v0.8.2" \
&& FA3_SRC_TAG="v2.8.3" \
&& if [ "$VARIANT" = "vllm" ]; then TORCH_TAG="torch2.10"; else TORCH_TAG="torch2.9"; fi \
&& LOCAL="+cu128${TORCH_TAG}gite2743ab" \
&& WHL="flash_attn_3-${FA3_VER}${LOCAL}-cp39-abi3-linux_x86_64.whl" \
&& URL="https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/${FA3_RELEASE}/${WHL}" \
&& curl -fSL --retry 3 -o "/tmp/${WHL}" "$URL" \
&& uv pip install "/tmp/${WHL}" --no-build-isolation \
&& rm -f "/tmp/${WHL}" \
&& PY_VER=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')") \
&& SITE_PKG="$VIRTUAL_ENV/lib/python${PY_VER}/site-packages/flash_attn_3" \
&& mkdir -p "$SITE_PKG" \
&& curl -fSL --retry 3 -o "$SITE_PKG/flash_attn_interface.py" \
"https://raw.githubusercontent.com/Dao-AILab/flash-attention/${FA3_SRC_TAG}/hopper/flash_attn_interface.py" \
&& touch "$SITE_PKG/__init__.py"
RUN --mount=type=cache,target=/root/.cache/uv \
--mount=type=bind,source=pyproject.toml,target=/tmp/sglang/pyproject.toml \
--mount=type=bind,source=pyproject.vllm.toml,target=/tmp/vllm/pyproject.toml \
--mount=type=bind,source=uv.lock,target=/tmp/sglang/uv.lock \
--mount=type=bind,source=uv.vllm.lock,target=/tmp/vllm/uv.lock \
case "$VARIANT" in \
sglang) PROJECT_DIR=/tmp/sglang ;; \
vllm) PROJECT_DIR=/tmp/vllm ;; \
*) echo "Invalid VARIANT=$VARIANT (expected: sglang|vllm)" >&2; exit 1 ;; \
esac \
&& uv sync --active --inexact --no-install-project --no-build-isolation \
--extra cuda --extra sandbox --group dev --project "$PROJECT_DIR"
RUN uv pip uninstall pynvml
RUN uv pip install --no-cache-dir -U setuptools nvidia-ml-py
FROM lmsysorg/sglang:v0.5.10.post1-runtime
ARG VARIANT=sglang
WORKDIR /
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
net-tools \
unzip \
kmod \
libibverbs-dev \
librdmacm-dev \
ibverbs-utils \
rdmacm-utils \
python3-pyverbs \
opensm \
ibutils \
perftest \
python3-venv \
tmux \
lsof \
nvtop \
rsync \
dnsutils \
vim \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get --purge remove -y --allow-change-held-packages libcudnn9* \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir -U pip uv
WORKDIR /AReaL
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy
ENV UV_TOOL_BIN_DIR=/usr/local/bin
ENV NVTE_WITH_USERBUFFERS=1
ENV NVTE_FRAMEWORK=pytorch
ENV MPI_HOME=/usr/local/mpi
ENV VIRTUAL_ENV=/opt/.venv
ENV CUDA_HOME=/usr/local/cuda
COPY --from=builder /opt/.venv /opt/.venv
ENV FNM_DIR=/root/.fnm
ENV NODE_VERSION=24.15.0
ENV NPM_VERSION=12.0.2
ENV PATH="$FNM_DIR/aliases/default/bin:/root/.local/bin:$PATH"
RUN set -ex \
&& curl -fsSL https://fnm.vercel.app/install | bash -s -- --install-dir "$FNM_DIR" --skip-shell \
&& eval "$($FNM_DIR/fnm env --shell bash)" \
&& $FNM_DIR/fnm install $NODE_VERSION \
&& $FNM_DIR/fnm default $NODE_VERSION \
&& npm install -g "npm@$NPM_VERSION" \
&& npm install -g @openai/codex @google/gemini-cli openclaw@latest \
&& curl -fsSL https://claude.ai/install.sh | bash \
&& curl -fsSL https://opencode.ai/install | bash \
&& npm cache clean --force \
&& rm -rf /root/.cache/uv /root/.cache/pip /tmp/*
ENV PATH="/root/.cargo/bin:$PATH"
RUN curl -fsSL \
https://github.com/zeroclaw-labs/zeroclaw/releases/latest/download/install.sh \
| bash -s -- --skip-quickstart \
&& rm -rf /tmp/*
COPY . /AReaL
RUN uv pip install --no-cache-dir --no-deps -e /AReaL
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
ENTRYPOINT []
CMD ["/bin/bash"]