diff --git a/.devcontainer/cuda12.9-conda/devcontainer.json b/.devcontainer/cuda12.9-conda/devcontainer.json index 052e92fb490..7cbfdde9775 100644 --- a/.devcontainer/cuda12.9-conda/devcontainer.json +++ b/.devcontainer/cuda12.9-conda/devcontainer.json @@ -5,19 +5,19 @@ "args": { "CUDA": "12.9", "PYTHON_PACKAGE_MANAGER": "conda", - "BASE": "rapidsai/devcontainers:25.10-cpp-mambaforge" + "BASE": "rapidsai/devcontainers:25.12-cpp-mambaforge" } }, "runArgs": [ "--rm", "--name", - "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.10-cuda12.9-conda", + "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.12-cuda12.9-conda", "--ulimit", "nofile=500000" ], "hostRequirements": {"gpu": "optional"}, "features": { - "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.10": {} + "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.12": {} }, "overrideFeatureInstallOrder": [ "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils" diff --git a/.devcontainer/cuda12.9-pip/devcontainer.json b/.devcontainer/cuda12.9-pip/devcontainer.json index 0f6fd1959df..57478a05da7 100644 --- a/.devcontainer/cuda12.9-pip/devcontainer.json +++ b/.devcontainer/cuda12.9-pip/devcontainer.json @@ -5,26 +5,26 @@ "args": { "CUDA": "12.9", "PYTHON_PACKAGE_MANAGER": "pip", - "BASE": "rapidsai/devcontainers:25.10-cpp-cuda12.9-ucx1.19.0-openmpi5.0.7" + "BASE": "rapidsai/devcontainers:25.12-cpp-cuda12.9-ucx1.19.0-openmpi5.0.7" } }, "runArgs": [ "--rm", "--name", - "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.10-cuda12.9-pip", + "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.12-cuda12.9-pip", "--ulimit", "nofile=500000" ], "hostRequirements": {"gpu": "optional"}, "features": { - "ghcr.io/rapidsai/devcontainers/features/cuda:25.10": { + "ghcr.io/rapidsai/devcontainers/features/cuda:25.12": { "version": "12.9", "installcuBLAS": true, "installcuSOLVER": true, "installcuRAND": true, "installcuSPARSE": true }, - "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.10": {} + "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.12": {} }, "overrideFeatureInstallOrder": [ "ghcr.io/rapidsai/devcontainers/features/cuda", diff --git a/.devcontainer/cuda13.0-conda/devcontainer.json b/.devcontainer/cuda13.0-conda/devcontainer.json index 411ae3b4975..50647cf7566 100644 --- a/.devcontainer/cuda13.0-conda/devcontainer.json +++ b/.devcontainer/cuda13.0-conda/devcontainer.json @@ -5,19 +5,19 @@ "args": { "CUDA": "13.0", "PYTHON_PACKAGE_MANAGER": "conda", - "BASE": "rapidsai/devcontainers:25.10-cpp-mambaforge" + "BASE": "rapidsai/devcontainers:25.12-cpp-mambaforge" } }, "runArgs": [ "--rm", "--name", - "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.10-cuda13.0-conda", + "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.12-cuda13.0-conda", "--ulimit", "nofile=500000" ], "hostRequirements": {"gpu": "optional"}, "features": { - "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.10": {} + "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.12": {} }, "overrideFeatureInstallOrder": [ "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils" diff --git a/.devcontainer/cuda13.0-pip/devcontainer.json b/.devcontainer/cuda13.0-pip/devcontainer.json index 3e5dc25822c..5870a3fb8cc 100644 --- a/.devcontainer/cuda13.0-pip/devcontainer.json +++ b/.devcontainer/cuda13.0-pip/devcontainer.json @@ -5,26 +5,26 @@ "args": { "CUDA": "13.0", "PYTHON_PACKAGE_MANAGER": "pip", - "BASE": "rapidsai/devcontainers:25.10-cpp-cuda13.0-ucx1.19.0-openmpi5.0.7" + "BASE": "rapidsai/devcontainers:25.12-cpp-cuda13.0-ucx1.19.0-openmpi5.0.7" } }, "runArgs": [ "--rm", "--name", - "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.10-cuda13.0-pip", + "${localEnv:USER:anon}-rapids-${localWorkspaceFolderBasename}-25.12-cuda13.0-pip", "--ulimit", "nofile=500000" ], "hostRequirements": {"gpu": "optional"}, "features": { - "ghcr.io/rapidsai/devcontainers/features/cuda:25.10": { + "ghcr.io/rapidsai/devcontainers/features/cuda:25.12": { "version": "13.0", "installcuBLAS": true, "installcuSOLVER": true, "installcuRAND": true, "installcuSPARSE": true }, - "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.10": {} + "ghcr.io/rapidsai/devcontainers/features/rapids-build-utils:25.12": {} }, "overrideFeatureInstallOrder": [ "ghcr.io/rapidsai/devcontainers/features/cuda", diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 666ddf54f34..b2a880cf104 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -34,7 +34,7 @@ concurrency: jobs: cpp-build: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -45,7 +45,7 @@ jobs: python-build: needs: [cpp-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -55,7 +55,7 @@ jobs: upload-conda: needs: [cpp-build, python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -65,19 +65,19 @@ jobs: if: github.ref_type == 'branch' needs: python-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.12 with: arch: "amd64" branch: ${{ inputs.branch }} build_type: ${{ inputs.build_type || 'branch' }} - container_image: "rapidsai/ci-conda:25.08-latest" + container_image: "rapidsai/ci-conda:25.12-latest" date: ${{ inputs.date }} node_type: "gpu-l4-latest-1" script: "ci/build_docs.sh" sha: ${{ inputs.sha }} wheel-build-libcugraph: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.12 with: # build for every combination of arch and CUDA version, but only for the latest Python version matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) @@ -92,7 +92,7 @@ jobs: wheel-publish-libcugraph: needs: wheel-build-libcugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -103,7 +103,7 @@ jobs: wheel-build-pylibcugraph: needs: wheel-build-libcugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -115,7 +115,7 @@ jobs: wheel-publish-pylibcugraph: needs: wheel-build-pylibcugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -126,7 +126,7 @@ jobs: wheel-build-cugraph: needs: wheel-build-pylibcugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -138,7 +138,7 @@ jobs: wheel-publish-cugraph: needs: wheel-build-cugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@branch-25.12 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index ef3ec34b248..3261553941d 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -28,7 +28,7 @@ jobs: - telemetry-setup - devcontainer secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@branch-25.12 if: always() with: needs: ${{ toJSON(needs) }} @@ -53,7 +53,7 @@ jobs: changed-files: secrets: inherit needs: telemetry-setup - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@branch-25.12 with: files_yaml: | test_cpp: @@ -87,14 +87,14 @@ jobs: checks: secrets: inherit needs: telemetry-setup - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@branch-25.12 with: enable_check_generated_files: false ignored_pr_jobs: telemetry-summarize conda-cpp-build: needs: checks secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@branch-25.12 with: build_type: pull-request node_type: cpu32 @@ -102,7 +102,7 @@ jobs: conda-cpp-tests: needs: [conda-cpp-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.12 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp with: build_type: pull-request @@ -110,21 +110,21 @@ jobs: conda-cpp-checks: needs: conda-cpp-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-post-build-checks.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-post-build-checks.yaml@branch-25.12 with: build_type: pull-request symbol_exclusions: (cugraph::ops|hornet|void writeEdgeCountsKernel|void markUniqueOffsetsKernel) conda-python-build: needs: conda-cpp-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@branch-25.12 with: build_type: pull-request script: ci/build_python.sh conda-python-tests: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.12 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python with: build_type: pull-request @@ -132,28 +132,28 @@ jobs: conda-notebook-tests: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.12 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_notebooks with: build_type: pull-request node_type: "gpu-l4-latest-1" arch: "amd64" - container_image: "rapidsai/ci-conda:25.08-latest" + container_image: "rapidsai/ci-conda:25.12-latest" script: "ci/test_notebooks.sh" docs-build: needs: conda-python-build secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@branch-25.12 with: build_type: pull-request node_type: "gpu-l4-latest-1" arch: "amd64" - container_image: "rapidsai/ci-conda:25.08-latest" + container_image: "rapidsai/ci-conda:25.12-latest" script: "ci/build_docs.sh" wheel-build-libcugraph: needs: checks secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.12 with: # build for every combination of arch and CUDA version, but only for the latest Python matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) @@ -164,7 +164,7 @@ jobs: wheel-build-pylibcugraph: needs: wheel-build-libcugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.12 with: build_type: pull-request script: ci/build_wheel_pylibcugraph.sh @@ -173,7 +173,7 @@ jobs: wheel-tests-pylibcugraph: needs: [wheel-build-pylibcugraph, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.12 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python with: build_type: pull-request @@ -181,7 +181,7 @@ jobs: wheel-build-cugraph: needs: wheel-build-pylibcugraph secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@branch-25.12 with: build_type: pull-request script: ci/build_wheel_cugraph.sh @@ -190,7 +190,7 @@ jobs: wheel-tests-cugraph: needs: [wheel-build-cugraph, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.12 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python with: build_type: pull-request @@ -198,7 +198,7 @@ jobs: devcontainer: secrets: inherit needs: telemetry-setup - uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@branch-25.12 with: arch: '["amd64", "arm64"]' cuda: '["13.0"]' diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2a5af5d1620..6cb66e777b4 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -25,7 +25,7 @@ on: jobs: conda-cpp-checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-post-build-checks.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-post-build-checks.yaml@branch-25.12 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -34,7 +34,7 @@ jobs: symbol_exclusions: (cugraph::ops|hornet|void writeEdgeCountsKernel|void markUniqueOffsetsKernel) conda-cpp-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@branch-25.12 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -43,7 +43,7 @@ jobs: sha: ${{ inputs.sha }} conda-python-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@branch-25.12 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -52,7 +52,7 @@ jobs: sha: ${{ inputs.sha }} wheel-tests-pylibcugraph: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.12 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -61,7 +61,7 @@ jobs: script: ci/test_wheel_pylibcugraph.sh wheel-tests-cugraph: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@branch-25.12 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/trigger-breaking-change-alert.yaml b/.github/workflows/trigger-breaking-change-alert.yaml index 48bf37afc40..c3cce1c34fb 100644 --- a/.github/workflows/trigger-breaking-change-alert.yaml +++ b/.github/workflows/trigger-breaking-change-alert.yaml @@ -12,7 +12,7 @@ jobs: trigger-notifier: if: contains(github.event.pull_request.labels.*.name, 'breaking') secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@branch-25.10 + uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@branch-25.12 with: sender_login: ${{ github.event.sender.login }} sender_avatar: ${{ github.event.sender.avatar_url }} diff --git a/RAPIDS_BRANCH b/RAPIDS_BRANCH index 9b1c52d9415..a2b5a91fc46 100644 --- a/RAPIDS_BRANCH +++ b/RAPIDS_BRANCH @@ -1 +1 @@ -branch-25.10 +branch-25.12 diff --git a/VERSION b/VERSION index 296e35288d1..7924af6192e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -25.10.00 +25.12.00 diff --git a/ci/release/update-version.sh b/ci/release/update-version.sh index f92bbe7bcc6..1f0c338bcf8 100755 --- a/ci/release/update-version.sh +++ b/ci/release/update-version.sh @@ -39,6 +39,7 @@ function sed_runner() { # NOTE: Any script that runs in CI will need to use gha-tool `rapids-generate-version` # and echo it to `VERSION` file to get an alpha spec of the current version echo "${NEXT_FULL_TAG}" > VERSION +echo "branch-${NEXT_SHORT_TAG}" > RAPIDS_BRANCH # Need to distutils-normalize the original version NEXT_SHORT_TAG_PEP440=$(python -c "from packaging.version import Version; print(Version('${NEXT_SHORT_TAG}'))") diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 832b3aeecd0..d68a1e7048a 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -16,24 +16,24 @@ dependencies: - cuda-profiler-api - cuda-python>=12.9.2,<13.0a0 - cuda-version=12.9 -- cudf==25.10.*,>=0.0.0a0 +- cudf==25.12.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.1.2 -- dask-cuda==25.10.*,>=0.0.0a0 -- dask-cudf==25.10.*,>=0.0.0a0 +- dask-cuda==25.12.*,>=0.0.0a0 +- dask-cudf==25.12.*,>=0.0.0a0 - doxygen - fsspec>=0.6.0 - gcc_linux-aarch64=14.* - graphviz - ipython - libcublas-dev -- libcudf==25.10.*,>=0.0.0a0 +- libcudf==25.12.*,>=0.0.0a0 - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft==25.10.*,>=0.0.0a0 -- librmm==25.10.*,>=0.0.0a0 +- libraft==25.12.*,>=0.0.0a0 +- librmm==25.12.*,>=0.0.0a0 - nbsphinx - nccl>=2.19 - networkx>=2.5.1 @@ -48,20 +48,20 @@ dependencies: - pre-commit - pydantic - pydata-sphinx-theme -- pylibcudf==25.10.*,>=0.0.0a0 -- pylibraft==25.10.*,>=0.0.0a0 +- pylibcudf==25.12.*,>=0.0.0a0 +- pylibraft==25.12.*,>=0.0.0a0 - pytest - pytest-benchmark - pytest-cov - pytest-xdist - python-louvain - pytorch>=2.3 -- raft-dask==25.10.*,>=0.0.0a0 +- raft-dask==25.12.*,>=0.0.0a0 - rapids-build-backend>=0.4.0,<0.5.0.dev0 -- rapids-dask-dependency==25.10.*,>=0.0.0a0 +- rapids-dask-dependency==25.12.*,>=0.0.0a0 - recommonmark - requests -- rmm==25.10.*,>=0.0.0a0 +- rmm==25.12.*,>=0.0.0a0 - scikit-build-core>=0.10.0 - scikit-learn>=0.23.1 - scipy @@ -73,6 +73,6 @@ dependencies: - thriftpy2>=0.4.15,!=0.5.0,!=0.5.1 - torchdata - torchmetrics -- ucxx==0.46.*,>=0.0.0a0 +- ucxx==0.47.*,>=0.0.0a0 - wheel name: all_cuda-129_arch-aarch64 diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index b8c3a3f2323..844c4462f5c 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -16,24 +16,24 @@ dependencies: - cuda-profiler-api - cuda-python>=12.9.2,<13.0a0 - cuda-version=12.9 -- cudf==25.10.*,>=0.0.0a0 +- cudf==25.12.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.1.2 -- dask-cuda==25.10.*,>=0.0.0a0 -- dask-cudf==25.10.*,>=0.0.0a0 +- dask-cuda==25.12.*,>=0.0.0a0 +- dask-cudf==25.12.*,>=0.0.0a0 - doxygen - fsspec>=0.6.0 - gcc_linux-64=14.* - graphviz - ipython - libcublas-dev -- libcudf==25.10.*,>=0.0.0a0 +- libcudf==25.12.*,>=0.0.0a0 - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft==25.10.*,>=0.0.0a0 -- librmm==25.10.*,>=0.0.0a0 +- libraft==25.12.*,>=0.0.0a0 +- librmm==25.12.*,>=0.0.0a0 - nbsphinx - nccl>=2.19 - networkx>=2.5.1 @@ -48,20 +48,20 @@ dependencies: - pre-commit - pydantic - pydata-sphinx-theme -- pylibcudf==25.10.*,>=0.0.0a0 -- pylibraft==25.10.*,>=0.0.0a0 +- pylibcudf==25.12.*,>=0.0.0a0 +- pylibraft==25.12.*,>=0.0.0a0 - pytest - pytest-benchmark - pytest-cov - pytest-xdist - python-louvain - pytorch>=2.3 -- raft-dask==25.10.*,>=0.0.0a0 +- raft-dask==25.12.*,>=0.0.0a0 - rapids-build-backend>=0.4.0,<0.5.0.dev0 -- rapids-dask-dependency==25.10.*,>=0.0.0a0 +- rapids-dask-dependency==25.12.*,>=0.0.0a0 - recommonmark - requests -- rmm==25.10.*,>=0.0.0a0 +- rmm==25.12.*,>=0.0.0a0 - scikit-build-core>=0.10.0 - scikit-learn>=0.23.1 - scipy @@ -73,6 +73,6 @@ dependencies: - thriftpy2>=0.4.15,!=0.5.0,!=0.5.1 - torchdata - torchmetrics -- ucxx==0.46.*,>=0.0.0a0 +- ucxx==0.47.*,>=0.0.0a0 - wheel name: all_cuda-129_arch-x86_64 diff --git a/conda/environments/all_cuda-130_arch-aarch64.yaml b/conda/environments/all_cuda-130_arch-aarch64.yaml index dbb4c7d056c..bdf3c3641a7 100644 --- a/conda/environments/all_cuda-130_arch-aarch64.yaml +++ b/conda/environments/all_cuda-130_arch-aarch64.yaml @@ -16,24 +16,24 @@ dependencies: - cuda-profiler-api - cuda-python>=13.0.1,<14.0a0 - cuda-version=13.0 -- cudf==25.10.*,>=0.0.0a0 +- cudf==25.12.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.1.2 -- dask-cuda==25.10.*,>=0.0.0a0 -- dask-cudf==25.10.*,>=0.0.0a0 +- dask-cuda==25.12.*,>=0.0.0a0 +- dask-cudf==25.12.*,>=0.0.0a0 - doxygen - fsspec>=0.6.0 - gcc_linux-aarch64=14.* - graphviz - ipython - libcublas-dev -- libcudf==25.10.*,>=0.0.0a0 +- libcudf==25.12.*,>=0.0.0a0 - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft==25.10.*,>=0.0.0a0 -- librmm==25.10.*,>=0.0.0a0 +- libraft==25.12.*,>=0.0.0a0 +- librmm==25.12.*,>=0.0.0a0 - nbsphinx - nccl>=2.19 - networkx>=2.5.1 @@ -48,20 +48,20 @@ dependencies: - pre-commit - pydantic - pydata-sphinx-theme -- pylibcudf==25.10.*,>=0.0.0a0 -- pylibraft==25.10.*,>=0.0.0a0 +- pylibcudf==25.12.*,>=0.0.0a0 +- pylibraft==25.12.*,>=0.0.0a0 - pytest - pytest-benchmark - pytest-cov - pytest-xdist - python-louvain - pytorch>=2.3 -- raft-dask==25.10.*,>=0.0.0a0 +- raft-dask==25.12.*,>=0.0.0a0 - rapids-build-backend>=0.4.0,<0.5.0.dev0 -- rapids-dask-dependency==25.10.*,>=0.0.0a0 +- rapids-dask-dependency==25.12.*,>=0.0.0a0 - recommonmark - requests -- rmm==25.10.*,>=0.0.0a0 +- rmm==25.12.*,>=0.0.0a0 - scikit-build-core>=0.10.0 - scikit-learn>=0.23.1 - scipy @@ -73,6 +73,6 @@ dependencies: - thriftpy2>=0.4.15,!=0.5.0,!=0.5.1 - torchdata - torchmetrics -- ucxx==0.46.*,>=0.0.0a0 +- ucxx==0.47.*,>=0.0.0a0 - wheel name: all_cuda-130_arch-aarch64 diff --git a/conda/environments/all_cuda-130_arch-x86_64.yaml b/conda/environments/all_cuda-130_arch-x86_64.yaml index 5c3fb3ec2fc..fdac5487122 100644 --- a/conda/environments/all_cuda-130_arch-x86_64.yaml +++ b/conda/environments/all_cuda-130_arch-x86_64.yaml @@ -16,24 +16,24 @@ dependencies: - cuda-profiler-api - cuda-python>=13.0.1,<14.0a0 - cuda-version=13.0 -- cudf==25.10.*,>=0.0.0a0 +- cudf==25.12.*,>=0.0.0a0 - cupy>=13.6.0 - cxx-compiler - cython>=3.1.2 -- dask-cuda==25.10.*,>=0.0.0a0 -- dask-cudf==25.10.*,>=0.0.0a0 +- dask-cuda==25.12.*,>=0.0.0a0 +- dask-cudf==25.12.*,>=0.0.0a0 - doxygen - fsspec>=0.6.0 - gcc_linux-64=14.* - graphviz - ipython - libcublas-dev -- libcudf==25.10.*,>=0.0.0a0 +- libcudf==25.12.*,>=0.0.0a0 - libcurand-dev - libcusolver-dev - libcusparse-dev -- libraft==25.10.*,>=0.0.0a0 -- librmm==25.10.*,>=0.0.0a0 +- libraft==25.12.*,>=0.0.0a0 +- librmm==25.12.*,>=0.0.0a0 - nbsphinx - nccl>=2.19 - networkx>=2.5.1 @@ -48,20 +48,20 @@ dependencies: - pre-commit - pydantic - pydata-sphinx-theme -- pylibcudf==25.10.*,>=0.0.0a0 -- pylibraft==25.10.*,>=0.0.0a0 +- pylibcudf==25.12.*,>=0.0.0a0 +- pylibraft==25.12.*,>=0.0.0a0 - pytest - pytest-benchmark - pytest-cov - pytest-xdist - python-louvain - pytorch>=2.3 -- raft-dask==25.10.*,>=0.0.0a0 +- raft-dask==25.12.*,>=0.0.0a0 - rapids-build-backend>=0.4.0,<0.5.0.dev0 -- rapids-dask-dependency==25.10.*,>=0.0.0a0 +- rapids-dask-dependency==25.12.*,>=0.0.0a0 - recommonmark - requests -- rmm==25.10.*,>=0.0.0a0 +- rmm==25.12.*,>=0.0.0a0 - scikit-build-core>=0.10.0 - scikit-learn>=0.23.1 - scipy @@ -73,6 +73,6 @@ dependencies: - thriftpy2>=0.4.15,!=0.5.0,!=0.5.1 - torchdata - torchmetrics -- ucxx==0.46.*,>=0.0.0a0 +- ucxx==0.47.*,>=0.0.0a0 - wheel name: all_cuda-130_arch-x86_64 diff --git a/conda/recipes/cugraph-service/conda_build_config.yaml b/conda/recipes/cugraph-service/conda_build_config.yaml index b68b103a8c6..d184826ad70 100644 --- a/conda/recipes/cugraph-service/conda_build_config.yaml +++ b/conda/recipes/cugraph-service/conda_build_config.yaml @@ -1,2 +1,2 @@ ucxx_version: - - "0.46.*" + - "0.47.*" diff --git a/conda/recipes/cugraph/conda_build_config.yaml b/conda/recipes/cugraph/conda_build_config.yaml index 31c8458e484..8ae82bead69 100644 --- a/conda/recipes/cugraph/conda_build_config.yaml +++ b/conda/recipes/cugraph/conda_build_config.yaml @@ -17,4 +17,4 @@ c_stdlib_version: - "2.28" ucxx_version: - - "0.46.*" + - "0.47.*" diff --git a/conda/recipes/libcugraph/conda_build_config.yaml b/conda/recipes/libcugraph/conda_build_config.yaml index e0ef179dfe8..9c628db06e9 100644 --- a/conda/recipes/libcugraph/conda_build_config.yaml +++ b/conda/recipes/libcugraph/conda_build_config.yaml @@ -23,4 +23,4 @@ c_stdlib_version: - "2.28" libucxx_version: - - "0.46.*" + - "0.47.*" diff --git a/cpp/src/components/mis_impl.cuh b/cpp/src/components/mis_impl.cuh index 085b4837873..c567e0320d0 100644 --- a/cpp/src/components/mis_impl.cuh +++ b/cpp/src/components/mis_impl.cuh @@ -17,7 +17,8 @@ #pragma once #include "prims/fill_edge_src_dst_property.cuh" -#include "prims/per_v_transform_reduce_incoming_outgoing_e.cuh" +#include "prims/per_v_transform_reduce_incoming_outgoing_e.cuh" // FIXME: remove if unused +#include "prims/per_v_transform_reduce_if_incoming_outgoing_e.cuh" #include "prims/update_edge_src_dst_property.cuh" #include @@ -51,263 +52,242 @@ rmm::device_uvector maximal_independent_set( cugraph::graph_view_t const& graph_view, raft::random::RngState& rng_state) { - using GraphViewType = cugraph::graph_view_t; - - vertex_t local_vtx_partitoin_size = graph_view.local_vertex_partition_range_size(); - rmm::device_uvector remaining_vertices(local_vtx_partitoin_size, handle.get_stream()); + using GraphViewType = cugraph::graph_view_t; + vertex_t local_vtx_partition_size = graph_view.local_vertex_partition_range_size(); + auto vertex_begin = thrust::make_counting_iterator(graph_view.local_vertex_partition_range_first()); - auto vertex_end = thrust::make_counting_iterator(graph_view.local_vertex_partition_range_last()); - auto out_degrees = graph_view.compute_out_degrees(handle); - auto in_degrees = graph_view.compute_in_degrees(handle); - - // Vertices with degree zero are always part of MIS - remaining_vertices.resize( - cuda::std::distance( - remaining_vertices.begin(), - thrust::copy_if(handle.get_thrust_policy(), - vertex_begin, - vertex_end, - thrust::make_zip_iterator(out_degrees.begin(), in_degrees.begin()), - remaining_vertices.begin(), - [] __device__(auto out_deg_and_in_deg) { - return !((cuda::std::get<0>(out_deg_and_in_deg) == 0) && - (cuda::std::get<1>(out_deg_and_in_deg) == 0)); - })), - handle.get_stream()); + auto vertex_end = thrust::make_counting_iterator(graph_view.local_vertex_partition_range_last()); // Set ID of each vertex as its rank - rmm::device_uvector ranks(local_vtx_partitoin_size, handle.get_stream()); - thrust::copy(handle.get_thrust_policy(), vertex_begin, vertex_end, ranks.begin()); - - // Set ranks of zero degree vetices to std::numeric_limits::max() - thrust::transform_if(handle.get_thrust_policy(), - thrust::make_zip_iterator(out_degrees.begin(), in_degrees.begin()), - thrust::make_zip_iterator(out_degrees.end(), in_degrees.end()), - ranks.begin(), - cuda::proclaim_return_type( - [] __device__(auto) { return std::numeric_limits::max(); }), - [] __device__(auto in_out_degree) { - return (cuda::std::get<0>(in_out_degree) == 0) && - (cuda::std::get<1>(in_out_degree) == 0); - }); - - out_degrees.resize(0, handle.get_stream()); - out_degrees.shrink_to_fit(handle.get_stream()); - - in_degrees.resize(0, handle.get_stream()); - in_degrees.shrink_to_fit(handle.get_stream()); + rmm::device_uvector ranks(local_vtx_partition_size, handle.get_stream()); - size_t loop_counter = 0; - while (true) { - loop_counter++; + auto segment_offsets = graph_view.local_vertex_partition_segment_offsets(); - // Copy ranks into temporary vector to begin with + vertex_t isolated_v_start = multi_gpu ? segment_offsets->data()[4] : segment_offsets->data()[3]; + // Only the non zero degree vertices are part of the initial 'remaining_vertices' list + rmm::device_uvector remaining_vertices(isolated_v_start, handle.get_stream()); - rmm::device_uvector temporary_ranks(local_vtx_partitoin_size, handle.get_stream()); - thrust::copy(handle.get_thrust_policy(), ranks.begin(), ranks.end(), temporary_ranks.begin()); + thrust::for_each( + handle.get_thrust_policy(), + thrust::make_counting_iterator(0), + thrust::make_counting_iterator(graph_view.local_vertex_partition_range_size()), + [ + isolated_v_start = multi_gpu ? segment_offsets->data()[4] : segment_offsets->data()[3], + ranks = raft::device_span(ranks.data(), ranks.size()), + remaining_vertices = raft::device_span(remaining_vertices.data(), remaining_vertices.size()), + v_first = graph_view.local_vertex_partition_range_first()] __device__(auto idx) { + + + if (idx < isolated_v_start) { + // initializing the ranks array + ranks[idx] = v_first + idx; + // initializing the remaining vertices array + remaining_vertices[idx] = v_first + idx; + } else { + // zero-degree vertices are always part of the MIS + ranks[idx] = std::numeric_limits::max(); + } + + }); + + auto num_buckets = 1; + + vertex_frontier_t vertex_frontier(handle, + num_buckets); + + size_t loop_counter = 0; + vertex_t nr_remaining_vertices_to_check = remaining_vertices.size(); + vertex_t nr_remaining_local_vertices_to_check = remaining_vertices.size(); + edge_dst_property_t dst_rank_cache(handle); - // Select a random set of candidate vertices - vertex_t nr_remaining_vertices_to_check = remaining_vertices.size(); - if (multi_gpu) { - nr_remaining_vertices_to_check = host_scalar_allreduce(handle.get_comms(), - nr_remaining_vertices_to_check, - raft::comms::op_t::SUM, - handle.get_stream()); - } - - vertex_t nr_candidates = (nr_remaining_vertices_to_check < 1024) - ? nr_remaining_vertices_to_check - : std::min(static_cast((0.50 + 0.25 * loop_counter) * - nr_remaining_vertices_to_check), - nr_remaining_vertices_to_check); - - // FIXME: Can we improve performance here? - // FIXME: if(nr_remaining_vertices_to_check < 1024), may avoid calling select_random_vertices - auto d_sampled_vertices = - cugraph::select_random_vertices(handle, - graph_view, - std::make_optional(raft::device_span{ - remaining_vertices.data(), remaining_vertices.size()}), - rng_state, - nr_candidates, - false, - true); - - rmm::device_uvector non_candidate_vertices( - remaining_vertices.size() - d_sampled_vertices.size(), handle.get_stream()); - - thrust::set_difference(handle.get_thrust_policy(), - remaining_vertices.begin(), - remaining_vertices.end(), - d_sampled_vertices.begin(), - d_sampled_vertices.end(), - non_candidate_vertices.begin()); - - // Set temporary ranks of non-candidate vertices to std::numeric_limits::lowest() - thrust::for_each( - handle.get_thrust_policy(), - non_candidate_vertices.begin(), - non_candidate_vertices.end(), - [temporary_ranks = - raft::device_span(temporary_ranks.data(), temporary_ranks.size()), - v_first = graph_view.local_vertex_partition_range_first()] __device__(auto v) { - // - // if rank of a non-candidate vertex is not std::numeric_limits::max() (i.e. the - // vertex is not already in MIS), set it to std::numeric_limits::lowest() - // - auto v_offset = v - v_first; - if (temporary_ranks[v_offset] < std::numeric_limits::max()) { - temporary_ranks[v_offset] = std::numeric_limits::lowest(); - } - }); + while (true) { + loop_counter++; - // Caches for ranks - edge_src_property_t src_rank_cache(handle); - edge_dst_property_t dst_rank_cache(handle); + auto num_processed_vertices = remaining_vertices.size() - nr_remaining_local_vertices_to_check; - // Update rank caches with temporary ranks if constexpr (multi_gpu) { - src_rank_cache = edge_src_property_t(handle, graph_view); - dst_rank_cache = edge_dst_property_t(handle, graph_view); - update_edge_src_property( - handle, graph_view, temporary_ranks.begin(), src_rank_cache.mutable_view()); - update_edge_dst_property( - handle, graph_view, temporary_ranks.begin(), dst_rank_cache.mutable_view()); + if (loop_counter == 1) { + // Update the property of all edge endpoints during the + // first iteration + dst_rank_cache = edge_dst_property_t(handle, graph_view); + + update_edge_dst_property( + handle, graph_view, ranks.begin(), dst_rank_cache.mutable_view()); + + } else { + // Only update the property of endpoints that had their ranks modified + rmm::device_uvector processed_ranks( + num_processed_vertices, handle.get_stream()); + + auto pair_idx_processed_vertex_first = thrust::make_zip_iterator( + thrust::make_counting_iterator(0), + remaining_vertices.begin() + nr_remaining_local_vertices_to_check + ); + + thrust::for_each( + handle.get_thrust_policy(), + pair_idx_processed_vertex_first, + pair_idx_processed_vertex_first + num_processed_vertices, + [processed_ranks = + raft::device_span(processed_ranks.data(), processed_ranks.size()), + ranks = + raft::device_span(ranks.data(), ranks.size()), + v_first = graph_view.local_vertex_partition_range_first()] __device__(auto pair_idx_v) { + + auto idx = thrust::get<0>(pair_idx_v); + auto v = thrust::get<1>(pair_idx_v); + auto v_offset = v - v_first; + + processed_ranks[idx] = ranks[v_offset]; + }); + + // Only update a subset of the graph edge dst property values + + // FIXME: Since we know that the property being updated are either + // std::numeric_limits::max() or std::numeric_limits::min(), + // explore 'fill_edge_dst_property' which is faster + update_edge_dst_property( + handle, + graph_view, + remaining_vertices.begin() + nr_remaining_local_vertices_to_check, + remaining_vertices.end(), + processed_ranks.begin(), + dst_rank_cache.mutable_view() + ); + + } } - // - // Find maximum rank outgoing neighbor for each vertex - // - - rmm::device_uvector max_outgoing_ranks(local_vtx_partitoin_size, handle.get_stream()); - - per_v_transform_reduce_outgoing_e( - handle, - graph_view, - multi_gpu ? src_rank_cache.view() - : make_edge_src_property_view( - graph_view, temporary_ranks.begin(), temporary_ranks.size()), - multi_gpu ? dst_rank_cache.view() - : make_edge_dst_property_view( - graph_view, temporary_ranks.begin(), temporary_ranks.size()), - edge_dummy_property_t{}.view(), - [] __device__(auto src, auto dst, auto src_rank, auto dst_rank, auto wt) { return dst_rank; }, - std::numeric_limits::lowest(), - cugraph::reduce_op::maximum{}, - max_outgoing_ranks.begin()); - - // - // Find maximum rank incoming neighbor for each vertex - // + rmm::device_uvector max_outgoing_ranks( + nr_remaining_local_vertices_to_check, handle.get_stream()); - rmm::device_uvector max_incoming_ranks(local_vtx_partitoin_size, handle.get_stream()); - - per_v_transform_reduce_incoming_e( - handle, - graph_view, - multi_gpu ? src_rank_cache.view() - : make_edge_src_property_view( - graph_view, temporary_ranks.begin(), temporary_ranks.size()), - multi_gpu ? dst_rank_cache.view() - : make_edge_dst_property_view( - graph_view, temporary_ranks.begin(), temporary_ranks.size()), - edge_dummy_property_t{}.view(), - [] __device__(auto src, auto dst, auto src_rank, auto dst_rank, auto wt) { return src_rank; }, - std::numeric_limits::lowest(), - cugraph::reduce_op::maximum{}, - max_incoming_ranks.begin()); - - temporary_ranks.resize(0, handle.get_stream()); - temporary_ranks.shrink_to_fit(handle.get_stream()); - - // - // Compute max of outgoing and incoming neighbors - // - thrust::transform(handle.get_thrust_policy(), - max_incoming_ranks.begin(), - max_incoming_ranks.end(), - max_outgoing_ranks.begin(), - max_outgoing_ranks.begin(), - thrust::maximum()); + remaining_vertices.resize(nr_remaining_local_vertices_to_check, + handle.get_stream()); + remaining_vertices.shrink_to_fit(handle.get_stream()); - max_incoming_ranks.resize(0, handle.get_stream()); - max_incoming_ranks.shrink_to_fit(handle.get_stream()); + vertex_frontier.bucket(0).clear(); + + vertex_frontier.bucket(0).insert(remaining_vertices.begin(), remaining_vertices.end()); + + if (loop_counter == 1) { + // FIXME: The optimization below is not appropriate for the current + // implementation since the neighbor with the highest priority + // needs to be retrieved to update its rank if possible in the 'rank' + // array. When using this primitive, it will stop once the first higher + // priority neighbor is found which may not be the highest. This + // will lead to more iterations until the highest priority neighbor + // is found if any (this will increase the overall runtime). + per_v_transform_reduce_if_outgoing_e( + handle, + graph_view, + vertex_frontier.bucket(0), + edge_src_dummy_property_t{}.view(), + multi_gpu ? dst_rank_cache.view() + : make_edge_dst_property_view( + graph_view, ranks.begin(), ranks.size()), + edge_dummy_property_t{}.view(), + [] __device__(auto src, auto dst, auto src_rank, auto dst_rank, auto wt) { return dst_rank; }, + std::numeric_limits::lowest(), + reduce_op::any(), + // just use auto, auto remove src_rank and wt # FIXME: address this. + [] __device__(auto src, auto dst, auto src_rank, auto dst_rank, auto wt) { return src < dst_rank; }, + max_outgoing_ranks.begin(), + false); // FIXME: Set expensive check to False + } else { + per_v_transform_reduce_outgoing_e( + handle, + graph_view, + vertex_frontier.bucket(0), + edge_src_dummy_property_t{}.view(), + + multi_gpu ? dst_rank_cache.view() + : make_edge_dst_property_view( + graph_view, ranks.begin(), ranks.size()), + + edge_dummy_property_t{}.view(), + [] __device__(auto src, auto dst, auto src_rank, auto dst_rank, auto wt) { return dst_rank; }, + std::numeric_limits::lowest(), + cugraph::reduce_op::maximum{}, + max_outgoing_ranks.begin(), + false); + } + + auto pair_idx_vertex_first = thrust::make_zip_iterator( // FIXME: rename this. + thrust::make_counting_iterator(0), + remaining_vertices.begin() + ); + // // If the max neighbor of a vertex is already in MIS (i.e. has rank // std::numeric_limits::max()), discard it, otherwise, // include the vertex if it has larger rank than its maximum rank neighbor // - auto last = thrust::remove_if( + + // Use thrust::stable_partition to keep track of vertices that only needs to have + // their property updated + auto last = thrust::stable_partition( handle.get_thrust_policy(), - d_sampled_vertices.begin(), - d_sampled_vertices.end(), + pair_idx_vertex_first, // FIXME: Same here, no need to pass an iterator, just follow the pseudo code + pair_idx_vertex_first + remaining_vertices.size(), [max_rank_neighbor_first = max_outgoing_ranks.begin(), - ranks = raft::device_span(ranks.data(), ranks.size()), - v_first = graph_view.local_vertex_partition_range_first()] __device__(auto v) { + ranks = raft::device_span(ranks.data(), ranks.size()), + v_first = graph_view.local_vertex_partition_range_first()] __device__(auto pair_vidx_v_priority) { + + auto vidx = thrust::get<0>(pair_vidx_v_priority); + auto v = thrust::get<1>(pair_vidx_v_priority); auto v_offset = v - v_first; - auto max_neighbor_rank = *(max_rank_neighbor_first + v_offset); + auto max_neighbor_rank = *(max_rank_neighbor_first + vidx); auto rank_of_v = ranks[v_offset]; if (max_neighbor_rank >= std::numeric_limits::max()) { - // Maximum rank neighbor is alreay in MIS - // Discard current vertex by setting its rank to - // std::numeric_limits::lowest() ranks[v_offset] = std::numeric_limits::lowest(); - return true; + return false; } if (rank_of_v >= max_neighbor_rank) { - // Include v and set its rank to std::numeric_limits::max() ranks[v_offset] = std::numeric_limits::max(); - return true; + return false; } - return false; + return true; }); + nr_remaining_local_vertices_to_check = cuda::std::distance(pair_idx_vertex_first, last), + handle.get_stream(); + max_outgoing_ranks.resize(0, handle.get_stream()); max_outgoing_ranks.shrink_to_fit(handle.get_stream()); - d_sampled_vertices.resize(cuda::std::distance(d_sampled_vertices.begin(), last), - handle.get_stream()); - d_sampled_vertices.shrink_to_fit(handle.get_stream()); - - remaining_vertices.resize(non_candidate_vertices.size() + d_sampled_vertices.size(), - handle.get_stream()); - remaining_vertices.shrink_to_fit(handle.get_stream()); - - // merge non-candidate and remaining candidate vertices - thrust::merge(handle.get_thrust_policy(), - non_candidate_vertices.begin(), - non_candidate_vertices.end(), - d_sampled_vertices.begin(), - d_sampled_vertices.end(), - remaining_vertices.begin()); - - nr_remaining_vertices_to_check = remaining_vertices.size(); if (multi_gpu) { + // FIXME: rename to 'nr_remaining_vertices_to_check' to + // 'nr_remaining_global_vertices_to_check' nr_remaining_vertices_to_check = host_scalar_allreduce(handle.get_comms(), - nr_remaining_vertices_to_check, + nr_remaining_local_vertices_to_check, raft::comms::op_t::SUM, handle.get_stream()); + } else { + nr_remaining_vertices_to_check = nr_remaining_local_vertices_to_check; } if (nr_remaining_vertices_to_check == 0) { break; } - } - - // Count number of vertices included in MIS + } + vertex_t nr_vertices_included_in_mis = thrust::count_if( handle.get_thrust_policy(), ranks.begin(), ranks.end(), [] __device__(auto v_rank) { return v_rank >= std::numeric_limits::max(); }); // Build MIS and return + + RAFT_CUDA_TRY(cudaDeviceSynchronize()); + auto start_build_mis = high_resolution_clock::now(); + rmm::device_uvector mis(nr_vertices_included_in_mis, handle.get_stream()); thrust::copy_if( handle.get_thrust_policy(), @@ -319,6 +299,21 @@ rmm::device_uvector maximal_independent_set( ranks.resize(0, handle.get_stream()); ranks.shrink_to_fit(handle.get_stream()); + + if (multi_gpu) { + // FIXME: rename to 'nr_remaining_vertices_to_check' to + // 'nr_remaining_global_vertices_to_check' + mis_size = host_scalar_allreduce(handle.get_comms(), + mis_size, + raft::comms::op_t::SUM, + handle.get_stream()); + + mis_size_perc = host_scalar_allreduce(handle.get_comms(), + mis_size_perc, + raft::comms::op_t::SUM, + handle.get_stream()); + } + return mis; } } // namespace detail diff --git a/cpp/tests/components/mis_test.cu b/cpp/tests/components/mis_test.cu index 0edbccfc356..8390dd30678 100644 --- a/cpp/tests/components/mis_test.cu +++ b/cpp/tests/components/mis_test.cu @@ -15,6 +15,7 @@ */ #include "prims/per_v_transform_reduce_incoming_outgoing_e.cuh" +#include "prims/per_v_transform_reduce_if_incoming_outgoing_e.cuh" #include "prims/reduce_op.cuh" #include "utilities/base_fixture.hpp" #include "utilities/test_graphs.hpp" @@ -25,6 +26,7 @@ #include #include #include +#include #include #include @@ -51,9 +53,10 @@ class Tests_SGMaximalIndependentSet virtual void SetUp() {} virtual void TearDown() {} - template + template void run_current_test(std::tuple const& param) { + auto [mis_usecase, input_usecase] = param; raft::handle_t handle{}; @@ -66,9 +69,14 @@ class Tests_SGMaximalIndependentSet constexpr bool multi_gpu = false; + bool test_weighted = false; + bool renumber = true; + bool drop_self_loops = true; + bool drop_multi_edges = true; + auto [sg_graph, sg_edge_weights, sg_renumber_map] = cugraph::test::construct_graph( - handle, input_usecase, false, true); + handle, input_usecase, test_weighted, renumber, drop_self_loops, drop_multi_edges); if (cugraph::test::g_perf) { RAFT_CUDA_TRY(cudaDeviceSynchronize()); @@ -76,11 +84,15 @@ class Tests_SGMaximalIndependentSet hr_timer.stop(); hr_timer.display_and_clear(std::cout); } - + auto sg_graph_view = sg_graph.view(); auto sg_edge_weight_view = sg_edge_weights ? std::make_optional((*sg_edge_weights).view()) : std::nullopt; + auto edge_partition = sg_graph_view.local_edge_partition_view(0); + + auto number_of_local_edges = edge_partition.number_of_edges(); + raft::random::RngState rng_state(0); auto d_mis = cugraph::maximal_independent_set( handle, sg_graph_view, rng_state); @@ -103,7 +115,7 @@ class Tests_SGMaximalIndependentSet // If a vertex is included in MIS, then none of its neighbor should be vertex_t local_vtx_partitoin_size = sg_graph_view.local_vertex_partition_range_size(); - rmm::device_uvector d_total_outgoing_nbrs_included_mis(local_vtx_partitoin_size, + rmm::device_uvector d_any_outgoing_nbrs_included_mis(local_vtx_partitoin_size, handle.get_stream()); rmm::device_uvector inclusiong_flags(local_vtx_partitoin_size, handle.get_stream()); @@ -124,47 +136,93 @@ class Tests_SGMaximalIndependentSet RAFT_CUDA_TRY(cudaDeviceSynchronize()); - per_v_transform_reduce_outgoing_e( + per_v_transform_reduce_if_outgoing_e( handle, sg_graph_view, cugraph::make_edge_src_property_view( - sg_graph_view, inclusiong_flags.data(), 1), + sg_graph_view, inclusiong_flags.data(), inclusiong_flags.size()), cugraph::make_edge_dst_property_view( - sg_graph_view, inclusiong_flags.data(), 1), + sg_graph_view, inclusiong_flags.data(), inclusiong_flags.size()), cugraph::edge_dummy_property_t{}.view(), - [] __device__(auto src, auto dst, auto src_included, auto dst_included, auto wt) { - return (src == dst) ? 0 : dst_included; - }, + [] __device__(auto src, auto dst, auto src_included, auto dst_included, auto wt) { return vertex_t{1}; }, vertex_t{0}, - cugraph::reduce_op::plus{}, - d_total_outgoing_nbrs_included_mis.begin()); - - RAFT_CUDA_TRY(cudaDeviceSynchronize()); - - std::vector h_total_outgoing_nbrs_included_mis( - d_total_outgoing_nbrs_included_mis.size()); - raft::update_host(h_total_outgoing_nbrs_included_mis.data(), - d_total_outgoing_nbrs_included_mis.data(), - d_total_outgoing_nbrs_included_mis.size(), - handle.get_stream()); + cugraph::reduce_op::any(), + // just use auto, auto remove src_rank and wt # FIXME: address this. + [] __device__(auto src, auto dst, auto src_included, auto dst_included, auto wt) { + // Adjacent vertices are in the MIS + return (src_included == dst_included) && (src_included == 1); + }, + d_any_outgoing_nbrs_included_mis.begin(), + false); + + auto num_invalid_vertices_in_mis = thrust::reduce( + handle.get_thrust_policy(), + d_any_outgoing_nbrs_included_mis.begin(), + d_any_outgoing_nbrs_included_mis.end()); RAFT_CUDA_TRY(cudaDeviceSynchronize()); - { - auto vertex_first = sg_graph_view.local_vertex_partition_range_first(); - auto vertex_last = sg_graph_view.local_vertex_partition_range_last(); + ASSERT_TRUE(num_invalid_vertices_in_mis == 0); + + auto vertex_begin = + thrust::make_counting_iterator(sg_graph_view.local_vertex_partition_range_first()); + + auto vertex_end = + thrust::make_counting_iterator(sg_graph_view.local_vertex_partition_range_last()); + + rmm::device_uvector vertices(local_vtx_partitoin_size, + handle.get_stream()); + + thrust::copy(handle.get_thrust_policy(), vertex_begin, vertex_end, vertices.begin()); + + rmm::device_uvector non_candidate_vertices( + vertices.size() - d_mis.size(), handle.get_stream()); + + thrust::set_difference(handle.get_thrust_policy(), + vertices.begin(), + vertices.end(), + d_mis.begin(), + d_mis.end(), + non_candidate_vertices.begin()); + + cugraph::vertex_frontier_t vertex_frontier( + handle, + 1); + + vertex_frontier.bucket(0).insert(non_candidate_vertices.begin(), non_candidate_vertices.end()); + + d_any_outgoing_nbrs_included_mis.resize(non_candidate_vertices.size(), handle.get_stream()); - std::for_each(h_mis.begin(), - h_mis.end(), - [vertex_first, vertex_last, &h_total_outgoing_nbrs_included_mis](vertex_t v) { - ASSERT_TRUE((v >= vertex_first) && (v < vertex_last)) - << v << " is not within vertex parition range" << std::endl; + per_v_transform_reduce_if_outgoing_e( + handle, + sg_graph_view, + vertex_frontier.bucket(0), + cugraph::make_edge_src_property_view( + sg_graph_view, inclusiong_flags.data(), inclusiong_flags.size()), + cugraph::make_edge_dst_property_view( + sg_graph_view, inclusiong_flags.data(), inclusiong_flags.size()), + cugraph::edge_dummy_property_t{}.view(), + [] __device__(auto src, auto dst, auto src_included, auto dst_included, auto wt) { return vertex_t{1}; }, + vertex_t{0}, + cugraph::reduce_op::any(), + // just use auto, auto remove src_rank and wt # FIXME: address this. + [] __device__(auto src, auto dst, auto src_included, auto dst_included, auto wt) { + // Adjacent vertices are in the MIS + return dst_included == 1; + }, + d_any_outgoing_nbrs_included_mis.begin(), + false); - ASSERT_TRUE(h_total_outgoing_nbrs_included_mis[v - vertex_first] == 0) - << v << "'s neighbor is included in MIS" << std::endl; - }); - } + auto num_invalid_non_candidate_vertices_out_mis = thrust::reduce( + handle.get_thrust_policy(), + d_any_outgoing_nbrs_included_mis.begin(), + d_any_outgoing_nbrs_included_mis.end()); + + // FIXME: Add an error message + ASSERT_TRUE( + num_invalid_non_candidate_vertices_out_mis == d_any_outgoing_nbrs_included_mis.size()); } + } }; diff --git a/dependencies.yaml b/dependencies.yaml index 32943f0d234..42f8cdf2e95 100755 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -403,7 +403,7 @@ dependencies: common: - output_types: [conda, pyproject, requirements] packages: - - &dask rapids-dask-dependency==25.10.*,>=0.0.0a0 + - &dask rapids-dask-dependency==25.12.*,>=0.0.0a0 - &numba numba>=0.60.0,<0.62.0a0 - &numpy numpy>=1.23,<3.0a0 - output_types: conda @@ -499,7 +499,7 @@ dependencies: common: - output_types: conda packages: - - &cugraph_unsuffixed cugraph==25.10.*,>=0.0.0a0 + - &cugraph_unsuffixed cugraph==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -512,18 +512,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - cugraph-cu12==25.10.*,>=0.0.0a0 + - cugraph-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - cugraph-cu13==25.10.*,>=0.0.0a0 + - cugraph-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*cugraph_unsuffixed]} depends_on_cugraph_service_client: common: - output_types: [conda, requirements, pyproject] packages: - - cugraph-service-client==25.10.*,>=0.0.0a0 + - cugraph-service-client==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -533,7 +533,7 @@ dependencies: common: - output_types: [conda, requirements, pyproject] packages: - - cugraph-service-server==25.10.*,>=0.0.0a0 + - cugraph-service-server==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -543,12 +543,12 @@ dependencies: common: - output_types: conda packages: - - libcugraph_etl==25.10.*,>=0.0.0a0 + - libcugraph_etl==25.12.*,>=0.0.0a0 depends_on_libcugraph_tests: common: - output_types: conda packages: - - libcugraph-tests==25.10.*,>=0.0.0a0 + - libcugraph-tests==25.12.*,>=0.0.0a0 depends_on_pytorch: common: - output_types: [conda] @@ -591,12 +591,12 @@ dependencies: common: - output_types: conda packages: - - libcudf==25.10.*,>=0.0.0a0 + - libcudf==25.12.*,>=0.0.0a0 depends_on_libraft: common: - output_types: conda packages: - - &libraft_unsuffixed libraft==25.10.*,>=0.0.0a0 + - &libraft_unsuffixed libraft==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -609,18 +609,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - libraft-cu12==25.10.*,>=0.0.0a0 + - libraft-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - libraft-cu13==25.10.*,>=0.0.0a0 + - libraft-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*libraft_unsuffixed]} depends_on_librmm: common: - output_types: conda packages: - - &librmm_unsuffixed librmm==25.10.*,>=0.0.0a0 + - &librmm_unsuffixed librmm==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -633,18 +633,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - librmm-cu12==25.10.*,>=0.0.0a0 + - librmm-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - librmm-cu13==25.10.*,>=0.0.0a0 + - librmm-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*librmm_unsuffixed]} depends_on_rmm: common: - output_types: conda packages: - - &rmm_unsuffixed rmm==25.10.*,>=0.0.0a0 + - &rmm_unsuffixed rmm==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -657,18 +657,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - rmm-cu12==25.10.*,>=0.0.0a0 + - rmm-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - rmm-cu13==25.10.*,>=0.0.0a0 + - rmm-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*rmm_unsuffixed]} depends_on_pylibcudf: common: - output_types: conda packages: - - &pylibcudf_unsuffixed pylibcudf==25.10.*,>=0.0.0a0 + - &pylibcudf_unsuffixed pylibcudf==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -681,18 +681,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - pylibcudf-cu12==25.10.*,>=0.0.0a0 + - pylibcudf-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - pylibcudf-cu13==25.10.*,>=0.0.0a0 + - pylibcudf-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*pylibcudf_unsuffixed]} depends_on_cudf: common: - output_types: conda packages: - - &cudf_unsuffixed cudf==25.10.*,>=0.0.0a0 + - &cudf_unsuffixed cudf==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -705,18 +705,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - cudf-cu12==25.10.*,>=0.0.0a0 + - cudf-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - cudf-cu13==25.10.*,>=0.0.0a0 + - cudf-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*cudf_unsuffixed]} depends_on_dask_cuda: common: - output_types: conda packages: - - &dask_cuda_unsuffixed dask-cuda==25.10.*,>=0.0.0a0 + - &dask_cuda_unsuffixed dask-cuda==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -729,12 +729,12 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - dask-cuda[cu12]==25.10.*,>=0.0.0a0 + - dask-cuda[cu12]==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - dask-cuda[cu13]==25.10.*,>=0.0.0a0 + - dask-cuda[cu13]==25.12.*,>=0.0.0a0 - matrix: packages: - *dask_cuda_unsuffixed @@ -742,7 +742,7 @@ dependencies: common: - output_types: conda packages: - - &dask_cudf_unsuffixed dask-cudf==25.10.*,>=0.0.0a0 + - &dask_cudf_unsuffixed dask-cudf==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -755,18 +755,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - dask-cudf-cu12==25.10.*,>=0.0.0a0 + - dask-cudf-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - dask-cudf-cu13==25.10.*,>=0.0.0a0 + - dask-cudf-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*dask_cudf_unsuffixed]} depends_on_pylibraft: common: - output_types: conda packages: - - &pylibraft_unsuffixed pylibraft==25.10.*,>=0.0.0a0 + - &pylibraft_unsuffixed pylibraft==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -779,18 +779,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - pylibraft-cu12==25.10.*,>=0.0.0a0 + - pylibraft-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - pylibraft-cu13==25.10.*,>=0.0.0a0 + - pylibraft-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*pylibraft_unsuffixed]} depends_on_raft_dask: common: - output_types: conda packages: - - &raft_dask_unsuffixed raft-dask==25.10.*,>=0.0.0a0 + - &raft_dask_unsuffixed raft-dask==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -803,18 +803,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - raft-dask-cu12==25.10.*,>=0.0.0a0 + - raft-dask-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - raft-dask-cu13==25.10.*,>=0.0.0a0 + - raft-dask-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*raft_dask_unsuffixed]} depends_on_libcugraph: common: - output_types: conda packages: - - &libcugraph_unsuffixed libcugraph==25.10.*,>=0.0.0a0 + - &libcugraph_unsuffixed libcugraph==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -827,18 +827,18 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - libcugraph-cu12==25.10.*,>=0.0.0a0 + - libcugraph-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - libcugraph-cu13==25.10.*,>=0.0.0a0 + - libcugraph-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*libcugraph_unsuffixed]} depends_on_pylibcugraph: common: - output_types: conda packages: - - &pylibcugraph_unsuffixed pylibcugraph==25.10.*,>=0.0.0a0 + - &pylibcugraph_unsuffixed pylibcugraph==25.12.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -851,12 +851,12 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - pylibcugraph-cu12==25.10.*,>=0.0.0a0 + - pylibcugraph-cu12==25.12.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - pylibcugraph-cu13==25.10.*,>=0.0.0a0 + - pylibcugraph-cu13==25.12.*,>=0.0.0a0 - {matrix: null, packages: [*pylibcugraph_unsuffixed]} depends_on_cupy: common: @@ -881,7 +881,7 @@ dependencies: common: - output_types: conda packages: - - &ucxx_unsuffixed ucxx==0.46.*,>=0.0.0a0 + - &ucxx_unsuffixed ucxx==0.47.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file @@ -894,10 +894,10 @@ dependencies: cuda: "12.*" cuda_suffixed: "true" packages: - - ucxx-cu12==0.46.*,>=0.0.0a0 + - ucxx-cu12==0.47.*,>=0.0.0a0 - matrix: cuda: "13.*" cuda_suffixed: "true" packages: - - ucxx-cu13==0.46.*,>=0.0.0a0 + - ucxx-cu13==0.47.*,>=0.0.0a0 - {matrix: null, packages: [*ucxx_unsuffixed]} diff --git a/notebooks/README.md b/notebooks/README.md index 7a7254644a0..f77b35062bb 100644 --- a/notebooks/README.md +++ b/notebooks/README.md @@ -63,13 +63,13 @@ The easiest way to run the notebooks is to get the latest [rapidsai/notebooks](h For example, get the latest (as of writing the document) nightly image (`a` after the version number indicates that an image is nightly) with cuda 12.0 using ```sh -docker pull rapidsai/notebooks:25.10a-cuda12.0-py3.10 +docker pull rapidsai/notebooks:25.12a-cuda12.0-py3.10 ``` And, then run a container based on the image using ```sh -docker run --rm -it --pull always --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p 8888:8888 rapidsai/notebooks:25.10a-cuda12.0-py3.10 +docker run --rm -it --pull always --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p 8888:8888 rapidsai/notebooks:25.12a-cuda12.0-py3.10 ``` You are all set. Run and edit cugraph notebooks from a browser at url http://127.0.0.1:8888/lab/tree/cugraph/cugraph_benchmarks @@ -85,8 +85,8 @@ ssh -L 127.0.0.1:8888:127.0.0.1:8888 [USER_NAME@][REMOTE_HOST_NAME or REMOTE_HO and then run the container in your remote machine. ```sh -docker pull rapidsai/notebooks:25.10a-cuda12.0-py3.10 -docker run --rm -it --pull always --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p 8888:8888 rapidsai/notebooks:25.10a-cuda12.0-py3.10 +docker pull rapidsai/notebooks:25.12a-cuda12.0-py3.10 +docker run --rm -it --pull always --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p 8888:8888 rapidsai/notebooks:25.12a-cuda12.0-py3.10 ``` You can run and edit cugraph notebooks at url http://127.0.0.1:8888/lab/tree/cugraph/cugraph_benchmarks as if they are running locally. diff --git a/notebooks/algorithms/structure/Renumber.ipynb b/notebooks/algorithms/structure/Renumber.ipynb index 0a2d1a51106..2878141897c 100755 --- a/notebooks/algorithms/structure/Renumber.ipynb +++ b/notebooks/algorithms/structure/Renumber.ipynb @@ -105,7 +105,7 @@ " 'dest_as_int': dest_as_int\n", " })\n", "\n", - "gdf = cudf.DataFrame.from_pandas(df[['source_as_int', 'dest_as_int']])\n", + "gdf = cudf.DataFrame(df[['source_as_int', 'dest_as_int']])\n", "\n", "gdf.to_pandas()" ] @@ -310,7 +310,7 @@ "metadata": {}, "outputs": [], "source": [ - "gdf = cudf.DataFrame.from_pandas(df[['source_list', 'dest_list']])\n", + "gdf = cudf.DataFrame(df[['source_list', 'dest_list']])\n", "\n", "G = cugraph.Graph()\n", "G.from_cudf_edgelist(gdf, source='source_list', destination='dest_list', renumber=True)\n", diff --git a/python/cugraph-service/client/pyproject.toml b/python/cugraph-service/client/pyproject.toml index 8bdc7803e7b..18f5142a19f 100644 --- a/python/cugraph-service/client/pyproject.toml +++ b/python/cugraph-service/client/pyproject.toml @@ -38,7 +38,7 @@ Documentation = "https://docs.rapids.ai/api/cugraph/stable/" [project.optional-dependencies] test = [ - "cudf==25.10.*,>=0.0.0a0", + "cudf==25.12.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", "numpy>=1.23,<3.0a0", "pandas", diff --git a/python/cugraph-service/server/pyproject.toml b/python/cugraph-service/server/pyproject.toml index 07084a16514..e27f089a9db 100644 --- a/python/cugraph-service/server/pyproject.toml +++ b/python/cugraph-service/server/pyproject.toml @@ -20,17 +20,17 @@ authors = [ license = { text = "Apache-2.0" } requires-python = ">=3.10" dependencies = [ - "cudf==25.10.*,>=0.0.0a0", - "cugraph-service-client==25.10.*,>=0.0.0a0", - "cugraph==25.10.*,>=0.0.0a0", + "cudf==25.12.*,>=0.0.0a0", + "cugraph-service-client==25.12.*,>=0.0.0a0", + "cugraph==25.12.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", - "dask-cuda==25.10.*,>=0.0.0a0", - "dask-cudf==25.10.*,>=0.0.0a0", + "dask-cuda==25.12.*,>=0.0.0a0", + "dask-cudf==25.12.*,>=0.0.0a0", "numpy>=1.23,<3.0a0", - "rapids-dask-dependency==25.10.*,>=0.0.0a0", - "rmm==25.10.*,>=0.0.0a0", + "rapids-dask-dependency==25.12.*,>=0.0.0a0", + "rmm==25.12.*,>=0.0.0a0", "thriftpy2>=0.4.15,!=0.5.0,!=0.5.1", - "ucxx==0.46.*,>=0.0.0a0", + "ucxx==0.47.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../../dependencies.yaml and run `rapids-dependency-file-generator`. classifiers = [ "Intended Audience :: Developers", diff --git a/python/cugraph/cugraph/structure/graph_classes.py b/python/cugraph/cugraph/structure/graph_classes.py index 692e2b28454..bf3a5d81600 100644 --- a/python/cugraph/cugraph/structure/graph_classes.py +++ b/python/cugraph/cugraph/structure/graph_classes.py @@ -460,7 +460,7 @@ def from_pandas_edgelist( if not isinstance(pdf, pd.DataFrame): raise TypeError("pdf input is not a Pandas DataFrame") - gdf = cudf.DataFrame.from_pandas(pdf) + gdf = cudf.DataFrame(pdf) self.from_cudf_edgelist( gdf, source=source, diff --git a/python/cugraph/cugraph/tests/internals/test_renumber.py b/python/cugraph/cugraph/tests/internals/test_renumber.py index cd27dfecfe9..5463808d61f 100644 --- a/python/cugraph/cugraph/tests/internals/test_renumber.py +++ b/python/cugraph/cugraph/tests/internals/test_renumber.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019-2023, NVIDIA CORPORATION. +# Copyright (c) 2019-2025, NVIDIA CORPORATION. # 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 @@ -78,7 +78,7 @@ def test_renumber_negative_col(): df = pd.DataFrame({"source_list": source_list, "dest_list": dest_list}) - gdf = cudf.DataFrame.from_pandas(df[["source_list", "dest_list"]]) + gdf = cudf.DataFrame(df[["source_list", "dest_list"]]) gdf["original_src"] = gdf["source_list"] gdf["original_dst"] = gdf["dest_list"] diff --git a/python/cugraph/cugraph/tests/link_analysis/test_hits.py b/python/cugraph/cugraph/tests/link_analysis/test_hits.py index fcfd8cc5318..95cbe7794b2 100644 --- a/python/cugraph/cugraph/tests/link_analysis/test_hits.py +++ b/python/cugraph/cugraph/tests/link_analysis/test_hits.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2023, NVIDIA CORPORATION. +# Copyright (c) 2020-2025, NVIDIA CORPORATION. # 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 @@ -112,9 +112,9 @@ def test_hits(benchmark, input_expected_output): # Update the cugraph HITS results with Nx results for easy comparison using # cuDF DataFrame methods. pdf = pd.DataFrame.from_dict(nx_hubs, orient="index").sort_index() - cugraph_hits["nx_hubs"] = cudf.Series.from_pandas(pdf[0]) + cugraph_hits["nx_hubs"] = cudf.Series(pdf[0]) pdf = pd.DataFrame.from_dict(nx_authorities, orient="index").sort_index() - cugraph_hits["nx_authorities"] = cudf.Series.from_pandas(pdf[0]) + cugraph_hits["nx_authorities"] = cudf.Series(pdf[0]) hubs_diffs1 = cugraph_hits.query("hubs - nx_hubs > 0.00001") hubs_diffs2 = cugraph_hits.query("hubs - nx_hubs < -0.00001") authorities_diffs1 = cugraph_hits.query("authorities - nx_authorities > 0.0001") diff --git a/python/cugraph/cugraph/tests/structure/test_graph.py b/python/cugraph/cugraph/tests/structure/test_graph.py index d4f38a2665f..a5b300fa5c4 100644 --- a/python/cugraph/cugraph/tests/structure/test_graph.py +++ b/python/cugraph/cugraph/tests/structure/test_graph.py @@ -630,7 +630,7 @@ def test_number_of_edges(): df = pd.DataFrame(cycle_edges, columns=["source", "destination", "weight"]) # Convert to cuDF - cudf_edges = cudf.DataFrame.from_pandas(df) + cudf_edges = cudf.DataFrame(df) # Create directed graph G_directed = cugraph.Graph(directed=True) diff --git a/python/cugraph/cugraph/tests/structure/test_hypergraph.py b/python/cugraph/cugraph/tests/structure/test_hypergraph.py index f1dfc17a509..53a2b5cc49f 100644 --- a/python/cugraph/cugraph/tests/structure/test_hypergraph.py +++ b/python/cugraph/cugraph/tests/structure/test_hypergraph.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020-2024, NVIDIA CORPORATION. +# Copyright (c) 2020-2025, NVIDIA CORPORATION. # 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 @@ -43,7 +43,7 @@ import cugraph -simple_df = cudf.DataFrame.from_pandas( +simple_df = cudf.DataFrame( pd.DataFrame( { "id": ["a", "b", "c"], @@ -54,7 +54,7 @@ ) ) -hyper_df = cudf.DataFrame.from_pandas( +hyper_df = cudf.DataFrame( pd.DataFrame({"aa": [0, 1, 2], "bb": ["a", "b", "c"], "cc": ["b", "0", "1"]}) ) @@ -102,7 +102,7 @@ def test_complex_df(): # print('could not make categorical', c) pass - complex_df = cudf.DataFrame.from_pandas(complex_df) + complex_df = cudf.DataFrame(complex_df) cugraph.hypergraph(complex_df) @@ -234,7 +234,7 @@ def test_drop_edge_attrs(categorical_metadata): assert len(h.keys()) == len(["entities", "nodes", "edges", "events", "graph"]) - edges = cudf.DataFrame.from_pandas( + edges = cudf.DataFrame( pd.DataFrame( { "event_id": [ @@ -289,7 +289,7 @@ def test_drop_edge_attrs_direct(categorical_metadata): assert len(h.keys()) == len(["entities", "nodes", "edges", "events", "graph"]) - edges = cudf.DataFrame.from_pandas( + edges = cudf.DataFrame( pd.DataFrame( { "event_id": [ @@ -320,7 +320,7 @@ def test_drop_edge_attrs_direct(categorical_metadata): @pytest.mark.sg def test_skip_hyper(): - df = cudf.DataFrame.from_pandas( + df = cudf.DataFrame( pd.DataFrame({"a": ["a", None, "b"], "b": ["a", "b", "c"], "c": [1, 2, 3]}) ) @@ -333,7 +333,7 @@ def test_skip_hyper(): @pytest.mark.sg def test_skip_drop_na_hyper(): - df = cudf.DataFrame.from_pandas( + df = cudf.DataFrame( pd.DataFrame({"a": ["a", None, "b"], "b": ["a", "b", "c"], "c": [1, 2, 3]}) ) @@ -346,7 +346,7 @@ def test_skip_drop_na_hyper(): @pytest.mark.sg def test_skip_direct(): - df = cudf.DataFrame.from_pandas( + df = cudf.DataFrame( pd.DataFrame({"a": ["a", None, "b"], "b": ["a", "b", "c"], "c": [1, 2, 3]}) ) @@ -359,7 +359,7 @@ def test_skip_direct(): @pytest.mark.sg def test_skip_drop_na_direct(): - df = cudf.DataFrame.from_pandas( + df = cudf.DataFrame( pd.DataFrame({"a": ["a", None, "b"], "b": ["a", "b", "c"], "c": [1, 2, 3]}) ) @@ -372,9 +372,7 @@ def test_skip_drop_na_direct(): @pytest.mark.sg def test_drop_na_hyper(): - df = cudf.DataFrame.from_pandas( - pd.DataFrame({"a": ["a", None, "c"], "i": [1, 2, None]}) - ) + df = cudf.DataFrame(pd.DataFrame({"a": ["a", None, "c"], "i": [1, 2, None]})) hg = cugraph.hypergraph(df, dropna=True) @@ -385,9 +383,7 @@ def test_drop_na_hyper(): @pytest.mark.sg def test_drop_na_direct(): - df = cudf.DataFrame.from_pandas( - pd.DataFrame({"a": ["a", None, "a"], "i": [1, 1, None]}) - ) + df = cudf.DataFrame(pd.DataFrame({"a": ["a", None, "a"], "i": [1, 1, None]})) hg = cugraph.hypergraph(df, dropna=True, direct=True) @@ -398,7 +394,7 @@ def test_drop_na_direct(): @pytest.mark.sg def test_skip_na_hyperedge(): - nans_df = cudf.DataFrame.from_pandas( + nans_df = cudf.DataFrame( pd.DataFrame({"x": ["a", "b", "c"], "y": ["aa", None, "cc"]}) ) @@ -415,9 +411,7 @@ def test_skip_na_hyperedge(): @pytest.mark.sg def test_hyper_to_pa_vanilla(): - df = cudf.DataFrame.from_pandas( - pd.DataFrame({"x": ["a", "b", "c"], "y": ["d", "e", "f"]}) - ) + df = cudf.DataFrame(pd.DataFrame({"x": ["a", "b", "c"], "y": ["d", "e", "f"]})) hg = cugraph.hypergraph(df) nodes_arr = hg["graph"].nodes().to_arrow() @@ -429,9 +423,7 @@ def test_hyper_to_pa_vanilla(): @pytest.mark.sg def test_hyper_to_pa_mixed(): - df = cudf.DataFrame.from_pandas( - pd.DataFrame({"x": ["a", "b", "c"], "y": [1, 2, 3]}) - ) + df = cudf.DataFrame(pd.DataFrame({"x": ["a", "b", "c"], "y": [1, 2, 3]})) hg = cugraph.hypergraph(df) nodes_arr = hg["graph"].nodes().to_arrow() @@ -443,9 +435,7 @@ def test_hyper_to_pa_mixed(): @pytest.mark.sg def test_hyper_to_pa_na(): - df = cudf.DataFrame.from_pandas( - pd.DataFrame({"x": ["a", None, "c"], "y": [1, 2, None]}) - ) + df = cudf.DataFrame(pd.DataFrame({"x": ["a", None, "c"], "y": [1, 2, None]})) hg = cugraph.hypergraph(df, dropna=False) print(hg["graph"].nodes()) diff --git a/python/cugraph/pyproject.toml b/python/cugraph/pyproject.toml index 46d78770dc4..b99c179d1ff 100644 --- a/python/cugraph/pyproject.toml +++ b/python/cugraph/pyproject.toml @@ -24,21 +24,21 @@ license = { text = "Apache-2.0" } requires-python = ">=3.10" dependencies = [ "cuda-python>=13.0.1,<14.0a0", - "cudf==25.10.*,>=0.0.0a0", + "cudf==25.12.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", - "dask-cuda==25.10.*,>=0.0.0a0", - "dask-cudf==25.10.*,>=0.0.0a0", + "dask-cuda==25.12.*,>=0.0.0a0", + "dask-cudf==25.12.*,>=0.0.0a0", "fsspec[http]>=0.6.0", - "libcugraph==25.10.*,>=0.0.0a0", + "libcugraph==25.12.*,>=0.0.0a0", "numba>=0.60.0,<0.62.0a0", "numpy>=1.23,<3.0a0", - "pylibcudf==25.10.*,>=0.0.0a0", - "pylibcugraph==25.10.*,>=0.0.0a0", - "pylibraft==25.10.*,>=0.0.0a0", - "raft-dask==25.10.*,>=0.0.0a0", - "rapids-dask-dependency==25.10.*,>=0.0.0a0", - "rmm==25.10.*,>=0.0.0a0", - "ucxx==0.46.*,>=0.0.0a0", + "pylibcudf==25.12.*,>=0.0.0a0", + "pylibcugraph==25.12.*,>=0.0.0a0", + "pylibraft==25.12.*,>=0.0.0a0", + "raft-dask==25.12.*,>=0.0.0a0", + "rapids-dask-dependency==25.12.*,>=0.0.0a0", + "rmm==25.12.*,>=0.0.0a0", + "ucxx==0.47.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. classifiers = [ "Intended Audience :: Developers", @@ -85,13 +85,13 @@ regex = "(?P.*)" build-backend = "scikit_build_core.build" requires = [ "cmake>=3.30.4", - "libcugraph==25.10.*,>=0.0.0a0", - "libraft==25.10.*,>=0.0.0a0", - "librmm==25.10.*,>=0.0.0a0", + "libcugraph==25.12.*,>=0.0.0a0", + "libraft==25.12.*,>=0.0.0a0", + "librmm==25.12.*,>=0.0.0a0", "ninja", - "pylibcugraph==25.10.*,>=0.0.0a0", - "pylibraft==25.10.*,>=0.0.0a0", - "rmm==25.10.*,>=0.0.0a0", + "pylibcugraph==25.12.*,>=0.0.0a0", + "pylibraft==25.12.*,>=0.0.0a0", + "rmm==25.12.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. dependencies-file = "../../dependencies.yaml" matrix-entry = "cuda_suffixed=true" diff --git a/python/libcugraph/pyproject.toml b/python/libcugraph/pyproject.toml index 393059a17c7..7fa5eb32df2 100644 --- a/python/libcugraph/pyproject.toml +++ b/python/libcugraph/pyproject.toml @@ -38,7 +38,7 @@ classifiers = [ "Environment :: GPU :: NVIDIA CUDA", ] dependencies = [ - "libraft==25.10.*,>=0.0.0a0", + "libraft==25.12.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. [project.urls] @@ -77,7 +77,7 @@ dependencies-file = "../../dependencies.yaml" matrix-entry = "cuda_suffixed=true" requires = [ "cmake>=3.30.4", - "libraft==25.10.*,>=0.0.0a0", - "librmm==25.10.*,>=0.0.0a0", + "libraft==25.12.*,>=0.0.0a0", + "librmm==25.12.*,>=0.0.0a0", "ninja", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. diff --git a/python/pylibcugraph/pyproject.toml b/python/pylibcugraph/pyproject.toml index bfe3b119b70..49f2a1d342f 100644 --- a/python/pylibcugraph/pyproject.toml +++ b/python/pylibcugraph/pyproject.toml @@ -23,10 +23,10 @@ license = { text = "Apache-2.0" } requires-python = ">=3.10" dependencies = [ "cupy-cuda13x>=13.6.0", - "libcugraph==25.10.*,>=0.0.0a0", + "libcugraph==25.12.*,>=0.0.0a0", "numpy>=1.23,<3.0a0", - "pylibraft==25.10.*,>=0.0.0a0", - "rmm==25.10.*,>=0.0.0a0", + "pylibraft==25.12.*,>=0.0.0a0", + "rmm==25.12.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. classifiers = [ "Intended Audience :: Developers", @@ -39,7 +39,7 @@ classifiers = [ [project.optional-dependencies] test = [ - "cudf==25.10.*,>=0.0.0a0", + "cudf==25.12.*,>=0.0.0a0", "numpy>=1.23,<3.0a0", "pandas", "pytest", @@ -73,12 +73,12 @@ dependencies-file = "../../dependencies.yaml" requires = [ "cmake>=3.30.4", "cython>=3.1.2", - "libcugraph==25.10.*,>=0.0.0a0", - "libraft==25.10.*,>=0.0.0a0", - "librmm==25.10.*,>=0.0.0a0", + "libcugraph==25.12.*,>=0.0.0a0", + "libraft==25.12.*,>=0.0.0a0", + "librmm==25.12.*,>=0.0.0a0", "ninja", - "pylibraft==25.10.*,>=0.0.0a0", - "rmm==25.10.*,>=0.0.0a0", + "pylibraft==25.12.*,>=0.0.0a0", + "rmm==25.12.*,>=0.0.0a0", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. matrix-entry = "cuda_suffixed=true"