Skip to content

Commit be3f4b3

Browse files
committed
Enable s390x support for runtime-datascience (Python 3.11 & 3.12)
Signed-off-by: Nishan Acharya <[email protected]>
1 parent e76862e commit be3f4b3

File tree

5 files changed

+234
-11
lines changed

5 files changed

+234
-11
lines changed

ci/cached-builds/gen_gha_matrix_jobs.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
S390X_COMPATIBLE = {
3434
"runtime-minimal-ubi9-python-3.11",
3535
"runtime-minimal-ubi9-python-3.12",
36+
"runtime-datascience-ubi9-python-3.11",
37+
"runtime-datascience-ubi9-python-3.12",
3638
# add more here
3739
}
3840

runtimes/datascience/ubi9-python-3.11/Dockerfile.cpu

Lines changed: 109 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,40 @@ WORKDIR /opt/app-root/bin
88
# OS Packages needs to be installed as root
99
USER 0
1010

11-
# Install useful OS packages
12-
RUN dnf install -y mesa-libGL skopeo && dnf clean all && rm -rf /var/cache/yum
11+
ARG TARGETARCH
12+
13+
# Install useful OS packages (and dev tools for s390x only)
14+
RUN --mount=type=cache,target=/var/cache/dnf \
15+
echo "Building for architecture: ${TARGETARCH}" && \
16+
if [ "$TARGETARCH" = "s390x" ]; then \
17+
PACKAGES="mesa-libGL skopeo gcc gcc-c++ make openssl-devel autoconf automake libtool cmake python3-devel pybind11-devel openblas-devel unixODBC-devel openssl zlib-devel"; \
18+
else \
19+
PACKAGES="mesa-libGL skopeo"; \
20+
fi && \
21+
echo "Installing: $PACKAGES" && \
22+
dnf install -y --nogpgcheck --allowerasing --nobest $PACKAGES && \
23+
dnf clean all && rm -rf /var/cache/yum
24+
25+
# Install Rust and set environment variables (s390x only)
26+
RUN if [ "$TARGETARCH" = "s390x" ]; then \
27+
mkdir -p /opt/.cargo && \
28+
export HOME=/root && \
29+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rustup-init.sh && \
30+
chmod +x rustup-init.sh && \
31+
CARGO_HOME=/opt/.cargo ./rustup-init.sh -y --no-modify-path && \
32+
rm -f rustup-init.sh && \
33+
chown -R 1001:0 /opt/.cargo && \
34+
echo 'export PATH=/opt/.cargo/bin:$PATH' >> /etc/profile.d/cargo.sh && \
35+
echo 'export CARGO_HOME=/opt/.cargo' >> /etc/profile.d/cargo.sh && \
36+
echo 'export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1' >> /etc/profile.d/cargo.sh; \
37+
fi
38+
39+
# Set python alternatives for s390x only
40+
RUN if [ "$TARGETARCH" = "s390x" ]; then \
41+
alternatives --install /usr/bin/python python /usr/bin/python3.11 1 && \
42+
alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 && \
43+
python --version && python3 --version; \
44+
fi
1345

1446
# Other apps and tools installed as default user
1547
USER 1001
@@ -24,11 +56,62 @@ RUN curl -L https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/oc
2456
rm -f /tmp/openshift-client-linux.tar.gz
2557
# Install the oc client end
2658

59+
##############################
60+
# wheel-builder stage #
61+
##############################
62+
FROM base AS s390x-builder
63+
64+
USER 0
65+
WORKDIR /tmp/build-wheels
66+
ARG TARGETARCH
67+
68+
RUN echo "s390x-builder stage TARGETARCH: ${TARGETARCH}"
69+
70+
RUN --mount=type=cache,target=/root/.cache/pip \
71+
--mount=type=cache,target=/root/.cache/dnf \
72+
if [ "$TARGETARCH" = "s390x" ]; then \
73+
echo "Building pyarrow wheel for s390x..." && \
74+
dnf install -y cmake make gcc-c++ pybind11-devel wget && \
75+
dnf clean all && \
76+
git clone --depth 1 https://github.com/apache/arrow.git && \
77+
cd arrow/cpp && \
78+
mkdir release && cd release && \
79+
cmake -DCMAKE_BUILD_TYPE=Release \
80+
-DCMAKE_INSTALL_PREFIX=/usr/local \
81+
-DARROW_PYTHON=ON \
82+
-DARROW_PARQUET=ON \
83+
-DARROW_ORC=ON \
84+
-DARROW_FILESYSTEM=ON \
85+
-DARROW_JSON=ON \
86+
-DARROW_CSV=ON \
87+
-DARROW_DATASET=ON \
88+
-DARROW_DEPENDENCY_SOURCE=BUNDLED \
89+
-DCMAKE_CXX_FLAGS="-O3 -march=z14 -mtune=z14" \
90+
-DCMAKE_C_FLAGS="-O3 -march=z14 -mtune=z14" \
91+
.. && \
92+
make -j$(nproc) && \
93+
make install && \
94+
cd ../../python && \
95+
pip install --no-cache-dir -U pip wheel setuptools && \
96+
pip install --no-cache-dir -r requirements-build.txt && \
97+
export PYARROW_PARALLEL=$(nproc) && \
98+
export ARROW_BUILD_TYPE=release && \
99+
CFLAGS="-O3 -march=z14 -mtune=z14" \
100+
CXXFLAGS="-O3 -march=z14 -mtune=z14" \
101+
python setup.py build_ext --build-type=release --bundle-arrow-cpp bdist_wheel && \
102+
mkdir -p /tmp/wheels && \
103+
cp dist/pyarrow-*.whl /tmp/wheels/ && \
104+
ls -la /tmp/wheels/; \
105+
else \
106+
echo "Not s390x, skipping wheel build" && mkdir -p /tmp/wheels; \
107+
fi
108+
27109
#######################
28110
# runtime-datascience #
29111
#######################
30112
FROM base AS runtime-datascience
31113

114+
ARG TARGETARCH
32115
ARG DATASCIENCE_SOURCE_CODE=runtimes/datascience/ubi9-python-3.11
33116

34117
LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.11" \
@@ -42,16 +125,37 @@ LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.11" \
42125
io.openshift.build.image="quay.io/opendatahub/workbench-images:runtime-datascience-ubi9-python-3.11"
43126

44127
WORKDIR /opt/app-root/bin
128+
USER 0
129+
130+
# Install s390x-built wheels if available
131+
COPY --from=s390x-builder /tmp/wheels /tmp/wheels
132+
RUN if [ "$TARGETARCH" = "s390x" ]; then \
133+
echo "Installing s390x wheels..." && \
134+
WHEELS=$(find /tmp/wheels/ -name "pyarrow-*.whl") && \
135+
if [ -n "$WHEELS" ]; then \
136+
pip install --no-cache-dir $WHEELS && \
137+
echo "Wheel install complete"; \
138+
else \
139+
echo "No pyarrow wheel found!" && exit 1; \
140+
fi && rm -rf /tmp/wheels; \
141+
else \
142+
echo "Skipping wheel install on non-s390x (${TARGETARCH})"; \
143+
fi
45144

46145
# Install Python packages from Pipfile.lock
47146
COPY ${DATASCIENCE_SOURCE_CODE}/Pipfile.lock ./
48147
# Copy Elyra dependencies for air-gapped enviroment
49148
COPY ${DATASCIENCE_SOURCE_CODE}/utils ./utils/
50149

51-
RUN echo "Installing softwares and packages" && \
52-
micropipenv install && \
150+
RUN --mount=type=cache,target=/root/.cache/pip \
151+
echo "Installing softwares and packages" && \
152+
if [ "$TARGETARCH" = "s390x" ]; then \
153+
GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 CFLAGS="-O3" CXXFLAGS="-O3" micropipenv install; \
154+
else \
155+
micropipenv install; \
156+
fi && \
53157
rm -f ./Pipfile.lock && \
54-
# Fix permissions to support pip in Openshift environments \
158+
# Fix permissions to support pip in Openshift environments
55159
chmod -R g+w /opt/app-root/lib/python3.11/site-packages && \
56160
fix-permissions /opt/app-root -P
57161

runtimes/datascience/ubi9-python-3.11/Pipfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ scikit-learn = "~=1.6.1"
1717
scipy = "~=1.15.2"
1818
skl2onnx = "~=1.18.0"
1919
onnxconverter-common = "~=1.13.0" # Required for skl2onnx, as upgraded version is not compatible with protobuf
20-
codeflare-sdk = "~=0.30.0"
20+
21+
# Exclude these packages on s390x architecture due to compatibility
22+
codeflare-sdk = {version = "~=0.30.0", markers = "platform_machine != 's390x'"}
23+
py-spy = {version = "~=0.4.0", markers = "platform_machine != 's390x'"}
24+
ray = {version = "~=2.47.1", markers = "platform_machine != 's390x'", extras = ["data", "default"]}
25+
pyarrow = {version = "~=21.0.0", markers = "platform_machine != 's390x'"}
2126

2227
# DB connectors
2328
pymongo = "~=4.11.2"

runtimes/datascience/ubi9-python-3.12/Dockerfile.cpu

Lines changed: 111 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,48 @@
33
####################
44
FROM registry.access.redhat.com/ubi9/python-312:latest AS base
55

6+
ARG TARGETARCH
7+
68
WORKDIR /opt/app-root/bin
79

810
# OS Packages needs to be installed as root
911
USER 0
1012

1113
# Install useful OS packages
12-
RUN dnf install -y mesa-libGL skopeo libxcrypt-compat && dnf clean all && rm -rf /var/cache/yum
14+
RUN --mount=type=cache,target=/var/cache/dnf \
15+
echo "Building for architecture: ${TARGETARCH}" && \
16+
PACKAGES="mesa-libGL skopeo libxcrypt-compat" && \
17+
# Additional dev tools only for s390x
18+
if [ "$TARGETARCH" = "s390x" ]; then \
19+
PACKAGES="$PACKAGES gcc gcc-c++ make openssl-devel autoconf automake libtool cmake python3-devel pybind11-devel openblas-devel unixODBC-devel openssl zlib-devel"; \
20+
fi && \
21+
if [ -n "$PACKAGES" ]; then \
22+
dnf install -y --nogpgcheck --allowerasing --nobest $PACKAGES && \
23+
dnf clean all && rm -rf /var/cache/yum; \
24+
fi
25+
26+
# For s390x only, set ENV vars and install Rust
27+
RUN if [ "$TARGETARCH" = "s390x" ]; then \
28+
# Install Rust and set up environment
29+
mkdir -p /opt/.cargo && \
30+
export HOME=/root && \
31+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rustup-init.sh && \
32+
chmod +x rustup-init.sh && \
33+
CARGO_HOME=/opt/.cargo HOME=/root ./rustup-init.sh -y --no-modify-path && \
34+
rm -f rustup-init.sh && \
35+
chown -R 1001:0 /opt/.cargo && \
36+
# Set environment variables
37+
echo 'export PATH=/opt/.cargo/bin:$PATH' >> /etc/profile.d/cargo.sh && \
38+
echo 'export CARGO_HOME=/opt/.cargo' >> /etc/profile.d/cargo.sh && \
39+
echo 'export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1' >> /etc/profile.d/cargo.sh; \
40+
fi
41+
42+
# Set python alternatives only for s390x (not needed for other arches)
43+
RUN if [ "$TARGETARCH" = "s390x" ]; then \
44+
alternatives --install /usr/bin/python python /usr/bin/python3.12 1 && \
45+
alternatives --install /usr/bin/python3 python3 /usr/bin/python3.12 1 && \
46+
python --version && python3 --version; \
47+
fi
1348

1449
# Other apps and tools installed as default user
1550
USER 1001
@@ -24,11 +59,69 @@ RUN curl -L https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/oc
2459
rm -f /tmp/openshift-client-linux.tar.gz
2560
# Install the oc client end
2661

62+
##############################
63+
# wheel-builder stage #
64+
# NOTE: Only used in s390x
65+
##############################
66+
FROM base AS s390x-builder
67+
68+
ARG TARGETARCH
69+
USER 0
70+
WORKDIR /tmp/build-wheels
71+
72+
# Build pyarrow optimized for s390x
73+
RUN --mount=type=cache,target=/root/.cache/pip \
74+
--mount=type=cache,target=/root/.cache/dnf \
75+
if [ "$TARGETARCH" = "s390x" ]; then \
76+
# Install build dependencies (shared for pyarrow and onnx)
77+
dnf install -y cmake make gcc-c++ pybind11-devel wget && \
78+
dnf clean all && \
79+
# Build and collect pyarrow wheel
80+
git clone --depth 1 https://github.com/apache/arrow.git && \
81+
cd arrow/cpp && \
82+
mkdir release && cd release && \
83+
cmake -DCMAKE_BUILD_TYPE=Release \
84+
-DCMAKE_INSTALL_PREFIX=/usr/local \
85+
-DARROW_PYTHON=ON \
86+
-DARROW_PARQUET=ON \
87+
-DARROW_ORC=ON \
88+
-DARROW_FILESYSTEM=ON \
89+
-DARROW_JSON=ON \
90+
-DARROW_CSV=ON \
91+
-DARROW_DATASET=ON \
92+
-DARROW_DEPENDENCY_SOURCE=BUNDLED \
93+
-DARROW_WITH_LZ4=OFF \
94+
-DARROW_WITH_ZSTD=OFF \
95+
-DARROW_WITH_SNAPPY=OFF \
96+
-DARROW_BUILD_TESTS=OFF \
97+
-DARROW_BUILD_BENCHMARKS=OFF \
98+
.. && \
99+
make -j$(nproc) VERBOSE=1 && \
100+
make install -j$(nproc) && \
101+
cd ../../python && \
102+
pip install --no-cache-dir -r requirements-build.txt && \
103+
PYARROW_WITH_PARQUET=1 \
104+
PYARROW_WITH_DATASET=1 \
105+
PYARROW_WITH_FILESYSTEM=1 \
106+
PYARROW_WITH_JSON=1 \
107+
PYARROW_WITH_CSV=1 \
108+
PYARROW_PARALLEL=$(nproc) \
109+
python setup.py build_ext --build-type=release --bundle-arrow-cpp bdist_wheel && \
110+
mkdir -p /tmp/wheels && \
111+
cp dist/pyarrow-*.whl /tmp/wheels/ && \
112+
# Ensure wheels directory exists and has content
113+
ls -la /tmp/wheels/; \
114+
else \
115+
# Create empty wheels directory for non-s390x
116+
mkdir -p /tmp/wheels; \
117+
fi
118+
27119
#######################
28120
# runtime-datascience #
29121
#######################
30122
FROM base AS runtime-datascience
31123

124+
ARG TARGETARCH
32125
ARG DATASCIENCE_SOURCE_CODE=runtimes/datascience/ubi9-python-3.12
33126

34127
LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.12" \
@@ -43,15 +136,29 @@ LABEL name="odh-notebook-runtime-datascience-ubi9-python-3.12" \
43136

44137
WORKDIR /opt/app-root/bin
45138

139+
USER 0
140+
# Copy wheels from build stage (s390x only)
141+
COPY --from=s390x-builder /tmp/wheels /tmp/wheels
142+
RUN if [ "$TARGETARCH" = "s390x" ]; then \
143+
pip install --no-cache-dir /tmp/wheels/*.whl && rm -rf /tmp/wheels; \
144+
else \
145+
echo "Skipping wheel install for $TARGETARCH"; \
146+
fi
147+
46148
# Install Python packages from Pipfile.lock
47149
COPY ${DATASCIENCE_SOURCE_CODE}/Pipfile.lock ./
48150
# Copy Elyra dependencies for air-gapped enviroment
49151
COPY ${DATASCIENCE_SOURCE_CODE}/utils ./utils/
50152

51-
RUN echo "Installing softwares and packages" && \
52-
micropipenv install && \
153+
RUN --mount=type=cache,target=/root/.cache/pip \
154+
echo "Installing softwares and packages" && \
155+
if [ "$TARGETARCH" = "s390x" ]; then \
156+
GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 CFLAGS="-O3" CXXFLAGS="-O3" micropipenv install; \
157+
else \
158+
micropipenv install; \
159+
fi && \
53160
rm -f ./Pipfile.lock && \
54-
# Fix permissions to support pip in Openshift environments \
161+
# Fix permissions to support pip in Openshift environments
55162
chmod -R g+w /opt/app-root/lib/python3.12/site-packages && \
56163
fix-permissions /opt/app-root -P
57164

runtimes/datascience/ubi9-python-3.12/Pipfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ scikit-learn = "~=1.6.1"
1717
scipy = "~=1.15.2"
1818
skl2onnx = "~=1.18.0"
1919
onnxconverter-common = "~=1.13.0" # Required for skl2onnx, as upgraded version is not compatible with protobuf
20-
codeflare-sdk = "~=0.29.0"
20+
21+
# Exclude these packages on s390x architecture due to compatibility
22+
codeflare-sdk = {version = "~=0.29.0", markers = "platform_machine != 's390x'"}
23+
py-spy = {version = "~=0.4.0", markers = "platform_machine != 's390x'"}
24+
ray = {version = "~=2.46.0", markers = "platform_machine != 's390x'", extras = ["data", "default"]}
25+
pyarrow = {version = "~=21.0.0", markers = "platform_machine != 's390x'"}
2126

2227
# DB connectors
2328
pymongo = "~=4.11.2"

0 commit comments

Comments
 (0)