[ROCm][Installation] Add mooncake package to image using public wheels (#55002)

Signed-off-by: Giuseppe Grossi <ggrossi@amd.com>
Co-authored-by: Andreas Karatzas <akaratza@amd.com>
This commit is contained in:
Giuseppe Grossi
2026-09-02 21:48:36 -05:00
committed by GitHub
co-authored by Andreas Karatzas
parent 5e4e927b5e
commit e47356c63e
4 changed files with 7 additions and 168 deletions
+3 -40
View File
@@ -17,7 +17,7 @@ DEFAULT_REPO_SLUG="vllm-project/vllm"
DEFAULT_CI_HCL_SOURCE="docker/ci-rocm.hcl"
DEFAULT_CI_BASE_CONTENT_FILES=".dockerignore requirements/common.txt requirements/rocm.txt requirements/test/rocm.txt tools/install_torchcodec_rocm.sh rust-toolchain.toml tests/vllm_test_utils"
DEFAULT_CI_BASE_DOCKERFILE="docker/Dockerfile.rocm"
DEFAULT_CI_BASE_DOCKERFILE_STAGES="base rust_toolchain_input_0 rust-toolchain-input rust-toolchain build_nixl lmcache_source build_lmcache build_rocshmem build_deepep mooncake_source build_mooncake package_mooncake export_mooncake mori_base ci_base"
DEFAULT_CI_BASE_DOCKERFILE_STAGES="base rust_toolchain_input_0 rust-toolchain-input rust-toolchain build_nixl lmcache_source build_lmcache build_rocshmem build_deepep mori_base ci_base"
DEFAULT_CI_BASE_METADATA_VERSION="3"
# ROCm CI forces REMOTE_VLLM=0, so content identity covers only the selected
# local-source stages rather than unreachable remote-fetch alternatives.
@@ -1684,12 +1684,9 @@ ci_base_metadata_pairs() {
metadata_pair "vllm.rocm.deepep_commit" "${DEEPEP_BRANCH:-$(resolve_dockerfile_arg_value "${dockerfile}" "DEEPEP_BRANCH")}"
metadata_pair "vllm.rocm.deepep_nic" "$(resolve_dockerfile_arg_value "${dockerfile}" "DEEPEP_NIC")"
metadata_pair "vllm.rocm.deepep_rocm_arch" "$(resolve_dockerfile_arg_value "${dockerfile}" "DEEPEP_ROCM_ARCH")"
metadata_pair "vllm.rocm.mooncake_repo" "$(resolve_dockerfile_arg_value "${dockerfile}" "MOONCAKE_REPO")"
metadata_pair "vllm.rocm.mooncake_commit" "${MOONCAKE_BRANCH:-$(resolve_dockerfile_arg_value "${dockerfile}" "MOONCAKE_BRANCH")}"
metadata_pair "vllm.rocm.nixl_cache_key" "${NIXL_CACHE_KEY:-}"
metadata_pair "vllm.rocm.rocshmem_cache_key" "${ROCSHMEM_CACHE_KEY:-}"
metadata_pair "vllm.rocm.deepep_cache_key" "${DEEPEP_CACHE_KEY:-}"
metadata_pair "vllm.rocm.mooncake_cache_key" "${MOONCAKE_CACHE_KEY:-}"
}
write_ci_base_metadata_annotations() {
@@ -2271,7 +2268,7 @@ extract_dependency_pins() {
return 0
fi
for var in NIXL_BRANCH UCX_BRANCH ROCSHMEM_BRANCH DEEPEP_BRANCH MOONCAKE_BRANCH; do
for var in NIXL_BRANCH UCX_BRANCH ROCSHMEM_BRANCH DEEPEP_BRANCH; do
if [[ -n "${!var:-}" ]]; then
echo "Using provided ${var}: ${!var}"
continue
@@ -2295,11 +2292,9 @@ compute_dependency_cache_keys() {
local ucx_branch=""
local rocshmem_branch=""
local deepep_branch=""
local mooncake_branch=""
local nixl_material=""
local rocshmem_material=""
local deepep_material=""
local mooncake_material=""
bake_dir=$(dirname "${VLLM_BAKE_FILE}")
dockerfile_rocm="${bake_dir}/Dockerfile.rocm"
@@ -2307,7 +2302,6 @@ compute_dependency_cache_keys() {
ucx_branch=$(resolve_dockerfile_arg_value "${dockerfile_rocm}" "UCX_BRANCH")
rocshmem_branch=$(resolve_dockerfile_arg_value "${dockerfile_rocm}" "ROCSHMEM_BRANCH")
deepep_branch=$(resolve_dockerfile_arg_value "${dockerfile_rocm}" "DEEPEP_BRANCH")
mooncake_branch=$(resolve_dockerfile_arg_value "${dockerfile_rocm}" "MOONCAKE_BRANCH")
if [[ -n "${nixl_branch}" && -n "${ucx_branch}" ]]; then
nixl_material=$(compose_stage_cache_material "${dockerfile_rocm}" "base build_nixl")
@@ -2341,19 +2335,6 @@ compute_dependency_cache_keys() {
export DEEPEP_CACHE_KEY
echo "DeepEP dependency cache key: ${DEEPEP_CACHE_KEY}"
fi
if [[ -n "${mooncake_branch}" ]]; then
mooncake_material=$(compose_stage_cache_material \
"${dockerfile_rocm}" \
"base mooncake_source build_mooncake package_mooncake export_mooncake")
MOONCAKE_CACHE_KEY=$(
compose_dependency_cache_key \
"${mooncake_branch}" \
"${mooncake_material}"
)
export MOONCAKE_CACHE_KEY
echo "Mooncake dependency cache key: ${MOONCAKE_CACHE_KEY}"
fi
}
compose_stage_cache_material() {
@@ -2402,13 +2383,6 @@ dependency_cache_ref_for_target() {
printf '%s\n' "${cache_repo}:deepep-rocm-${DEEPEP_BRANCH}-rocshmem-${ROCSHMEM_BRANCH:-}"
fi
;;
mooncake-rocm-ci)
if [[ -n "${MOONCAKE_CACHE_KEY:-}" ]]; then
printf '%s\n' "${cache_repo}:mooncake-rocm-${MOONCAKE_CACHE_KEY}"
elif [[ -n "${MOONCAKE_BRANCH:-}" ]]; then
printf '%s\n' "${cache_repo}:mooncake-rocm-${MOONCAKE_BRANCH}"
fi
;;
esac
}
@@ -2426,14 +2400,13 @@ resolve_ci_base_dependency_targets() {
local nixl_ref=""
local rocshmem_ref=""
local deepep_ref=""
local mooncake_ref=""
[[ "${TARGET}" == "ci-base-rocm-ci-with-deps" ]] || return 0
case "${mode}" in
always)
echo "ROCM_DEP_CACHE_EXPORT_MODE=always; exporting all dependency caches serially"
for target in nixl-rocm-ci rocshmem-rocm-ci deepep-rocm-ci mooncake-rocm-ci; do
for target in nixl-rocm-ci rocshmem-rocm-ci deepep-rocm-ci; do
if [[ -n "$(dependency_cache_ref_for_target "${target}")" ]]; then
add_dependency_cache_target "${target}"
fi
@@ -2483,16 +2456,6 @@ resolve_ci_base_dependency_targets() {
fi
fi
if [[ "${mode}" != "always" && -n "${MOONCAKE_CACHE_KEY:-}" ]]; then
mooncake_ref=$(dependency_cache_ref_for_target "mooncake-rocm-ci")
if dependency_cache_ref_exists "${mooncake_ref}"; then
echo "Mooncake dependency cache exists: ${mooncake_ref}"
else
echo "Mooncake dependency cache missing; will seed: ${mooncake_ref}"
add_dependency_cache_target "mooncake-rocm-ci"
fi
fi
# DeepEP inherits from ROCShmem. If ROCShmem is being seeded, seed DeepEP too
# so the pair stays consistent for future ci_base rebuilds.
if printf '%s\n' "${DEPENDENCY_CACHE_TARGETS[@]}" | grep -qx "rocshmem-rocm-ci" \
+1 -103
View File
@@ -7,10 +7,6 @@ ARG BASE_IMAGE=rocm/vllm-dev:base
ARG CI_BASE_IMAGE=rocm/vllm-dev:ci_base
ARG ROCM_TRITON_KERNELS_COMMIT=0f380657dbf3ee86eb57558ff71df24f03b5d4e7
ARG INSTALL_LMCACHE=false
ARG MOONCAKE_BRANCH=df508641d76be20803349bf715d3bfc5205a7b58
ARG MOONCAKE_REPO=https://github.com/kvcache-ai/Mooncake.git
ARG MOONCAKE_GO_VERSION=1.25.10
ARG MOONCAKE_GO_SHA256=42d4f7a32316aa66591eca7e89867256057a4264451aca10570a715b3637ba70
# NIC backend for MoRI RDMA support.
# By default (all), drivers and userspace libraries for all supported NIC types
# (ainic and bnxt) are installed; MoRI selects the appropriate one at runtime.
@@ -647,82 +643,6 @@ RUN /bin/bash -lc 'set -euo pipefail; \
*) echo "ERROR: unknown NIC_BACKEND=${NIC_BACKEND}. Use one of: none, ainic, bnxt, all"; exit 2 ;; \
esac'
FROM base AS mooncake_source
ARG MOONCAKE_GO_VERSION
ARG MOONCAKE_GO_SHA256
ENV PATH=/usr/local/go/bin:${PATH}
ENV GOTOOLCHAIN=local
RUN test "$(uname -m)" = "x86_64" \
&& test ! -e /usr/local/go \
&& curl --fail --location --retry 5 \
--output /tmp/go.tar.gz \
"https://go.dev/dl/go${MOONCAKE_GO_VERSION}.linux-amd64.tar.gz" \
&& echo "${MOONCAKE_GO_SHA256} /tmp/go.tar.gz" | sha256sum --check - \
&& tar -C /usr/local -xzf /tmp/go.tar.gz \
&& rm /tmp/go.tar.gz \
&& test "$(go env GOVERSION)" = "go${MOONCAKE_GO_VERSION}"
# Build a pinned ROCm Mooncake wheel outside the long-lived ROCm base image.
ARG MOONCAKE_BRANCH
ARG MOONCAKE_REPO
RUN git init mooncake \
&& cd mooncake \
&& git remote add origin "${MOONCAKE_REPO}" \
&& git fetch --depth=1 origin "${MOONCAKE_BRANCH}" \
&& git checkout --detach FETCH_HEAD \
&& test "$(git rev-parse HEAD)" = "${MOONCAKE_BRANCH}" \
&& grep -qx 'GOVER=1.25.9' dependencies.sh \
&& sed -i "s/^GOVER=.*/GOVER=${MOONCAKE_GO_VERSION}/" dependencies.sh \
&& bash dependencies.sh -y
FROM mooncake_source AS build_mooncake
ARG USE_SCCACHE
ENV HIPCC_COMPILE_FLAGS_APPEND=--gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/11
RUN --mount=type=cache,id=vllm-rocm-mooncake-go-mod,target=/root/go/pkg/mod \
--mount=type=cache,id=vllm-rocm-mooncake-go-build,target=/root/.cache/go-build \
cd mooncake \
&& cmake -G Ninja -B build \
-DUSE_HIP=ON -DUSE_CUDA=OFF -DWITH_EP=OFF \
-DUSE_HTTP=ON -DUSE_ETCD=ON -DSTORE_USE_ETCD=ON \
-DBUILD_UNIT_TESTS=OFF -DBUILD_BENCHMARK=OFF \
-DENABLE_DEBUG_SYMBOLS=OFF \
-DENABLE_SCCACHE="${USE_SCCACHE:-OFF}" \
-DCMAKE_BUILD_TYPE=Release \
-DPython3_EXECUTABLE="$(command -v python3)" \
&& cmake --build build -j"${MAX_JOBS:-$(nproc)}" \
&& cmake --install build
FROM build_mooncake AS package_mooncake
# Pin both the outer packaging tools and the isolated PEP 517 build environment.
# patchelf 0.14.3 from dependencies.sh corrupts auditwheel RPATHs.
ENV PIP_CONSTRAINT=/tmp/mooncake-build-constraints.txt
ENV PIP_BUILD_CONSTRAINT=/tmp/mooncake-build-constraints.txt
RUN --mount=type=cache,id=vllm-rocm-mooncake-pip,target=/root/.cache/pip \
printf '%s\n' \
'pip==26.2.1' \
'build==1.5.0' \
'setuptools==79.0.1' \
'wheel==0.48.0' \
'auditwheel==6.8.1' \
'packaging==26.3' \
'pyproject-hooks==1.2.0' \
'pyelftools==0.33' \
'patchelf==0.19.1.0' \
> "${PIP_CONSTRAINT}" \
&& python3 -m pip install --upgrade \
pip build setuptools wheel auditwheel patchelf \
&& cd mooncake \
&& export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}:/usr/local/lib" \
&& HIP_BUILD=1 OUTPUT_DIR=dist PLATFORM_TAG=manylinux_2_35_x86_64 \
./scripts/build_wheel.sh \
&& test "$(find mooncake-wheel/dist -maxdepth 1 -type f \
-name 'mooncake_transfer_engine_rocm-*.whl' | wc -l)" -eq 1 \
&& mkdir -p /app/install \
&& cp mooncake-wheel/dist/mooncake_transfer_engine_rocm-*.whl /app/install/
FROM scratch AS export_mooncake
COPY --from=package_mooncake /app/install/ /
# -----------------------
# vLLM wheel release build stage (for building distributable wheels)
# This stage pins dependencies to custom ROCm wheel versions and handles version detection
@@ -953,15 +873,6 @@ RUN --mount=type=bind,from=build_lmcache,src=/app/install,target=/lmcache_instal
/lmcache_install/*.whl \
&& python3 -c "import lmcache, lmcache.c_ops; print('lmcache', lmcache.__version__)"
RUN --mount=type=bind,from=export_mooncake,src=/,target=/mooncake_install,ro \
--mount=type=cache,target=/root/.cache/uv \
uv pip install --system --no-deps \
/mooncake_install/mooncake_transfer_engine_rocm-*.whl \
&& python3 -c "import aiohttp, msgpack, requests" \
&& python3 -c "from mooncake.engine import SUPPORT_HIP, TransferEngine; assert SUPPORT_HIP" \
&& python3 -c "from mooncake.store import MooncakeDistributedStore" \
&& mooncake_master --version
# -----------------------
# Test vLLM image (Tier 2) - vLLM-only layer on top of ci_base.
FROM ${CI_BASE_IMAGE} AS test
@@ -1041,21 +952,10 @@ RUN --mount=type=bind,from=export_vllm,src=/,target=/install \
RUN --mount=type=bind,from=build_nixl,src=/app/install,target=/nixl_install \
uv pip install --system /nixl_install/*.whl
RUN --mount=type=bind,from=export_mooncake,src=/,target=/mooncake_install,ro \
--mount=type=cache,target=/root/.cache/uv \
uv pip install --system --no-deps \
/mooncake_install/mooncake_transfer_engine_rocm-*.whl \
&& python3 -c "import aiohttp, msgpack, requests" \
&& python3 -c "from mooncake.engine import SUPPORT_HIP, TransferEngine; assert SUPPORT_HIP" \
&& python3 -c "from mooncake.store import MooncakeDistributedStore" \
&& mooncake_master --version
ARG COMMON_WORKDIR
ARG BASE_IMAGE
ARG NIC_BACKEND
ARG AINIC_VERSION
ARG MOONCAKE_BRANCH
ARG MOONCAKE_REPO
# Copy over the benchmark scripts as well
COPY --from=export_vllm /benchmarks ${COMMON_WORKDIR}/vllm/benchmarks
@@ -1084,9 +984,7 @@ RUN echo "ROCTRACER_MAX_EVENTS=10000000" > ${COMMON_WORKDIR}/libkineto.conf
ENV KINETO_CONFIG="${COMMON_WORKDIR}/libkineto.conf"
RUN echo "VLLM_BASE_IMAGE=${BASE_IMAGE}" >> ${COMMON_WORKDIR}/versions.txt \
&& echo "MORI_NIC_BACKEND=${NIC_BACKEND}" >> ${COMMON_WORKDIR}/versions.txt \
&& echo "AINIC_VERSION=${AINIC_VERSION}" >> ${COMMON_WORKDIR}/versions.txt \
&& echo "MOONCAKE_BRANCH=${MOONCAKE_BRANCH}" >> ${COMMON_WORKDIR}/versions.txt \
&& echo "MOONCAKE_REPO=${MOONCAKE_REPO}" >> ${COMMON_WORKDIR}/versions.txt
&& echo "AINIC_VERSION=${AINIC_VERSION}" >> ${COMMON_WORKDIR}/versions.txt
CMD ["/bin/bash"]
+1 -25
View File
@@ -91,10 +91,6 @@ variable "DEEPEP_BRANCH" {
default = ""
}
variable "MOONCAKE_BRANCH" {
default = ""
}
variable "NIXL_CACHE_KEY" {
default = ""
}
@@ -107,10 +103,6 @@ variable "DEEPEP_CACHE_KEY" {
default = ""
}
variable "MOONCAKE_CACHE_KEY" {
default = ""
}
# Docker Hub registry cache for AMD builds.
#
# A separate repo (rocm/vllm-ci-cache) is used for BuildKit layer cache.
@@ -255,7 +247,6 @@ function "get_cache_from_rocm_deps" {
NIXL_CACHE_KEY != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:nixl-rocm-${NIXL_CACHE_KEY}" : (NIXL_BRANCH != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:nixl-rocm-${NIXL_BRANCH}-ucx-${UCX_BRANCH}" : ""),
ROCSHMEM_CACHE_KEY != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:rocshmem-rocm-${ROCSHMEM_CACHE_KEY}" : (ROCSHMEM_BRANCH != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:rocshmem-rocm-${ROCSHMEM_BRANCH}" : ""),
DEEPEP_CACHE_KEY != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:deepep-rocm-${DEEPEP_CACHE_KEY}" : (DEEPEP_BRANCH != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:deepep-rocm-${DEEPEP_BRANCH}-rocshmem-${ROCSHMEM_BRANCH}" : ""),
MOONCAKE_CACHE_KEY != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:mooncake-rocm-${MOONCAKE_CACHE_KEY}" : (MOONCAKE_BRANCH != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:mooncake-rocm-${MOONCAKE_BRANCH}" : ""),
])
}
@@ -280,13 +271,6 @@ function "get_cache_to_rocm_deepep" {
])
}
function "get_cache_to_rocm_mooncake" {
params = []
result = compact([
MOONCAKE_CACHE_KEY != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:mooncake-rocm-${MOONCAKE_CACHE_KEY},mode=min" : (MOONCAKE_BRANCH != "" ? "type=registry,ref=${DOCKERHUB_CACHE_REPO}:mooncake-rocm-${MOONCAKE_BRANCH},mode=min" : ""),
])
}
# CI targets
target "_ci-rocm" {
@@ -417,14 +401,6 @@ target "deepep-rocm-ci" {
output = ["type=cacheonly"]
}
target "mooncake-rocm-ci" {
inherits = ["_common-rocm", "_ci-rocm"]
target = "export_mooncake"
cache-from = get_cache_from_rocm_deps()
cache-to = get_cache_to_rocm_mooncake()
output = ["type=cacheonly"]
}
# Builds only the ci_base stage (NIXL, DeepEP, torchcodec, etc.)
# Invoked by the ensure-ci-base step when the content hash of ci_base-affecting
# files drifts from the remote image label. Per-PR builds then pull the result
@@ -455,5 +431,5 @@ target "ci-base-rocm-ci" {
# Group for ci_base builds -- exports dependency stage caches alongside the
# ci_base image so future rebuilds can reuse them independently.
group "ci-base-rocm-ci-with-deps" {
targets = ["nixl-rocm-ci", "rocshmem-rocm-ci", "deepep-rocm-ci", "mooncake-rocm-ci", "ci-base-rocm-ci"]
targets = ["nixl-rocm-ci", "rocshmem-rocm-ci", "deepep-rocm-ci", "ci-base-rocm-ci"]
}
+2
View File
@@ -27,3 +27,5 @@ tilelang==0.1.10
apache-tvm-ffi==0.1.10
# Required for faster safetensors model loading
fastsafetensors >= 0.3.3
# Mooncake transfer engine for KV cache offloading/transfer (ROCm build, published on PyPI)
mooncake-transfer-engine-rocm >= 0.3.13