Skip to content

Forward-merge release/26.04 into main - #89

Merged
jameslamb merged 4 commits into
rapidsai:mainfrom
jameslamb:main-merge-release/26.04
Mar 20, 2026
Merged

Forward-merge release/26.04 into main#89
jameslamb merged 4 commits into
rapidsai:mainfrom
jameslamb:main-merge-release/26.04

Conversation

@jameslamb

Copy link
Copy Markdown
Member

Closes #86

Fixes forward-merger conflicts

chyunsu3 and others added 4 commits March 13, 2026 16:20
…s, drop CUDA math libraries dependencies (rapidsai#87)

Contributes to rapidsai/build-planning#257

* builds CUDA 13 wheels with the 13.0 CTK

Contributes to rapidsai/build-planning#256

* updates wheel tests to cover a range of CTK versions (we previously, accidentally, were only testing the latest 12.x and 13.x)

Drops unnecessary CTK dependencies

* drops dependencies on cuBLAS, cuFFT, cuRAND, cuSOLVER, and cuSPARSE
  - *`nvforest` doesn't depend directly on any of these, I suspect they were all just copied over from cuML*
* removes related code and configuration

Authors:
  - James Lamb (https://github.com/jameslamb)

Approvers:
  - Philip Hyunsu Cho (https://github.com/hcho3)
  - Gil Forsyth (https://github.com/gforsyth)

URL: rapidsai#87
@jameslamb jameslamb added the improvement Improves an existing functionality label Mar 20, 2026
@jameslamb
jameslamb requested a review from a team as a code owner March 20, 2026 16:59
@jameslamb jameslamb added the non-breaking Introduces a non-breaking change label Mar 20, 2026
@jameslamb
jameslamb requested review from a team as code owners March 20, 2026 16:59
@coderabbitai

coderabbitai Bot commented Mar 20, 2026

Copy link
Copy Markdown
📝 Walkthrough

Summary by CodeRabbit

Release Notes

  • New Features

    • Added development container configurations for streamlined local and cloud development environments with CUDA 12.9 and 13.1 support.
  • Chores

    • Enabled development container testing in CI pipeline.
    • Updated build environment configurations by removing unused CUDA development libraries to reduce build times and container sizes.
    • Simplified dependency management and test wheel installation procedures.

Walkthrough

This PR introduces development container support for VS Code and GitHub Codespaces with multiple CUDA/package manager variants, enables devcontainer testing in CI, removes explicit CUDA math library dependencies from conda environments and build configurations, and restructures Python project dependencies to remove cuda-toolkit and packaging from core requirements.

Changes

Cohort / File(s) Summary
Development Container Infrastructure
.devcontainer/Dockerfile, .devcontainer/README.md, .devcontainer/cuda*/devcontainer.json
Added new devcontainer setup with Dockerfile supporting pip/conda package managers, four variant configurations for CUDA 12.9 and 13.1, and documentation covering prerequisites and launch instructions.
CI Workflow Updates
.github/workflows/pr.yaml
Enabled previously commented-out devcontainer job with CUDA 13.1 matrix, updated reusable workflow reference to release/26.04 branch, and added sccache/build command execution.
Conda Environment Dependencies
conda/environments/all_cuda-*_arch-*.yaml, conda/environments/clang_tidy_cuda-*_arch-x86_64.yaml, conda/environments/cpp_all_cuda-*_arch-x86_64.yaml
Removed explicit CUDA math library development packages (libcublas-dev, libcufft-dev, libcurand-dev, libcusolver-dev, libcusparse-dev) from all eight environment definitions across CUDA 12.9 and 13.1 variants.
Conda Recipe Updates
conda/recipes/libnvforest/recipe.yaml, conda/recipes/nvforest/recipe.yaml
Removed CUDA math libraries from build/runtime requirements in libnvforest recipe; removed packaging from nvforest runtime dependencies.
CMake Build Configuration
cpp/CMakeLists.txt, python/libnvforest/CMakeLists.txt
Removed static CUDA math library configuration and deprecated cusparse compile definition exports; removed NCCL rpath computation tied to CUDA version detection.
Python Project Dependencies
python/libnvforest/pyproject.toml, python/nvforest/pyproject.toml
Removed cuda-toolkit>=12,<14 constraint from core dependencies; removed packaging from nvforest core and added to optional test dependencies.
Dependency Manifest
dependencies.yaml
Restructured CUDA dependency handling by replacing cuda_wheels include with reworked cuda section supporting both conda and requirements-based CUDA toolkit selection; removed packaging from py_run_nvforest and introduced shared anchor under docs.
Test Installation
ci/test_wheel.sh
Updated pip install to use ${PIP_CONSTRAINT} environment variable instead of local file; added --prefer-binary flag to both install invocations.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

  • nvforest#82: Directly related—contains identical .devcontainer file additions (Dockerfile, README, devcontainer.json variants) and PR workflow changes.
  • nvforest#87: Overlapping changes removing CUDA math library dependencies from conda environments, recipes, and CMake configurations.
  • nvforest#88: Related through shared removal of packaging from nvforest runtime dependencies with test-only designation.

Suggested reviewers

  • hcho3
  • csadorf
  • gforsyth
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Forward-merge release/26.04 into main' directly and clearly describes the primary change: merging a release branch into the main branch.
Description check ✅ Passed The description 'Closes #86. Fixes forward-merger conflicts' is related to the changeset, referencing the linked issue and indicating conflict resolution during the merge.
Linked Issues check ✅ Passed The PR fulfills issue #86 by forward-merging release/26.04 into main, with all code changes (devcontainer setup, CUDA library removals, dependency updates) representing legitimate merge content from the release branch.
Out of Scope Changes check ✅ Passed All changes are in-scope for a forward-merge: devcontainer configurations, CI workflow updates, CUDA dependency removals, and Python package dependency adjustments are all legitimate release branch changes being merged forward.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
.devcontainer/cuda12.9-conda/devcontainer.json (2)

29-35: Note: consistency option is deprecated in recent Docker versions.

The consistency=consistent option for bind mounts is deprecated and has no effect on Linux systems. It was primarily used for macOS performance tuning in older Docker versions. While this doesn't cause issues, it can be safely removed to reduce noise:

-    "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind,consistency=consistent",
+    "source=${localWorkspaceFolder}/../.aws,target=/home/coder/.aws,type=bind",

Apply similar changes to all mount entries.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/cuda12.9-conda/devcontainer.json around lines 29 - 35, Remove
the deprecated "consistency=consistent" option from the "mounts" array entries
in the devcontainer.json; locate the "mounts" array and each bind mount string
(those containing "source=${localWorkspaceFolder}/../..." and "type=bind") and
strip the ",consistency=consistent" fragment from each mount entry so the mounts
remain valid on Linux and avoid deprecated options.

28-28: Consider using a dynamic workspace name for flexibility.

The workspace mount hardcodes nvforest as the target directory. If developers clone the repository with a different name, this could cause confusion. Consider using ${localWorkspaceFolderBasename} instead:

-  "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/nvforest,type=bind,consistency=consistent",
+  "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/${localWorkspaceFolderBasename},type=bind,consistency=consistent",

However, if a consistent internal path is desired regardless of the local clone name, the current approach is acceptable.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/cuda12.9-conda/devcontainer.json at line 28, The
workspaceMount currently hardcodes the target path as /home/coder/nvforest which
can mismatch local clone names; change the mount target to use the variable
${localWorkspaceFolderBasename} (i.e., update the "workspaceMount" value) so the
container path dynamically reflects the local repository folder name, or
document/keep the hardcoded /home/coder/nvforest if a fixed internal path is
intentionally required.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.devcontainer/cuda12.9-conda/devcontainer.json:
- Line 20: The RAPIDS devcontainer feature is pinned to
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26.4" but should
match the RAPIDS 26.04 base image which expects version ":26"; update the
feature string in each devcontainer configuration (symbols to locate:
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26.4") to use
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26" in the
cuda12.9-conda, cuda12.9-pip, cuda13.1-conda, and cuda13.1-pip devcontainer.json
files.

In @.devcontainer/README.md:
- Line 33: The image tag in .devcontainer/README.md is missing an alt attribute;
update the <img> element to include a concise, descriptive alt text (e.g.,
alt="VS Code: Reopen in Container button highlighted") so screen readers can
convey the image meaning and improve accessibility.

---

Nitpick comments:
In @.devcontainer/cuda12.9-conda/devcontainer.json:
- Around line 29-35: Remove the deprecated "consistency=consistent" option from
the "mounts" array entries in the devcontainer.json; locate the "mounts" array
and each bind mount string (those containing
"source=${localWorkspaceFolder}/../..." and "type=bind") and strip the
",consistency=consistent" fragment from each mount entry so the mounts remain
valid on Linux and avoid deprecated options.
- Line 28: The workspaceMount currently hardcodes the target path as
/home/coder/nvforest which can mismatch local clone names; change the mount
target to use the variable ${localWorkspaceFolderBasename} (i.e., update the
"workspaceMount" value) so the container path dynamically reflects the local
repository folder name, or document/keep the hardcoded /home/coder/nvforest if a
fixed internal path is intentionally required.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 6c11cc04-ce9e-425b-9a9d-76b9de9729ad

📥 Commits

Reviewing files that changed from the base of the PR and between 1dcd17c and e1c7fb9.

📒 Files selected for processing (23)
  • .devcontainer/Dockerfile
  • .devcontainer/README.md
  • .devcontainer/cuda12.9-conda/devcontainer.json
  • .devcontainer/cuda12.9-pip/devcontainer.json
  • .devcontainer/cuda13.1-conda/devcontainer.json
  • .devcontainer/cuda13.1-pip/devcontainer.json
  • .github/workflows/pr.yaml
  • ci/test_wheel.sh
  • conda/environments/all_cuda-129_arch-aarch64.yaml
  • conda/environments/all_cuda-129_arch-x86_64.yaml
  • conda/environments/all_cuda-131_arch-aarch64.yaml
  • conda/environments/all_cuda-131_arch-x86_64.yaml
  • conda/environments/clang_tidy_cuda-129_arch-x86_64.yaml
  • conda/environments/clang_tidy_cuda-131_arch-x86_64.yaml
  • conda/environments/cpp_all_cuda-129_arch-x86_64.yaml
  • conda/environments/cpp_all_cuda-131_arch-x86_64.yaml
  • conda/recipes/libnvforest/recipe.yaml
  • conda/recipes/nvforest/recipe.yaml
  • cpp/CMakeLists.txt
  • dependencies.yaml
  • python/libnvforest/CMakeLists.txt
  • python/libnvforest/pyproject.toml
  • python/nvforest/pyproject.toml
💤 Files with no reviewable changes (12)
  • conda/environments/clang_tidy_cuda-129_arch-x86_64.yaml
  • conda/environments/all_cuda-131_arch-aarch64.yaml
  • conda/environments/all_cuda-129_arch-x86_64.yaml
  • conda/environments/clang_tidy_cuda-131_arch-x86_64.yaml
  • conda/recipes/nvforest/recipe.yaml
  • conda/environments/cpp_all_cuda-131_arch-x86_64.yaml
  • conda/environments/cpp_all_cuda-129_arch-x86_64.yaml
  • python/libnvforest/pyproject.toml
  • conda/environments/all_cuda-131_arch-x86_64.yaml
  • conda/environments/all_cuda-129_arch-aarch64.yaml
  • python/libnvforest/CMakeLists.txt
  • conda/recipes/libnvforest/recipe.yaml

],
"hostRequirements": {"gpu": "optional"},
"features": {
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26.4": {}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check if the rapids-build-utils feature version 26.4 exists and matches the 26.04 release

# Query the GitHub Container Registry for available feature versions
gh api /orgs/rapidsai/packages/container/devcontainers%2Ffeatures%2Frapids-build-utils/versions --jq '.[] | select(.name | startswith("26")) | .name' | head -10

Repository: rapidsai/nvforest

Length of output: 221


🏁 Script executed:

# First, explore the .devcontainer directory structure
find .devcontainer -type f -name "*.json" | head -20

Repository: rapidsai/nvforest

Length of output: 244


🏁 Script executed:

# Check the actual content of the file in question
cat -n .devcontainer/cuda12.9-conda/devcontainer.json 2>/dev/null || echo "File not found"

Repository: rapidsai/nvforest

Length of output: 2320


🏁 Script executed:

# Look for other devcontainer configurations that might use similar features
grep -r "rapids-build-utils" .devcontainer/ 2>/dev/null || echo "No matches found"

Repository: rapidsai/nvforest

Length of output: 984


🌐 Web query:

RAPIDS devcontainers features rapids-build-utils version 26.4

💡 Result:

RAPIDS publishes rapids-build-utils as a Dev Container Feature on GHCR with a 26.4 tag (and patch tags like 26.4.0, 26.4.1, …). The tagged versions are listed on the GitHub Container Registry package page. [1]

Use in devcontainer.json (pin to 26.4)

{
  "features": {
    "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26.4": {}
  }
}

(You can also pin to an exact patch, e.g. :26.4.0.) [1]

What version 26.4.0 does

  • Sets BASH_ENV=/etc/bash.bash_env and runs rapids-post-start-command as the feature postStartCommand. [2]
  • Installs common OS packages (via apt): bc jq pigz sudo wget gettext-base bash-completion ca-certificates (plus python3 / python3-pip if needed). [3]
  • Installs yq (v4.x) if missing. [3]
  • Uses pip to install: rapids-dependency-file-generator, conda-merge, and toml. [3]
  • Copies RAPIDS build utility scripts into /opt/rapids-build-utils and registers many helper commands as rapids-* (via update-alternatives), e.g. rapids-make-conda-env, rapids-make-pip-env, rapids-merge-compile-commands-json, etc. [3]
  • rapids-post-start-command triggers typical “devcontainer bootstrap” tasks (generate scripts, update build-dir links, update VS Code workspace, merge compile commands; and optionally create a Python env based on PYTHON_PACKAGE_MANAGER). [4]

Source mapping: [1] GHCR package versions list; [2] devcontainer-feature.json for tag v26.04.00a (feature version 26.4.0); [3] install.sh for 26.4.0; [4] post-start-command.sh for 26.4.0.


🌐 Web query:

RAPIDS 26.04 release devcontainer feature versions

💡 Result:

For the RAPIDS 26.04 devcontainers repo tag v26.04.00a, the devcontainer Feature “version” you pin to is :26 (the major CalVer), e.g. ghcr.io/rapidsai/devcontainers/features/cuda:26. [1]

Available RAPIDS devcontainer Features in that release (all used as .../features/<id>:26) are: cccl-dev, cmake, cuda, gcc, gitlab-cli, llvm, mambaforge, ninja, nvhpc, oneapi, openmpi, rapids-build-utils, rust, sccache, ucx, utils. [2]

Example

"features": {
  "ghcr.io/rapidsai/devcontainers/features/cuda:26": {},
  "ghcr.io/rapidsai/devcontainers/features/cmake:26": {}
}
``` [1][3]

**Sources:** RAPIDS devcontainers tag `v26.04.00a` (alpha) feature docs/listing. [1][2][3]

---



</details>

**Use feature version `:26` to match the RAPIDS 26.04 base image.**

The feature is pinned to `rapids-build-utils:26.4`, but the base image uses RAPIDS 26.04 which references feature version `:26`. Change line 20 to:

"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26": {}

This affects all four devcontainer configurations (cuda12.9-conda, cuda12.9-pip, cuda13.1-conda, cuda13.1-pip).

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @.devcontainer/cuda12.9-conda/devcontainer.json at line 20, The RAPIDS
devcontainer feature is pinned to
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26.4" but should
match the RAPIDS 26.04 base image which expects version ":26"; update the
feature string in each devcontainer configuration (symbols to locate:
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26.4") to use
"ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:26" in the
cuda12.9-conda, cuda12.9-pip, cuda13.1-conda, and cuda13.1-pip devcontainer.json
files.


</details>

<!-- fingerprinting:phantom:triton:puma -->

<!-- This is an auto-generated comment by CodeRabbit -->

Comment thread .devcontainer/README.md

## Launch a Dev Container

To launch a devcontainer from VSCode, open the nvForest repo and select the "Reopen in Container" button in the bottom right:<br/><img src="https://user-images.githubusercontent.com/178183/221771999-97ab29d5-e718-4e5f-b32f-2cdd51bba25c.png"/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add alt text to the image for accessibility.

The image is missing alternative text, which is important for screen readers and accessibility compliance.

📝 Proposed fix
-To launch a devcontainer from VSCode, open the nvForest repo and select the "Reopen in Container" button in the bottom right:<br/><img src="https://user-images.githubusercontent.com/178183/221771999-97ab29d5-e718-4e5f-b32f-2cdd51bba25c.png"/>
+To launch a devcontainer from VSCode, open the nvForest repo and select the "Reopen in Container" button in the bottom right:<br/><img src="https://user-images.githubusercontent.com/178183/221771999-97ab29d5-e718-4e5f-b32f-2cdd51bba25c.png" alt="VSCode Reopen in Container button"/>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
To launch a devcontainer from VSCode, open the nvForest repo and select the "Reopen in Container" button in the bottom right:<br/><img src="https://user-images.githubusercontent.com/178183/221771999-97ab29d5-e718-4e5f-b32f-2cdd51bba25c.png"/>
To launch a devcontainer from VSCode, open the nvForest repo and select the "Reopen in Container" button in the bottom right:<br/><img src="https://user-images.githubusercontent.com/178183/221771999-97ab29d5-e718-4e5f-b32f-2cdd51bba25c.png" alt="VSCode Reopen in Container button"/>
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)

[warning] 33-33: Images should have alternate text (alt text)

(MD045, no-alt-text)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/README.md at line 33, The image tag in .devcontainer/README.md
is missing an alt attribute; update the <img> element to include a concise,
descriptive alt text (e.g., alt="VS Code: Reopen in Container button
highlighted") so screen readers can convey the image meaning and improve
accessibility.

@jameslamb

Copy link
Copy Markdown
Member Author

Nightly tests have been failing because of missing XGBoost packages

error    libmamba Could not solve for environment specs
    The following packages are incompatible
    ├─ cuda-version =12.2 * is requested and can be installed;
    ├─ libnvforest =26.6,>=0.0.0a0 * is installable with the potential options
    │  ├─ libnvforest 26.06.00a4 would require
    │  │  └─ librmm =26.6 * with the potential options
    │  │     ├─ librmm [26.02.00a53|26.04.00a55|...|26.06.00a9] would require
    │  │     │  └─ cuda-version >=13,<14.0a0 *, which conflicts with any installable versions previously reported;
    │  │     └─ librmm [26.06.00a0|26.06.00a1|...|26.06.00a9], which can be installed;
    │  └─ libnvforest 26.06.00a4 conflicts with any installable versions previously reported;
    └─ rapids-xgboost =26.6,>=0.0.0a0 * is not installable because there are no viable options
       ├─ rapids-xgboost 26.06.00a0 would require
       │  └─ libxgboost =3.1.2 rapidsai_h* but there are no viable options
       │     ├─ libxgboost 3.1.2 would require
       │     │  └─ librmm >=25.12.0a62,<25.13.0a0 *, which conflicts with any installable versions previously reported;
       │     ├─ libxgboost 3.1.2 would require
       │     │  └─ cuda-version >=13,<14.0a0 *, which conflicts with any installable versions previously reported;
       │     ├─ libxgboost 3.1.2 would require
       │     │  └─ librmm [>=26.2.0a22,<26.3.0a0 *|>=26.2.0a36,<26.3.0a0 *|>=26.2.0a42,<26.3.0a0 *|>=26.2.0a47,<26.3.0a0 *] but there are no viable options
       │     │     ├─ librmm [26.02.00a53|26.04.00a55|...|26.06.00a9], which cannot be installed (as previously explained);
       │     │     └─ librmm [26.02.00|26.02.00a53] conflicts with any installable versions previously reported;
       │     ├─ libxgboost 3.1.2 would require
       │     │  └─ librmm >=26.4.0a5,<26.5.0a0 * but there are no viable options
       │     │     ├─ librmm [26.04.00a55|26.04.00a56|26.04.00a59|26.04.00a61|26.04.00a62] conflicts with any installable versions previously reported;
       │     │     └─ librmm [26.02.00a53|26.04.00a55|...|26.06.00a9], which cannot be installed (as previously explained);
       │     └─ libxgboost 3.1.2 conflicts with any installable versions previously reported;
       └─ rapids-xgboost 26.06.00a0 would require
          └─ cuda-version >=13,<14.0a0 *, which conflicts with any installable versions previously reported.

(build link)

Should be fixed by these:

I'll try manually triggering nightly tests here to get that CI job working again.

@jameslamb

Copy link
Copy Markdown
Member Author

All nightly tests except 1 (v100 + driver v3535) passed: https://github.com/rapidsai/nvforest/actions/runs/23354547701/job/67941927712

Wrote that up here: #90

So check-nightly-ci can't pass normally yet. I'll admin-merge this, to get main caught up.

@jameslamb
jameslamb merged commit eee3626 into rapidsai:main Mar 20, 2026
63 of 65 checks passed
@jameslamb
jameslamb deleted the main-merge-release/26.04 branch March 20, 2026 18:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci CMake conda Relates to conda packaging CUDA/C++ Cython / Python improvement Improves an existing functionality non-breaking Introduces a non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants