Skip to content

Commit 7df471c

Browse files
Migrate wheel builds to wanda (x86_64)
This migrates ray wheel builds from CLI-based approach to wanda-based container builds for x86_64. Changes: - Add ray-wheel.wanda.yaml and Dockerfile for wheel builds - Update build.rayci.yml wheel steps to use wanda - Add wheel upload steps that extract from wanda cache Topic: ray-wheel Signed-off-by: andrew <[email protected]>
1 parent 0da3533 commit 7df471c

File tree

4 files changed

+188
-6
lines changed

4 files changed

+188
-6
lines changed

.buildkite/build.rayci.yml

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,46 @@ steps:
3535
HOSTTYPE: "x86_64"
3636
MANYLINUX_VERSION: "260103.868e54c"
3737

38-
- label: ":tapioca: build: wheel {{matrix}} (x86_64)"
39-
key: linux_wheels
38+
- name: ray-wheel-build
39+
label: "wanda: wheel py{{matrix}} (x86_64)"
40+
wanda: ci/docker/ray-wheel.wanda.yaml
41+
matrix:
42+
- "3.10"
43+
- "3.11"
44+
- "3.12"
45+
- "3.13"
46+
env:
47+
PYTHON_VERSION: "{{matrix}}"
48+
ARCH_SUFFIX: ""
49+
HOSTTYPE: "x86_64"
50+
MANYLINUX_VERSION: "260103.868e54c"
4051
tags:
4152
- release_wheels
4253
- linux_wheels
4354
- oss
44-
instance_type: large
55+
depends_on:
56+
- ray-core-build
57+
- ray-java-build
58+
- ray-dashboard-build
59+
60+
# Upload wheels to S3
61+
- label: ":s3: upload: wheel py{{matrix}} (x86_64)"
62+
key: linux_wheels_upload
63+
instance_type: small
4564
commands:
46-
- bazel run //ci/ray_ci:build_in_docker -- wheel --python-version {{matrix}} --architecture x86_64 --upload
65+
- ./ci/build/extract_wanda_wheels.sh ray-wheel-py{{matrix}}
66+
- ./ci/build/copy_build_artifacts.sh wheel
4767
matrix:
4868
- "3.10"
4969
- "3.11"
5070
- "3.12"
5171
- "3.13"
5272
depends_on:
53-
- manylinux-x86_64
54-
- forge
73+
- ray-wheel-build
74+
tags:
75+
- release_wheels
76+
- skip-on-premerge
77+
- oss
5578

5679
- label: ":tapioca: build: jar"
5780
key: java_wheels

ci/build/extract_wanda_wheels.sh

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/bin/bash
2+
3+
set -exuo pipefail
4+
5+
# Extract wheels from a Wanda-cached image.
6+
#
7+
# Usage: ./ci/build/extract_wanda_wheels.sh <wanda_image_name>
8+
#
9+
# Example:
10+
# ./ci/build/extract_wanda_wheels.sh ray-wheel-py3.10
11+
#
12+
# The script will:
13+
# 1. Export the wanda image using crane
14+
# 2. Extract .whl files from the tarball
15+
# 3. Move them to .whl/ directory (clears existing wheels first)
16+
17+
WANDA_IMAGE_NAME=${1:?Usage: $0 <wanda_image_name>}
18+
19+
# Construct full image tag from environment
20+
WANDA_IMAGE="${RAYCI_WORK_REPO}:${RAYCI_BUILD_ID}-${WANDA_IMAGE_NAME}"
21+
22+
echo "Extracting wheels from: ${WANDA_IMAGE}"
23+
24+
tmpdir="$(mktemp -d)"
25+
trap 'rm -rf "$tmpdir" || true' EXIT
26+
27+
# Export image and extract to temp dir
28+
crane export "${WANDA_IMAGE}" - | tar -xf - -C "$tmpdir"
29+
30+
# Clear existing wheels to avoid stale files from previous runs
31+
rm -rf .whl
32+
mkdir -p .whl
33+
34+
# Move extracted wheels to .whl/
35+
find "${tmpdir}" -type f -name '*.whl' -exec mv {} .whl/ \;
36+
37+
# Verify that wheels were actually extracted
38+
wheels=($(find .whl -maxdepth 1 -name '*.whl'))
39+
if (( ${#wheels[@]} == 0 )); then
40+
echo "ERROR: No wheel files were extracted from image: ${WANDA_IMAGE}" >&2
41+
echo "This may indicate image corruption, incorrect image tag, or path issues." >&2
42+
exit 1
43+
fi
44+
45+
echo "Extracted ${#wheels[@]} wheel(s):"
46+
ls -la .whl/

ci/docker/ray-wheel.Dockerfile

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# syntax=docker/dockerfile:1.3-labs
2+
#
3+
# Ray Wheel Builder
4+
# =================
5+
# Builds manylinux2014-compatible ray wheel using pre-built C++ artifacts from wanda cache.
6+
#
7+
# GLIBC Compatibility:
8+
# --------------------
9+
# manylinux2014 requires GLIBC <= 2.17 for broad Linux compatibility.
10+
# The pre-built _raylet.so is compiled inside manylinux2014 with GLIBC 2.17.
11+
#
12+
13+
ARG RAY_CORE_IMAGE
14+
ARG RAY_JAVA_IMAGE
15+
ARG RAY_DASHBOARD_IMAGE
16+
ARG MANYLINUX_VERSION
17+
ARG HOSTTYPE
18+
19+
FROM ${RAY_CORE_IMAGE} AS ray-core
20+
FROM ${RAY_JAVA_IMAGE} AS ray-java
21+
FROM ${RAY_DASHBOARD_IMAGE} AS ray-dashboard
22+
23+
# Main build stage - manylinux2014 provides GLIBC 2.17
24+
FROM rayproject/manylinux2014:${MANYLINUX_VERSION}-jdk-${HOSTTYPE} AS builder
25+
26+
ARG PYTHON_VERSION=3.10
27+
ARG BUILDKITE_COMMIT
28+
29+
WORKDIR /home/forge/ray
30+
31+
# Copy artifacts from all stages
32+
COPY --from=ray-core /ray_pkg.zip /tmp/
33+
COPY --from=ray-core /ray_py_proto.zip /tmp/
34+
COPY --from=ray-java /ray_java_pkg.zip /tmp/
35+
COPY --from=ray-dashboard /dashboard.tar.gz /tmp/
36+
37+
# Source files needed for wheel build
38+
COPY --chown=forge ci/build/build-manylinux-wheel.sh ci/build/
39+
COPY --chown=forge README.rst pyproject.toml ./
40+
COPY --chown=forge rllib/ rllib/
41+
COPY --chown=forge python/ python/
42+
43+
USER forge
44+
# - BUILDKITE_COMMIT: Used for ray.__commit__. Defaults to "unknown" for local builds.
45+
ENV PYTHON_VERSION=${PYTHON_VERSION} \
46+
BUILDKITE_COMMIT=${BUILDKITE_COMMIT:-unknown}
47+
RUN <<'EOF'
48+
#!/bin/bash
49+
set -euo pipefail
50+
51+
# Clean extraction dirs to avoid stale leftovers
52+
rm -rf /tmp/ray_pkg /tmp/ray_java_pkg
53+
mkdir -p /tmp/ray_pkg /tmp/ray_java_pkg
54+
55+
# Unpack pre-built artifacts
56+
unzip -o /tmp/ray_pkg.zip -d /tmp/ray_pkg
57+
unzip -o /tmp/ray_py_proto.zip -d python/
58+
unzip -o /tmp/ray_java_pkg.zip -d /tmp/ray_java_pkg
59+
mkdir -p python/ray/dashboard/client/build
60+
tar -xzf /tmp/dashboard.tar.gz -C python/ray/dashboard/client/build/
61+
62+
# C++ core artifacts
63+
cp -r /tmp/ray_pkg/ray/* python/ray/
64+
65+
# Java JARs
66+
cp -r /tmp/ray_java_pkg/ray/* python/ray/
67+
68+
# Build ray wheel
69+
PY_VERSION="${PYTHON_VERSION//./}"
70+
PY_BIN="cp${PY_VERSION}-cp${PY_VERSION}"
71+
SKIP_BAZEL_BUILD=1 RAY_DISABLE_EXTRA_CPP=1 \
72+
./ci/build/build-manylinux-wheel.sh "$PY_BIN"
73+
74+
# Sanity check: ensure wheels exist
75+
if [[ ! -d .whl ]]; then
76+
echo "ERROR: .whl directory not created"
77+
exit 1
78+
fi
79+
wheels=($(find .whl -maxdepth 1 -name '*.whl'))
80+
if (( ${#wheels[@]} == 0 )); then
81+
echo "ERROR: No wheels produced in .whl/"
82+
ls -la .whl
83+
exit 1
84+
fi
85+
86+
EOF
87+
88+
FROM scratch
89+
COPY --from=builder /home/forge/ray/.whl/*.whl /

ci/docker/ray-wheel.wanda.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: "ray-wheel-py$PYTHON_VERSION$ARCH_SUFFIX"
2+
disable_caching: true
3+
froms:
4+
- "rayproject/manylinux2014:$MANYLINUX_VERSION-jdk-$HOSTTYPE"
5+
- "cr.ray.io/rayproject/ray-core-py$PYTHON_VERSION$ARCH_SUFFIX" # C++ binaries (ray_pkg.zip)
6+
- "cr.ray.io/rayproject/ray-java-build$ARCH_SUFFIX" # Java JARs
7+
- "cr.ray.io/rayproject/ray-dashboard" # Dashboard
8+
dockerfile: ci/docker/ray-wheel.Dockerfile
9+
srcs:
10+
- pyproject.toml
11+
- README.rst
12+
- ci/build/build-manylinux-wheel.sh
13+
- python/
14+
- rllib/
15+
build_args:
16+
- PYTHON_VERSION
17+
- MANYLINUX_VERSION
18+
- HOSTTYPE
19+
- BUILDKITE_COMMIT
20+
- ARCH_SUFFIX
21+
- WHEEL_TYPE=ray
22+
- RAY_CORE_IMAGE=cr.ray.io/rayproject/ray-core-py$PYTHON_VERSION$ARCH_SUFFIX
23+
- RAY_JAVA_IMAGE=cr.ray.io/rayproject/ray-java-build$ARCH_SUFFIX
24+
- RAY_DASHBOARD_IMAGE=cr.ray.io/rayproject/ray-dashboard

0 commit comments

Comments
 (0)