Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a4c7a73
feat: add stable install testing for pip installs
gforsyth Apr 7, 2026
68e59ef
feat: add stable install testing for conda installs
gforsyth Apr 7, 2026
9bc9fbf
ci: add nightly test jobs for pip and conda stable installs
gforsyth Apr 7, 2026
5c3d9bc
refactor: apply suggestions from code review
gforsyth Apr 8, 2026
188e5c8
chore: remove defunct import script
gforsyth Apr 8, 2026
eac7264
refactor(ci): use matrix for arch selection
gforsyth Apr 8, 2026
e6e8f51
chore(release): bump stable rapids version for install checks
gforsyth Apr 8, 2026
f000c6d
refactor: add combined import test
gforsyth Apr 8, 2026
ca836f0
refactor(pip): download nvidia PyPI wheels and install upstream wheel…
gforsyth Apr 8, 2026
858fa3e
refactor(pip): test on cuda-toolkit major-minor
gforsyth Apr 8, 2026
b6bf46d
fix(imports): don't swallow import errors
gforsyth Apr 13, 2026
1597c63
revertme: add tests to `pr.yaml`
gforsyth Apr 13, 2026
80050f1
fix: source `test_imports` from CWD
gforsyth Apr 13, 2026
cd8e485
fix: source scripts relative to invocation directory
gforsyth Apr 13, 2026
0e78bc0
refactor: use `rapidsai/citestwheel` instead of `nvidia/cuda`
gforsyth Apr 13, 2026
a72cc90
fix: restore bootstrap uv install in pip script
gforsyth Apr 13, 2026
0d44f2d
chore: run newer minor versions first
gforsyth Apr 13, 2026
5b128ac
feat(imports): finish import tests but raise if any fail along the way
gforsyth Apr 13, 2026
0d88656
refactor: put minor version arrays at the top of the file for reference
gforsyth Apr 14, 2026
4476022
fix(env_setup): install explicit list of cuda-toolkit extras to avoid…
gforsyth Apr 14, 2026
d2dfd6b
fix: cleanup environment after each run so we don't run out of disk s…
gforsyth Apr 14, 2026
d518002
fix: remove nightly index from pip config
gforsyth Apr 15, 2026
78daa33
chore: update pip config mutation
gforsyth Apr 20, 2026
7ed84f4
fix: shift operator into array elements to loosen ctk12.2 bound
gforsyth Apr 20, 2026
5ab9e43
refactor: error if output contains error messages
gforsyth Apr 21, 2026
1be7ebf
fix: don't import `cucim` on cpu-only
gforsyth Apr 21, 2026
f1bb840
chore: remove tests from pr.yaml, restore in test.yaml
gforsyth Apr 22, 2026
17a1749
refactor: use compute-matrix to fan out jobs
gforsyth Apr 22, 2026
076fcf3
refactor(pip): remove looping from test script, require CUDA_VER and …
gforsyth Apr 22, 2026
7f96dcf
refactor(conda): remove looping from test script, require CUDA_VER an…
gforsyth Apr 22, 2026
dd30e2b
fix(ci): use correct node_type label
gforsyth Apr 22, 2026
c1a663d
fix(pip): fix container image name construction
gforsyth Apr 22, 2026
50721f0
fix(conda): strip patch version when installing `cuda-version`
gforsyth Apr 22, 2026
b359965
fix(pip): move `pip.conf` manually until we have 26.06 images
gforsyth Apr 22, 2026
3cd80a8
refactor: pass imports array to function, sort imports
gforsyth Apr 22, 2026
8a6ac7d
fix(pip): install rapidsmpf and cudf-polars, add branch for 12.2 arm
gforsyth Apr 22, 2026
b4ffdcf
fix(shellcheck): ignore unused variable warning for passing by name
gforsyth Apr 22, 2026
34bb97a
refactor: use compute-matrix in `test.yaml`
gforsyth Apr 22, 2026
c542852
fix(update-version): set stable install test to latest stable release
gforsyth Apr 22, 2026
1fec84b
chore: restore `conda-nightly-env` test and remove stable install che…
gforsyth Apr 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,63 @@ jobs:
script: "ci/test_conda_nightly_env.sh"
# just using the workflow to get the matrix, this isn't actually building anything we want to upload
upload-artifacts: false
test-stable-install-pip-cuda-12-amd64:
secrets: inherit
Comment thread
gforsyth marked this conversation as resolved.
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main
with:
build_type: pull-request
node_type: "cpu4"
arch: "amd64"
container_image: "nvidia/cuda:12.9.1-base-ubuntu-24.04"
script: |
./ci/stable_install/install_and_test_pip.sh --cuda cu12
test-stable-install-pip-cuda-13-amd64:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could cut the number of jobs here in half by having matrix elements inside of each of these for amd64 and arm64. Like this: https://github.com/rapidsai/cuvs/blob/cbb9db5697eeebcb03a6ed198b7d4386ce14a301/.github/workflows/pr.yaml#L365-L374

Will you consider that?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That language was a little imprecise... cut the number of configurations in half. The number of jobs would be unchanged.

secrets: inherit
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main
with:
build_type: pull-request
node_type: "cpu4"
arch: "amd64"
container_image: "nvidia/cuda:13.2.0-base-ubuntu-24.04"
script: |
./ci/stable_install/install_and_test_pip.sh --cuda cu13
test-stable-install-pip-cuda-12-arm64:
secrets: inherit
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main
with:
build_type: pull-request
node_type: "cpu4"
arch: "arm64"
container_image: "nvidia/cuda:12.9.1-base-ubuntu-24.04"
script: |
./ci/stable_install/install_and_test_pip.sh --cuda cu12
test-stable-install-pip-cuda-13-arm64:
secrets: inherit
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main
with:
build_type: pull-request
node_type: "cpu4"
arch: "arm64"
container_image: "nvidia/cuda:13.2.0-base-ubuntu-24.04"
script: |
./ci/stable_install/install_and_test_pip.sh --cuda cu13
test-stable-install-conda-amd64:
secrets: inherit
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main
with:
build_type: pull-request
node_type: "cpu4"
arch: "amd64"
container_image: "rapidsai/ci-conda:26.04-latest"
script: |
./ci/stable_install/install_and_test_conda.sh
test-stable-install-conda-arm64:
secrets: inherit
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main
with:
build_type: pull-request
node_type: "cpu4"
arch: "arm64"
container_image: "rapidsai/ci-conda:26.04-latest"
script: |
./ci/stable_install/install_and_test_conda.sh
16 changes: 16 additions & 0 deletions ci/stable_install/bootstrap/pip.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/bash
# Copyright (c) 2026, NVIDIA CORPORATION.

set -euo pipefail

apt update && apt install -y curl

echo "installing 'gha-tools'"
curl -fsSL https://github.com/rapidsai/gha-tools/releases/latest/download/tools.tar.gz | tar -xz -C /usr/local/bin/
echo "done installing 'gha-tools' to '/usr/local/bin'"

echo "installing 'uv'"
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "done installing 'uv'"

source "$HOME"/.local/bin/env
68 changes: 68 additions & 0 deletions ci/stable_install/install_and_test_conda.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/bin/bash
# Copyright (c) 2026, NVIDIA CORPORATION.

# By default, this script attempts to install the latest stable RAPIDS version
# in a clean conda environment for all supported versions of Python and CUDA
#
# The Python version, CUDA version, and RAPIDS version can be overridden by
# supplying the value to test to the appropriate flag (--python, --rapids, and
# --cuda, respectively).

set -euo pipefail

STABLE_RAPIDS_VERSION="26.4.*"
Comment thread
gforsyth marked this conversation as resolved.
SUPPORTED_PYTHON_VERSIONS=(3.11 3.12 3.13 3.14)
SUPPORTED_CUDA_VERSIONS=("12.9" "13.1")
Comment thread
gforsyth marked this conversation as resolved.
Outdated

while [[ $# -gt 0 ]]; do
case $1 in
--python)
shift
SUPPORTED_PYTHON_VERSIONS=("$1")
shift
;;
--rapids)
shift
STABLE_RAPIDS_VERSION="$1"
shift
;;
--cuda)
shift
SUPPORTED_CUDA_VERSIONS=("$1")
shift
;;
-*)
rapids-echo-stderr "Unknown flag: $1. Supported flags: --python, --rapids, --cuda"
exit 1
;;
esac
done

function testImports {
while [[ $# -gt 0 ]]; do
rapids-logger "Import test for $1"
python -c "import $1"
shift
done
}

. /opt/conda/etc/profile.d/conda.sh

for CUDA_VERSION in "${SUPPORTED_CUDA_VERSIONS[@]}"; do
for PY_VER in "${SUPPORTED_PYTHON_VERSIONS[@]}"; do
envName="rapids_${PY_VER}_${CUDA_VERSION}"

rapids-logger "Testing stable version install with Python $PY_VER and CUDA version $CUDA_VERSION"

# use `-O` to override channels so we don't include `rapidsai-nightly`
conda create -n "$envName" -O -c rapidsai -c conda-forge \
rapids="$STABLE_RAPIDS_VERSION" python="$PY_VER" "cuda-version>=${CUDA_VERSION}" -y
Comment thread
gforsyth marked this conversation as resolved.
Outdated

conda activate "$envName"

testImports cudf dask_cudf cuml pylibraft raft_dask cugraph nx_cugraph cuxfilter cucim cuvs
Comment thread
gforsyth marked this conversation as resolved.
Outdated

conda deactivate
conda env remove -n "$envName"
done
done
97 changes: 97 additions & 0 deletions ci/stable_install/install_and_test_pip.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#!/bin/bash
# Copyright (c) 2026, NVIDIA CORPORATION.

# By default, this script attempts to install the latest stable RAPIDS version
# in a clean Python venv for all supported versions of Python and CUDA
#
# The Python version, CUDA version, and RAPIDS version can be overridden by
# supplying the value to test to the appropriate flag (--python, --rapids, and
# --cuda, respectively).
#
# Note that the CUDA version should be specified as a -cu* suffix, e.g. `--cuda cu13`

set -euo pipefail

STABLE_RAPIDS_VERSION="26.4.*"
SUPPORTED_PYTHON_VERSIONS=(3.11 3.12 3.13 3.14)
SUPPORTED_CUDA_VERSIONS=("cu12" "cu13")
Comment thread
gforsyth marked this conversation as resolved.
Outdated

source ./bootstrap/pip.sh

while [[ $# -gt 0 ]]; do
case $1 in
--python)
shift
SUPPORTED_PYTHON_VERSIONS=("$1")
shift
;;
--rapids)
shift
STABLE_RAPIDS_VERSION="$1"
shift
;;
--cuda)
shift
SUPPORTED_CUDA_VERSIONS=("$1")
shift
;;
-*)
rapids-echo-stderr "Unknown flag: $1. Supported flags: --python, --rapids, --cuda"
exit 1
;;
esac
done

function testImports {
while [[ $# -gt 0 ]]; do
rapids-logger "Import test for $1"
python -c "import $1"
shift
done
}

function createPyEnv {
PY_VER=$1
INSTALL_DIR=$(mktemp -d)
pushd "$INSTALL_DIR"

rapids-logger "Creating virtualenv for Python $PY_VER"
uv venv --python="$PY_VER" --seed
Comment thread
gforsyth marked this conversation as resolved.
source "${INSTALL_DIR}/.venv/bin/activate"
}


for CUDA_SUFFIX in "${SUPPORTED_CUDA_VERSIONS[@]}"; do

PIP_INSTALL_PYPI=(
"cudf-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"dask-cudf-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"cuml-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"pylibraft-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"raft-dask-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
)

PIP_INSTALL_NVIDIA_PYPI=("${PIP_INSTALL_PYPI[@]}"
"cugraph-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"nx-cugraph-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"cuxfilter-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"cucim-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
"cuvs-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"
--extra-index-url=https://pypi.nvidia.com
)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to my comments on conda, I think this would be a more powerful test if it combined all the imports into one.

I'd structure it roughly like this:

# get all the pypi.nvidia.com stuff
wheels_dir=$(mktemp -d)
pip download \
  --isolated \
  --index-url https://pypi.nvidia.com \
  --prefer-binary \
  --no-deps \
  -d "${wheels_dir}" \
  "cucim-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}" \
  "cugraph-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}" \
  "cuvs-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}" \
  "cuxfilter-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}" \
  "libcugraph-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}" \
  "libcuvs-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}" \
  "pylibcugraph-${CUDA_SUFFIX}==${STABLE_RAPIDS_VERSION}"

pip install \
  --isolated \
  --index-url https://pypi.org/simple \
  --prefer-binary \
  "${PIP_INSTALL_PYPI[@]}" \
  "${wheels_dir}"/*.whl

python -c "import cudf; import dask_cudf; ...; import cuvs"

Would you consider something like that?

for PY_VER in "${SUPPORTED_PYTHON_VERSIONS[@]}"; do

createPyEnv "$PY_VER"
rapids-logger "Testing stable version install with Python $PY_VER and CUDA suffix $CUDA_SUFFIX without NVIDIA PyPI index"
python -m pip install "${PIP_INSTALL_PYPI[@]}"
testImports cudf dask_cudf cuml pylibraft raft_dask
popd

createPyEnv "$PY_VER"
rapids-logger "Testing stable version install with Python $PY_VER and CUDA suffix $CUDA_SUFFIX and NVIDIA PyPI index"
python -m pip install "${PIP_INSTALL_NVIDIA_PYPI[@]}"
testImports cudf dask_cudf cuml pylibraft raft_dask cugraph nx_cugraph cuxfilter cucim cuvs
popd
done
done
13 changes: 13 additions & 0 deletions ci/stable_install/test_imports.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/bin/bash
# Copyright (c) 2026, NVIDIA CORPORATION.
#
# This script expects N arguments, each the import name of an installed RAPIDS
# library in the currently active virtualenv or conda environment.

set -euo pipefail

while [[ $# -gt 0 ]]; do
rapids-logger "Import test for $1"
python -c "import $1"
shift
done
Loading