diff --git a/m/mooncake-transfer-engine-rocm/LICENSE b/m/mooncake-transfer-engine-rocm/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/m/mooncake-transfer-engine-rocm/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/m/mooncake-transfer-engine-rocm/build_info.json b/m/mooncake-transfer-engine-rocm/build_info.json new file mode 100644 index 0000000000..921a638acc --- /dev/null +++ b/m/mooncake-transfer-engine-rocm/build_info.json @@ -0,0 +1,47 @@ +{ + "maintainer": "Daniel Schenker ", + "package_name": "mooncake-transfer-engine-rocm", + "github_url": "https://github.com/kvcache-ai/Mooncake", + "version": "v0.3.13.post1", + "wheel_build": true, + "default_branch": "main", + "package_dir": "m/mooncake-transfer-engine-rocm", + "build_script": "mooncake_v0.3.13.post1_rocm_ubi_10.sh", + "docker_build": false, + "validate_build_script": true, + "use_non_root_user": false, + "wheel_name": "mooncake-transfer-engine-rocm", + "skip_python_versions": ["3.12", "3.14"], + "auditwheel_exclude": [ + "libc10.so", + "libc10_hip.so", + "libtorch.so", + "libtorch_cpu.so", + "libtorch_hip.so", + "libtorch_python.so", + "libtorchaudio.so", + "libtorchvision.so", + "libhip*", + "libroc*", + "libamd*", + "libMIOpen*", + "libhsa*", + "librccl*", + "libLLVM*", + "libcamd*", + "libccolamd*", + "libcholmod*", + "libcolamd*", + "libsuitesparseconfig*", + "libgoamd*", + "liboam*", + "libclang*", + "libMLIR*", + "libfftw3*", + "libgotcha*", + "libOpenCL*" + ], + "*": { + "build_script": "mooncake_v0.3.13.post1_rocm_ubi_10.sh" + } +} diff --git a/m/mooncake-transfer-engine-rocm/mooncake_v0.3.13.post1_rocm_ubi_10.sh b/m/mooncake-transfer-engine-rocm/mooncake_v0.3.13.post1_rocm_ubi_10.sh new file mode 100755 index 0000000000..7e25623c9c --- /dev/null +++ b/m/mooncake-transfer-engine-rocm/mooncake_v0.3.13.post1_rocm_ubi_10.sh @@ -0,0 +1,409 @@ +#!/bin/bash -e +# ----------------------------------------------------------------------------- +# +# Package : mooncake-transfer-engine-rocm +# Version : v0.3.13.post1 +# Source repo : https://github.com/kvcache-ai/Mooncake +# Tested on : UBI:10 (ppc64le) +# Language : Python, C++, HIP +# Ci-Check : True +# Script License: Apache License, Version 2 or later +# Maintainer : Daniel Schenker +# +# Disclaimer: This script has been tested in root mode on given +# ========== platform using the mentioned version of the package. +# It may not work as expected with newer versions of the +# package and/or distribution. In such case, please +# contact "Maintainer" of this script. +# +# ----------------------------------------------------------------------------- +# +# ROCm installation mode (ROCM_INSTALL_MODE env var): +# rpms (default) - Install ROCm RPMs from a provided repo URL +# path - Assume ROCm is already present; use ROCM_PATH as-is +# +# The Mooncake transfer engine is built with AMD HIP/ROCm support enabled +# (-DUSE_HIP=ON) via scikit-build-core, which drives the CMake + pybind11 +# build. Go, SPDK, etcd, and all other optional components are disabled so +# the wheel is a lean transfer-engine-only package. +# +# Usage: +# ./mooncake_v0.3.13.post1_rocm_ubi_10.sh [v0.3.13.post1] +# +# Environment variables honoured (can be set before running): +# PACKAGE_VERSION - Mooncake tag to build (default: v0.3.13.post1) +# ROCM_INSTALL_MODE - rpms (default) or path +# ROCM_PATH - Path to ROCm installation (default: /opt/rocm) +# ROCM_REPO_URL - RPM repo baseurl for ROCm +# DEVPI_INDEX - IBM ppc64le devpi wheel index URL +# (default: https://wheels.developerfirst.ibm.com/ppc64le/linux/+simple) +# +# ----------------------------------------------------------------------------- + +set -e + +PACKAGE_NAME=mooncake-transfer-engine-rocm +PACKAGE_VERSION=${1:-v0.3.13.post1} +PACKAGE_URL=https://github.com/kvcache-ai/Mooncake.git +CURRENT_DIR=$(pwd) +OS_NAME=$(grep ^PRETTY_NAME /etc/os-release | cut -d= -f2) + +ROCM_INSTALL_MODE=${ROCM_INSTALL_MODE:-"rpms"} # rpms | path +ROCM_REPO_URL=${ROCM_REPO_URL:-"https://public.dhe.ibm.com/software/server/POWER/Linux/AMD/ROCm/RHEL/10/ppc64le"} +ROCM_PATH=${ROCM_PATH:-/opt/rocm} + +DEVPI_INDEX=${DEVPI_INDEX:-"https://wheels.developerfirst.ibm.com/ppc64le/linux/+simple"} + +if [[ "$ROCM_INSTALL_MODE" != "rpms" && "$ROCM_INSTALL_MODE" != "path" ]]; then + echo "ERROR: ROCM_INSTALL_MODE must be one of: rpms, path" + exit 1 +fi + +echo "=== Mooncake Transfer Engine ROCm Build ===" +echo " PACKAGE_VERSION : $PACKAGE_VERSION" +echo " ROCM_INSTALL_MODE: $ROCM_INSTALL_MODE" +echo " ROCM_PATH : $ROCM_PATH" +echo " DEVPI_INDEX : $DEVPI_INDEX" +echo "===========================================" + +# --------------------------------------------------------------------------- +# Install system build dependencies +# --------------------------------------------------------------------------- + +# Python packages must appear first (wrapper script requirement). +# Notes on unavailable packages: +# libdrm - not in UBI 10 repo; built from source below +# jsoncpp-devel - not in any RHEL 10 / EPEL 10 repo; built from source below +# boost-devel - not needed: boost is not linked by the transfer engine when +# store/etcd/redis components are disabled +# protobuf-devel - not in RHEL 10; only needed for USE_ETCD_LEGACY (disabled) +# liburing-devel - only needed for USE_TENT (disabled) +yum install -y python3.12 python3.12-devel python3.12-pip \ + gcc-toolset-15 gcc-toolset-15-gcc gcc-toolset-15-gcc-c++ \ + git make wget cmake ninja-build \ + rdma-core-devel \ + glog-devel \ + gflags-devel \ + libunwind-devel \ + numactl-devel \ + openssl-devel \ + yaml-cpp-devel \ + libcurl-devel \ + hiredis-devel \ + jemalloc-devel \ + msgpack-devel \ + libzstd-devel \ + pkgconf-pkg-config \ + elfutils-libelf-devel \ + patchelf \ + xxhash-devel \ + libbsd-devel \ + meson + +# Configure GCC Toolset 15 +if [[ -f /opt/rh/gcc-toolset-15/enable ]]; then + source /opt/rh/gcc-toolset-15/enable +elif [[ -d /opt/rh/gcc-toolset-15/root/usr/bin ]]; then + export PATH="/opt/rh/gcc-toolset-15/root/usr/bin:$PATH" + export LD_LIBRARY_PATH="/opt/rh/gcc-toolset-15/root/usr/lib64:${LD_LIBRARY_PATH:-}" +else + echo "ERROR: gcc-toolset-15 not found" + exit 1 +fi + +echo "Using gcc: $(gcc --version | head -1)" + +# Use Python 3.12 for the build so all produced wheels are cp312 +PYTHON=python3.12 + +# --------------------------------------------------------------------------- +# Build libdrm from source +# libdrm is not available in the UBI 10 package repository. We clone the +# upstream freedesktop.org release, build it with meson, and install it into +# /usr/local so every subsequent build step can find it via pkg-config. +# --------------------------------------------------------------------------- +LIBDRM_VERSION=${LIBDRM_VERSION:-"libdrm-2.4.124"} +LIBDRM_URL="https://gitlab.freedesktop.org/mesa/drm.git" + +echo "Building libdrm ${LIBDRM_VERSION} from source" +if [ -d "${CURRENT_DIR}/drm" ]; then + echo "drm directory already exists, reusing." + cd "${CURRENT_DIR}/drm" + git checkout "$LIBDRM_VERSION" +else + if ! git clone --branch "$LIBDRM_VERSION" --depth 1 "$LIBDRM_URL" "${CURRENT_DIR}/drm"; then + echo "ERROR: Failed to clone libdrm ${LIBDRM_VERSION}" + exit 1 + fi + cd "${CURRENT_DIR}/drm" +fi + +meson setup build \ + --prefix=/usr/local \ + --buildtype=release \ + -Damdgpu=enabled \ + -Dradeon=enabled \ + -Dintel=disabled \ + -Dnouveau=disabled \ + -Dvmwgfx=disabled \ + -Dtests=false + +ninja -C build +ninja -C build install + +# Make the freshly installed libdrm visible to pkg-config and the linker +export PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH:-}" +export LD_LIBRARY_PATH="/usr/local/lib64:/usr/local/lib:${LD_LIBRARY_PATH:-}" +echo "libdrm installed: $(pkg-config --modversion libdrm)" + +cd "${CURRENT_DIR}" + +# --------------------------------------------------------------------------- +# Build jsoncpp from source +# jsoncpp-devel is not available in any RHEL 10 / EPEL 10 repository. +# The Mooncake CMake build requires JsonCpp headers and library at configure +# time (FindJsonCpp.cmake). We build the upstream release and install it into +# /usr/local so CMake can find it via find_package / pkg-config. +# --------------------------------------------------------------------------- +JSONCPP_VERSION=${JSONCPP_VERSION:-"1.9.6"} +JSONCPP_URL="https://github.com/open-source-parsers/jsoncpp.git" + +echo "Building jsoncpp ${JSONCPP_VERSION} from source" +if [ -d "${CURRENT_DIR}/jsoncpp" ]; then + echo "jsoncpp directory already exists, reusing." + cd "${CURRENT_DIR}/jsoncpp" + git checkout "$JSONCPP_VERSION" +else + if ! git clone --branch "$JSONCPP_VERSION" --depth 1 "$JSONCPP_URL" "${CURRENT_DIR}/jsoncpp"; then + echo "ERROR: Failed to clone jsoncpp ${JSONCPP_VERSION}" + exit 1 + fi + cd "${CURRENT_DIR}/jsoncpp" +fi + +cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DBUILD_SHARED_LIBS=ON \ + -DJSONCPP_WITH_TESTS=OFF \ + -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF +cmake --build build --parallel "$(nproc)" +cmake --install build + +echo "jsoncpp installed: $(pkg-config --modversion jsoncpp)" + +cd "${CURRENT_DIR}" + +# --------------------------------------------------------------------------- +# MODE: rpms — install ROCm from a provided RPM repository +# --------------------------------------------------------------------------- +if [[ "$ROCM_INSTALL_MODE" == "rpms" ]]; then + if [[ ! "$ROCM_REPO_URL" =~ ^(https?|file):// ]]; then + echo "ERROR: ROCM_REPO_URL does not look like a valid URL (got: ${ROCM_REPO_URL})" + exit 1 + fi + echo "Installing ROCm from ${ROCM_REPO_URL}" + + ROCM_GPG_URL="https://public.dhe.ibm.com/software/server/POWER/Linux/AMD/RPM-GPG-KEY-PAMD" + ROCM_GPG_PATH="/etc/pki/rpm-gpg/RPM-GPG-KEY-PAMD" + echo "Importing ROCm GPG key from ${ROCM_GPG_URL}" + wget -q -O "${ROCM_GPG_PATH}" "${ROCM_GPG_URL}" + rpm --import "${ROCM_GPG_PATH}" + + cat > /etc/yum.repos.d/rocm.repo </dev/null; then + echo "ERROR: hipcc not found under ROCM_PATH=${ROCM_PATH}. Check your ROCm installation." + exit 1 +fi +echo "ROCm hipcc: $(hipcc --version | head -1)" + +# --------------------------------------------------------------------------- +# Clone Mooncake +# --------------------------------------------------------------------------- +echo "Cloning Mooncake ${PACKAGE_VERSION}" +if [ -d "${CURRENT_DIR}/Mooncake/.git" ]; then + echo "Mooncake directory already exists, reusing." + cd "${CURRENT_DIR}/Mooncake" + git fetch --tags origin + git checkout "$PACKAGE_VERSION" +else + if ! git clone --branch "$PACKAGE_VERSION" --depth 1 "$PACKAGE_URL" "${CURRENT_DIR}/Mooncake"; then + echo "------------------$PACKAGE_NAME:clone_fails---------------------------------------" + echo "$PACKAGE_URL $PACKAGE_NAME" + echo "$PACKAGE_NAME | $PACKAGE_URL | $PACKAGE_VERSION | GitHub | Fail | Clone_Fails" + exit 1 + fi + cd "${CURRENT_DIR}/Mooncake" +fi + +git submodule sync +git submodule update --init --recursive + +echo "Current Mooncake commit:" +git --no-pager log -1 --oneline + +# --------------------------------------------------------------------------- +# Patch pyproject.toml: fix package name and version +# +# Mooncake's upstream pyproject.toml has two problems for our use case: +# 1. name = "mooncake-transfer-engine" — but vLLM v0.31.0 requires +# "mooncake-transfer-engine-rocm >= 0.3.13" in requirements/rocm.txt. +# The -rocm suffix distinguishes this ROCm wheel from a hypothetical +# CPU-only or CUDA build on PyPI. +# 2. version = "0.3.12.post1" — the upstream forgot to bump pyproject.toml +# when tagging v0.3.13.post1. We set it to match the tag we are building. +# --------------------------------------------------------------------------- +cd "${CURRENT_DIR}/Mooncake" +$PYTHON - <<'PY' +from pathlib import Path +import re + +p = Path("pyproject.toml") +text = p.read_text() + +# Fix name +old_name = 'name = "mooncake-transfer-engine"' +new_name = 'name = "mooncake-transfer-engine-rocm"' +if old_name in text: + text = text.replace(old_name, new_name, 1) + print(f"Patched pyproject.toml: name -> mooncake-transfer-engine-rocm") +elif new_name in text: + print("pyproject.toml name already correct") +else: + raise SystemExit("ERROR: could not find expected name field in pyproject.toml") + +# Fix version — replace whatever version is there with the tag version +text = re.sub(r'^version = "[^"]+"', 'version = "0.3.13.post1"', text, count=1, flags=re.MULTILINE) +print("Patched pyproject.toml: version -> 0.3.13.post1") + +p.write_text(text) +PY + +# --------------------------------------------------------------------------- +# Install Python build dependencies +# --------------------------------------------------------------------------- +$PYTHON -m pip install --upgrade pip +# Use --ignore-installed to avoid conflicts with RPM-managed packages +# (e.g. setuptools installed by the system python3.12 RPM has no RECORD file +# and pip cannot uninstall it — ignore-installed overlays our versions on top). +$PYTHON -m pip install --upgrade --ignore-installed \ + "scikit-build-core>=1.0" \ + "pybind11>=2.13" \ + "numpy>=1.24" \ + "setuptools>=61" \ + wheel + +# --------------------------------------------------------------------------- +# Build mooncake-transfer-engine wheel with ROCm/HIP support +# +# scikit-build-core is the build backend (pyproject.toml). CMake options are +# passed via SKBUILD_CMAKE_ARGS. We enable USE_HIP and point CMake at the +# ROCm HIP CMake config, then disable every Go/SPDK/optional component that +# is not needed for the wheel and not available on ppc64le UBI 10. +# +# USE_CUDA is explicitly disabled (default OFF in pyproject.toml but set here +# for clarity) so cmake does not auto-enable it when USE_HIP is found. +# WITH_STORE=OFF disables the mooncake-store C++ library, which requires Boost +# headers (boost/functional/hash.hpp, boost/uuid/uuid.hpp) that are not +# available in RHEL 10. The transfer engine itself does not need the store. +# WITH_STORE_RUST=OFF must accompany WITH_STORE=OFF (CMake enforces this). +# WITH_STORE_GO / WITH_P2P_STORE are also disabled for completeness. +# --------------------------------------------------------------------------- + +export CMAKE_PREFIX_PATH="${ROCM_PATH}/lib/cmake:${ROCM_PATH}:${CMAKE_PREFIX_PATH:-}" + +SKBUILD_CMAKE_ARGS="-DUSE_HIP=ON" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DUSE_CUDA=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DWITH_STORE=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DWITH_STORE_RUST=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DWITH_STORE_GO=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DWITH_P2P_STORE=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DWITH_EP=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DBUILD_BENCHMARK=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DBUILD_UNIT_TESTS=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DBUILD_EXAMPLES=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DUSE_ETCD=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DSTORE_USE_ETCD=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DSTORE_USE_K8S_LEASE=OFF" +SKBUILD_CMAKE_ARGS="${SKBUILD_CMAKE_ARGS};-DCMAKE_BUILD_TYPE=Release" +export SKBUILD_CMAKE_ARGS + +cd "${CURRENT_DIR}/Mooncake" +echo "Building mooncake-transfer-engine-rocm wheel (this will take a while)" +if ! MAX_JOBS=$(nproc) $PYTHON -m pip wheel . \ + --no-build-isolation \ + --no-deps \ + -w "${CURRENT_DIR}/dist"; then + echo "------------------$PACKAGE_NAME:Install_fails-------------------------------------" + echo "$PACKAGE_URL $PACKAGE_NAME" + echo "$PACKAGE_NAME | $PACKAGE_URL | $PACKAGE_VERSION | $OS_NAME | GitHub | Fail | Install_Fails" + exit 1 +fi + +echo "Built mooncake wheel(s):" +ls -lh "${CURRENT_DIR}/dist"/mooncake*.whl + +# --------------------------------------------------------------------------- +# Install the wheel and its runtime dependencies +# --------------------------------------------------------------------------- +$PYTHON -m pip install \ + --prefer-binary \ + --extra-index-url "${DEVPI_INDEX}" \ + aiohttp msgpack requests + +$PYTHON -m pip install "${CURRENT_DIR}/dist"/mooncake*.whl + +# --------------------------------------------------------------------------- +# Import test +# --------------------------------------------------------------------------- +echo "Running import test" +cd "${CURRENT_DIR}" + +# mooncake does not expose __version__ on the package. +# Import mooncake.engine (the pybind11 C extension) to confirm the native .so +# loaded cleanly, then report the installed wheel version via importlib. +if ! $PYTHON -c " +import mooncake +import mooncake.engine +import importlib.metadata +ver = importlib.metadata.version('mooncake-transfer-engine-rocm') +print('mooncake-transfer-engine version:', ver) +print('mooncake.engine loaded:', mooncake.engine) +"; then + echo "------------------$PACKAGE_NAME:Install_success_but_test_fails---------------------" + echo "$PACKAGE_URL $PACKAGE_NAME" + echo "$PACKAGE_NAME | $PACKAGE_URL | $PACKAGE_VERSION | $OS_NAME | GitHub | Fail | Install_success_but_test_Fails" + exit 2 +else + echo "------------------$PACKAGE_NAME:Install_&_test_both_success-------------------------" + echo "$PACKAGE_URL $PACKAGE_NAME" + echo "$PACKAGE_NAME | $PACKAGE_URL | $PACKAGE_VERSION | $OS_NAME | GitHub | Pass | Both_Install_and_Test_Success" + exit 0 +fi