diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d7cca486cb..6d49b8b1d9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -260,7 +260,10 @@ jobs: script: ci/build_wheel_libcuopt_client.sh package-name: libcuopt_client package-type: cpp - matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) + # The wheel name carries no CUDA suffix, so neither should the artifact. + append-cuda-suffix: false + # One build per arch: the client has no CUDA dimension. + matrix_filter: group_by(.ARCH) | map(max_by([(.CUDA_VER|split(".")|map(tonumber)), (.PY_VER|split(".")|map(tonumber))])) wheel-publish-libcuopt-client: needs: wheel-build-libcuopt-client permissions: diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 5c59bf466c..ce7783e025 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -55,6 +55,7 @@ jobs: runs-on: ubuntu-latest outputs: libcuopt_filter: ${{ steps.set-filters.outputs.libcuopt_filter }} + libcuopt_client_filter: ${{ steps.set-filters.outputs.libcuopt_client_filter }} cuopt_filter: ${{ steps.set-filters.outputs.cuopt_filter }} cuopt_server_filter: ${{ steps.set-filters.outputs.cuopt_server_filter }} cuopt_server_test_filter: ${{ steps.set-filters.outputs.cuopt_server_test_filter }} @@ -64,6 +65,8 @@ jobs: id: set-filters run: | echo "libcuopt_filter=group_by([.ARCH, (.CUDA_VER|split(\".\")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(\".\")|map(tonumber)))" >> $GITHUB_OUTPUT + # One build per arch: the client has no CUDA dimension. + echo "libcuopt_client_filter=group_by(.ARCH) | map(max_by([(.CUDA_VER|split(\".\")|map(tonumber)), (.PY_VER|split(\".\")|map(tonumber))]))" >> $GITHUB_OUTPUT echo "cuopt_filter=group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(\".\") | map(tonumber)))" >> $GITHUB_OUTPUT echo "cuopt_server_filter=map(select(.ARCH == \"amd64\")) | group_by(.CUDA_VER|split(\".\")|map(tonumber)|.[0]) | map(max_by([(.PY_VER|split(\".\")|map(tonumber)), (.CUDA_VER|split(\".\")|map(tonumber))]))" >> $GITHUB_OUTPUT echo "cuopt_server_test_filter=map(select(.ARCH == \"amd64\")) | group_by(.CUDA_VER | split(\".\") | map(tonumber) | .[0]) | map(max_by([(.PY_VER | split(\".\") | map(tonumber)), (.CUDA_VER | split(\".\") | map(tonumber))]))" >> $GITHUB_OUTPUT @@ -623,10 +626,11 @@ jobs: secrets: inherit # zizmor: ignore[secrets-inherit] uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.10 with: - # Same filter as libcuopt: every arch and CUDA version, latest Python only. - matrix_filter: ${{ needs.compute-matrix-filters.outputs.libcuopt_filter }} + matrix_filter: ${{ needs.compute-matrix-filters.outputs.libcuopt_client_filter }} package-type: cpp package-name: libcuopt_client + # The wheel name carries no CUDA suffix, so neither should the artifact. + append-cuda-suffix: false build_type: pull-request build-datetime: ${{ needs.build-details.outputs.build-datetime }} script: ci/build_wheel_libcuopt_client.sh diff --git a/ci/build_wheel_libcuopt_client.sh b/ci/build_wheel_libcuopt_client.sh index 9e36b553a2..e561fd271b 100755 --- a/ci/build_wheel_libcuopt_client.sh +++ b/ci/build_wheel_libcuopt_client.sh @@ -129,5 +129,6 @@ python -m auditwheel repair "${EXCLUDE_ARGS[@]}" -w "${RAPIDS_WHEEL_BLD_OUTPUT_D ci/validate_wheel.sh ${package_dir} "${RAPIDS_WHEEL_BLD_OUTPUT_DIR}" -RAPIDS_PACKAGE_NAME="$(rapids-artifact-name wheel_cpp libcuopt_client cuopt --cuda "$RAPIDS_CUDA_VERSION")" +# The artifact is cuopt_wheel_cpp_libcuopt_client_{arch}; publish matches on the prefix. +RAPIDS_PACKAGE_NAME="$(rapids-artifact-name wheel_cpp libcuopt_client cuopt)" export RAPIDS_PACKAGE_NAME diff --git a/conda/recipes/libcuopt/recipe.yaml b/conda/recipes/libcuopt/recipe.yaml index 4da190c9b7..fd96367039 100644 --- a/conda/recipes/libcuopt/recipe.yaml +++ b/conda/recipes/libcuopt/recipe.yaml @@ -137,8 +137,9 @@ outputs: - libabseil - re2 run: - - ${{ pin_compatible("cuda-version", upper_bound="x", lower_bound="x") }} - - librmm =${{ minor_version }} + # Every library libcuopt_client.so links. rmm and the CUDA runtime are host-only: + # the client includes their headers but links neither. + - rapids-logger =0.3 - openssl - c-ares - libuuid diff --git a/dependencies.yaml b/dependencies.yaml index fcf8babdc1..a09be27dd3 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -175,16 +175,16 @@ files: - build_common - depends_on_librmm - depends_on_rapids_logger + # The client links no CUDA and no rmm, so rapids-logger is its only runtime dependency. py_run_libcuopt_client: output: pyproject pyproject_dir: python/libcuopt_client matrix: cuda_suffixed: ["false"] - use_cuda_wheels: ["true"] + use_cuda_wheels: ["false"] extras: table: project includes: - - depends_on_librmm - depends_on_rapids_logger py_build_libcuopt_mathopt: output: pyproject @@ -601,33 +601,17 @@ dependencies: - output_types: [requirements, pyproject] packages: - cuopt-cu13==26.10.*,>=0.0.0a0 + # One unsuffixed libcuopt-client, for every CUDA version and every output type. depends_on_libcuopt_client: common: - - output_types: conda + - output_types: [conda, requirements, pyproject] packages: - - &libcuopt_client_unsuffixed libcuopt-client==26.10.*,>=0.0.0a0 + - libcuopt-client==26.10.*,>=0.0.0a0 - output_types: requirements packages: # pip recognizes the index as a global option for the requirements.txt file - --extra-index-url=https://pypi.nvidia.com - --extra-index-url=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple - specific: - - output_types: [requirements, pyproject] - matrices: - - matrix: - cuda: "12.*" - cuda_suffixed: "true" - packages: - - libcuopt-client-cu12==26.10.*,>=0.0.0a0 - - matrix: - cuda: "13.*" - cuda_suffixed: "true" - packages: - - libcuopt-client-cu13==26.10.*,>=0.0.0a0 - - matrix: - cuda_suffixed: "false" - packages: - - *libcuopt_client_unsuffixed depends_on_libcuopt_mathopt: common: - output_types: conda diff --git a/python/libcuopt_client/pyproject.toml b/python/libcuopt_client/pyproject.toml index 3766809e38..05803e0e59 100644 --- a/python/libcuopt_client/pyproject.toml +++ b/python/libcuopt_client/pyproject.toml @@ -23,14 +23,12 @@ classifiers = [ "Topic :: Database", "Topic :: Scientific/Engineering", "Programming Language :: C++", - "Environment :: GPU :: NVIDIA CUDA", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", ] dependencies = [ - "librmm==26.10.*,>=0.0.0a0", "rapids-logger==0.3.*", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. @@ -69,7 +67,9 @@ regex = "(?P.*)" [tool.rapids-build-backend] build-backend = "scikit_build_core.build" dependencies-file = "../../dependencies.yaml" -matrix-entry = "cuda_suffixed=true;use_cuda_wheels=true" +# The client links no CUDA and no rmm, so the wheel name carries no CUDA suffix. +disable-cuda = true +matrix-entry = "cuda_suffixed=false;use_cuda_wheels=false" requires = [ "cmake>=4.0", "librmm==26.10.*,>=0.0.0a0",