From 6111e564969c7aca3f140d26a2e005f3690a8ae8 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Wed, 4 Mar 2026 16:12:25 -0500 Subject: [PATCH 1/6] feat: add support for Python 3.14 --- .github/workflows/build.yaml | 28 ++++++++--------- .github/workflows/pr.yaml | 30 +++++++++---------- CONTRIBUTING.md | 2 +- README.md | 8 ++--- .../all_cuda-129_arch-aarch64.yaml | 2 +- .../all_cuda-129_arch-x86_64.yaml | 2 +- .../all_cuda-131_arch-aarch64.yaml | 2 +- .../all_cuda-131_arch-x86_64.yaml | 2 +- dependencies.yaml | 6 +++- docs/cuopt/source/system-requirements.rst | 4 +-- .../cuopt/linear_programming/pyproject.toml | 1 + python/cuopt/pyproject.toml | 1 + python/cuopt_self_hosted/pyproject.toml | 1 + python/cuopt_server/pyproject.toml | 1 + python/libcuopt/pyproject.toml | 1 + 15 files changed, 50 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 051d91d1f5..593d48bd74 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -45,7 +45,7 @@ concurrency: jobs: cpp-build: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -55,7 +55,7 @@ jobs: python-build: needs: [cpp-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -65,7 +65,7 @@ jobs: upload-conda: needs: [cpp-build, python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-upload-packages.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -73,7 +73,7 @@ jobs: sha: ${{ inputs.sha }} wheel-build-cuopt-mps-parser: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -88,7 +88,7 @@ jobs: wheel-publish-cuopt-mps-parser: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -99,7 +99,7 @@ jobs: wheel-build-libcuopt: needs: wheel-build-cuopt-mps-parser secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -112,7 +112,7 @@ jobs: wheel-publish-libcuopt: needs: wheel-build-libcuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -123,7 +123,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -135,7 +135,7 @@ jobs: wheel-publish-cuopt: needs: wheel-build-cuopt secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -145,7 +145,7 @@ jobs: package-type: python wheel-build-cuopt-server: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -160,7 +160,7 @@ jobs: wheel-publish-cuopt-server: needs: wheel-build-cuopt-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -171,7 +171,7 @@ jobs: docs-build: needs: [python-build] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} node_type: "gpu-l4-latest-1" @@ -185,7 +185,7 @@ jobs: script: "ci/build_docs.sh" wheel-build-cuopt-sh-client: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} @@ -201,7 +201,7 @@ jobs: wheel-publish-cuopt-sh-client: needs: wheel-build-cuopt-sh-client secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-publish.yaml@python-3.14 with: build_type: ${{ inputs.build_type || 'branch' }} branch: ${{ inputs.branch }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 52dfa3b60e..95741c1fb5 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -34,7 +34,7 @@ jobs: - wheel-build-cuopt-sh-client - test-self-hosted-server secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.14 if: always() with: needs: ${{ toJSON(needs) }} @@ -111,7 +111,7 @@ jobs: changed-files: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@python-3.14 with: files_yaml: | build_docs: @@ -279,20 +279,20 @@ jobs: - '!gemini-extension.json' checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@python-3.14 with: enable_check_generated_files: false conda-cpp-build: needs: [checks, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_cpp.sh matrix_filter: ${{ needs.compute-matrix-filters.outputs.conda_lean_filter }} conda-cpp-tests: needs: [conda-cpp-build, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp with: build_type: pull-request @@ -308,14 +308,14 @@ jobs: conda-python-build: needs: [conda-cpp-build, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_python.sh matrix_filter: ${{ needs.compute-matrix-filters.outputs.conda_test_filter }} conda-python-tests: needs: [conda-python-build, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda with: run_codecov: false @@ -332,7 +332,7 @@ jobs: docs-build: needs: [conda-python-build, changed-files] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs with: build_type: pull-request @@ -345,7 +345,7 @@ jobs: wheel-build-cuopt-mps-parser: needs: compute-matrix-filters secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt_mps_parser.sh @@ -357,7 +357,7 @@ jobs: wheel-build-libcuopt: needs: [wheel-build-cuopt-mps-parser, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: # build for every combination of arch and CUDA version, but only for the latest Python matrix_filter: ${{ needs.compute-matrix-filters.outputs.libcuopt_filter }} @@ -368,7 +368,7 @@ jobs: wheel-build-cuopt: needs: [wheel-build-cuopt-mps-parser, wheel-build-libcuopt, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt.sh @@ -377,7 +377,7 @@ jobs: matrix_filter: ${{ needs.compute-matrix-filters.outputs.wheel_lean_filter }} wheel-tests-cuopt: needs: [wheel-build-cuopt, wheel-build-cuopt-mps-parser, wheel-build-cuopt-sh-client, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels with: build_type: pull-request @@ -393,7 +393,7 @@ jobs: wheel-build-cuopt-server: needs: [checks, compute-matrix-filters] secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt_server.sh @@ -405,7 +405,7 @@ jobs: wheel-build-cuopt-sh-client: needs: compute-matrix-filters secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@python-3.14 with: build_type: pull-request script: ci/build_wheel_cuopt_sh_client.sh @@ -417,7 +417,7 @@ jobs: matrix_filter: ${{ needs.compute-matrix-filters.outputs.cuopt_sh_client_filter }} wheel-tests-cuopt-server: needs: [wheel-build-cuopt, wheel-build-cuopt-server, changed-files, compute-matrix-filters] - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels with: build_type: pull-request diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f3b75eb14..2835786ae4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -101,7 +101,7 @@ CUDA/GPU Runtime: Python: -* Python >=3.11.x, <= 3.13.x +* Python >=3.11.x, <= 3.14.x OS: diff --git a/README.md b/README.md index 5e817ea6ef..379a48c350 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ This repo is also hosted as a [COIN-OR](http://github.com/coin-or/cuopt/) projec ### Python requirements -* Python >=3.11, <=3.13 +* Python >=3.11, <=3.14 ### OS requirements @@ -130,13 +130,13 @@ Users can pull the cuOpt container from the NVIDIA container registry. ```bash # For CUDA 12.x -docker pull nvidia/cuopt:latest-cuda12.9-py3.13 +docker pull nvidia/cuopt:latest-cuda12.9-py3.14 # For CUDA 13.x -docker pull nvidia/cuopt:latest-cuda13.0-py3.13 +docker pull nvidia/cuopt:latest-cuda13.0-py3.14 ``` -Note: The ``latest`` tag is the latest stable release of cuOpt. If you want to use a specific version, you can use the ``-cuda12.9-py3.13`` or ``-cuda13.0-py3.13`` tag. For example, to use cuOpt 25.10.0, you can use the ``25.10.0-cuda12.9-py3.13`` or ``25.10.0-cuda13.0-py3.13`` tag. Please refer to `cuOpt dockerhub page `_ for the list of available tags. +Note: The ``latest`` tag is the latest stable release of cuOpt. If you want to use a specific version, you can use the ``-cuda12.9-py3.14`` or ``-cuda13.0-py3.14`` tag. For example, to use cuOpt 25.10.0, you can use the ``25.10.0-cuda12.9-py3.13`` or ``25.10.0-cuda13.0-py3.13`` tag. Please refer to `cuOpt dockerhub page `_ for the list of available tags. More information about the cuOpt container can be found [here](https://docs.nvidia.com/cuopt/user-guide/latest/cuopt-server/quick-start.html#container-from-docker-hub). diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 3cee401c5c..12bbb26d09 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -54,7 +54,7 @@ dependencies: - pyrsistent - pytest-cov - pytest<9.0 -- python>=3.11,<3.14 +- python>=3.11,<3.15 - pyyaml>=6.0.0 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index 5632c8c9c7..d3a86e3003 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -54,7 +54,7 @@ dependencies: - pyrsistent - pytest-cov - pytest<9.0 -- python>=3.11,<3.14 +- python>=3.11,<3.15 - pyyaml>=6.0.0 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 diff --git a/conda/environments/all_cuda-131_arch-aarch64.yaml b/conda/environments/all_cuda-131_arch-aarch64.yaml index add21cbb2f..b46307f8f3 100644 --- a/conda/environments/all_cuda-131_arch-aarch64.yaml +++ b/conda/environments/all_cuda-131_arch-aarch64.yaml @@ -54,7 +54,7 @@ dependencies: - pyrsistent - pytest-cov - pytest<9.0 -- python>=3.11,<3.14 +- python>=3.11,<3.15 - pyyaml>=6.0.0 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 diff --git a/conda/environments/all_cuda-131_arch-x86_64.yaml b/conda/environments/all_cuda-131_arch-x86_64.yaml index 0fa31c7961..9af5588c03 100644 --- a/conda/environments/all_cuda-131_arch-x86_64.yaml +++ b/conda/environments/all_cuda-131_arch-x86_64.yaml @@ -54,7 +54,7 @@ dependencies: - pyrsistent - pytest-cov - pytest<9.0 -- python>=3.11,<3.14 +- python>=3.11,<3.15 - pyyaml>=6.0.0 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-logger==0.2.*,>=0.0.0a0 diff --git a/dependencies.yaml b/dependencies.yaml index 011dfbcee6..d2352f8a4f 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -784,5 +784,9 @@ dependencies: packages: - python=3.13 - matrix: + py: "3.14" packages: - - python>=3.11,<3.14 + - python=3.14 + - matrix: + packages: + - python>=3.11,<3.15 diff --git a/docs/cuopt/source/system-requirements.rst b/docs/cuopt/source/system-requirements.rst index 92ac2d70fc..bbc37f26e9 100644 --- a/docs/cuopt/source/system-requirements.rst +++ b/docs/cuopt/source/system-requirements.rst @@ -26,7 +26,7 @@ Dependencies are installed automatically when using the pip and Conda installati - 12.0+ * Python: - - >= 3.11.* and <= 3.13.* + - >= 3.11.* and <= 3.14.* * NVIDIA drivers: - 525.60.13+ (Linux) @@ -98,4 +98,4 @@ Thin-client for Self-Hosted - x86-64 - ARM64 -* Python >= 3.11.x <= 3.13.x +* Python >= 3.11.x <= 3.14.x diff --git a/python/cuopt/cuopt/linear_programming/pyproject.toml b/python/cuopt/cuopt/linear_programming/pyproject.toml index e59f8d3a0f..934b12f547 100644 --- a/python/cuopt/cuopt/linear_programming/pyproject.toml +++ b/python/cuopt/cuopt/linear_programming/pyproject.toml @@ -27,6 +27,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] [project.urls] diff --git a/python/cuopt/pyproject.toml b/python/cuopt/pyproject.toml index 44734577c9..ae5e01b37c 100644 --- a/python/cuopt/pyproject.toml +++ b/python/cuopt/pyproject.toml @@ -40,6 +40,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] [project.optional-dependencies] diff --git a/python/cuopt_self_hosted/pyproject.toml b/python/cuopt_self_hosted/pyproject.toml index ce1fb9ae15..b4a60b5566 100644 --- a/python/cuopt_self_hosted/pyproject.toml +++ b/python/cuopt_self_hosted/pyproject.toml @@ -30,6 +30,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Operating System :: OS Independent", ] diff --git a/python/cuopt_server/pyproject.toml b/python/cuopt_server/pyproject.toml index 0a39531b89..95338ada2a 100644 --- a/python/cuopt_server/pyproject.toml +++ b/python/cuopt_server/pyproject.toml @@ -38,6 +38,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] [project.optional-dependencies] diff --git a/python/libcuopt/pyproject.toml b/python/libcuopt/pyproject.toml index fabd3da0df..2507971a0f 100644 --- a/python/libcuopt/pyproject.toml +++ b/python/libcuopt/pyproject.toml @@ -27,6 +27,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] dependencies = [ "cuopt-mps-parser==26.4.*,>=0.0.0a0", From a248f275c64f57188a90db3b8a8acdb39287da0f Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Thu, 5 Mar 2026 11:21:23 -0500 Subject: [PATCH 2/6] chore(deps): bump `msgpack` to `1.1.2` for Python 3.14 support --- conda/environments/all_cuda-129_arch-aarch64.yaml | 2 +- conda/environments/all_cuda-129_arch-x86_64.yaml | 2 +- conda/environments/all_cuda-131_arch-aarch64.yaml | 2 +- conda/environments/all_cuda-131_arch-x86_64.yaml | 2 +- conda/recipes/cuopt-server/recipe.yaml | 2 +- conda/recipes/cuopt-sh-client/recipe.yaml | 4 ++-- dependencies.yaml | 4 ++-- python/cuopt_self_hosted/pyproject.toml | 2 +- python/cuopt_server/pyproject.toml | 4 ++-- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 12bbb26d09..829409efcc 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -36,7 +36,7 @@ dependencies: - librmm==26.4.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 -- msgpack-python==1.1.0 +- msgpack-python==1.1.2 - myst-nb - myst-parser - ninja diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index d3a86e3003..b33ffef54b 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -36,7 +36,7 @@ dependencies: - librmm==26.4.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 -- msgpack-python==1.1.0 +- msgpack-python==1.1.2 - myst-nb - myst-parser - ninja diff --git a/conda/environments/all_cuda-131_arch-aarch64.yaml b/conda/environments/all_cuda-131_arch-aarch64.yaml index b46307f8f3..3206630329 100644 --- a/conda/environments/all_cuda-131_arch-aarch64.yaml +++ b/conda/environments/all_cuda-131_arch-aarch64.yaml @@ -36,7 +36,7 @@ dependencies: - librmm==26.4.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 -- msgpack-python==1.1.0 +- msgpack-python==1.1.2 - myst-nb - myst-parser - ninja diff --git a/conda/environments/all_cuda-131_arch-x86_64.yaml b/conda/environments/all_cuda-131_arch-x86_64.yaml index 9af5588c03..e4915d34f7 100644 --- a/conda/environments/all_cuda-131_arch-x86_64.yaml +++ b/conda/environments/all_cuda-131_arch-x86_64.yaml @@ -36,7 +36,7 @@ dependencies: - librmm==26.4.*,>=0.0.0a0 - make - msgpack-numpy==0.4.8 -- msgpack-python==1.1.0 +- msgpack-python==1.1.2 - myst-nb - myst-parser - ninja diff --git a/conda/recipes/cuopt-server/recipe.yaml b/conda/recipes/cuopt-server/recipe.yaml index 8c2875fc49..6a7579ecca 100644 --- a/conda/recipes/cuopt-server/recipe.yaml +++ b/conda/recipes/cuopt-server/recipe.yaml @@ -35,7 +35,7 @@ requirements: - cuopt =${{ version }} - fastapi >=0.104.1 - jsonref =1.1.0 - - msgpack-python =1.1.0 + - msgpack-python =1.1.2 - msgpack-numpy =0.4.8 - numpy >=1.23,<3.0 - pandas>=2 diff --git a/conda/recipes/cuopt-sh-client/recipe.yaml b/conda/recipes/cuopt-sh-client/recipe.yaml index c0a1d0dc66..c2ae30edfc 100644 --- a/conda/recipes/cuopt-sh-client/recipe.yaml +++ b/conda/recipes/cuopt-sh-client/recipe.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 schema_version: 1 @@ -29,7 +29,7 @@ requirements: - python =${{ py_version }} - setuptools>=77.0.0 run: - - msgpack-python =1.1.0 + - msgpack-python =1.1.2 - python - requests diff --git a/dependencies.yaml b/dependencies.yaml index d2352f8a4f..4a96f20a4f 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -373,10 +373,10 @@ dependencies: - &requests requests - output_types: [requirements, pyproject] packages: - - &msgpack msgpack==1.1.0 + - &msgpack msgpack==1.1.2 - output_types: conda packages: - - &msgpack_python msgpack-python==1.1.0 + - &msgpack_python msgpack-python==1.1.2 run_cuopt_server: common: diff --git a/python/cuopt_self_hosted/pyproject.toml b/python/cuopt_self_hosted/pyproject.toml index b4a60b5566..7645c99ed0 100644 --- a/python/cuopt_self_hosted/pyproject.toml +++ b/python/cuopt_self_hosted/pyproject.toml @@ -22,7 +22,7 @@ requires-python = ">=3.11" dependencies = [ "cuopt-mps-parser==26.4.*,>=0.0.0a0", "msgpack-numpy==0.4.8", - "msgpack==1.1.0", + "msgpack==1.1.2", "requests", ] # This list was generated by `rapids-dependency-file-generator`. To make changes, edit ../../dependencies.yaml and run `rapids-dependency-file-generator`. classifiers = [ diff --git a/python/cuopt_server/pyproject.toml b/python/cuopt_server/pyproject.toml index 95338ada2a..d24cfcbd77 100644 --- a/python/cuopt_server/pyproject.toml +++ b/python/cuopt_server/pyproject.toml @@ -26,7 +26,7 @@ dependencies = [ "fastapi", "jsonref==1.1.0", "msgpack-numpy==0.4.8", - "msgpack==1.1.0", + "msgpack==1.1.2", "numpy>=1.23.5,<3.0", "pandas>=2.0", "psutil>=6.0.0", @@ -45,7 +45,7 @@ classifiers = [ test = [ "jsonref==1.1.0", "msgpack-numpy==0.4.8", - "msgpack==1.1.0", + "msgpack==1.1.2", "pexpect", "pytest-cov", "pytest<9.0", From 9577406ef579948eb777d4ab6d85eebfff1488ea Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Mon, 9 Mar 2026 11:07:40 -0400 Subject: [PATCH 3/6] chore(deps): remove `numba-cuda` ceiling, add `numba` ceiling (align with RAPIDS) --- conda/environments/all_cuda-129_arch-aarch64.yaml | 4 ++-- conda/environments/all_cuda-129_arch-x86_64.yaml | 4 ++-- conda/environments/all_cuda-131_arch-aarch64.yaml | 4 ++-- conda/environments/all_cuda-131_arch-x86_64.yaml | 4 ++-- conda/recipes/cuopt/recipe.yaml | 4 ++-- dependencies.yaml | 4 ++-- python/cuopt/pyproject.toml | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 829409efcc..ecef112dd5 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -41,8 +41,8 @@ dependencies: - myst-parser - ninja - notebook -- numba-cuda>=0.22.1,<0.23.0 -- numba>=0.60.0 +- numba-cuda>=0.22.1 +- numba>=0.60.0,<0.65.0 - numpy>=1.23.5,<3.0 - numpydoc - pandas>=2.0 diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml index b33ffef54b..35c825280c 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -41,8 +41,8 @@ dependencies: - myst-parser - ninja - notebook -- numba-cuda>=0.22.1,<0.23.0 -- numba>=0.60.0 +- numba-cuda>=0.22.1 +- numba>=0.60.0,<0.65.0 - numpy>=1.23.5,<3.0 - numpydoc - pandas>=2.0 diff --git a/conda/environments/all_cuda-131_arch-aarch64.yaml b/conda/environments/all_cuda-131_arch-aarch64.yaml index 3206630329..2b717d4e98 100644 --- a/conda/environments/all_cuda-131_arch-aarch64.yaml +++ b/conda/environments/all_cuda-131_arch-aarch64.yaml @@ -41,8 +41,8 @@ dependencies: - myst-parser - ninja - notebook -- numba-cuda>=0.22.1,<0.23.0 -- numba>=0.60.0 +- numba-cuda>=0.22.1 +- numba>=0.60.0,<0.65.0 - numpy>=1.23.5,<3.0 - numpydoc - pandas>=2.0 diff --git a/conda/environments/all_cuda-131_arch-x86_64.yaml b/conda/environments/all_cuda-131_arch-x86_64.yaml index e4915d34f7..f605a83f3b 100644 --- a/conda/environments/all_cuda-131_arch-x86_64.yaml +++ b/conda/environments/all_cuda-131_arch-x86_64.yaml @@ -41,8 +41,8 @@ dependencies: - myst-parser - ninja - notebook -- numba-cuda>=0.22.1,<0.23.0 -- numba>=0.60.0 +- numba-cuda>=0.22.1 +- numba>=0.60.0,<0.65.0 - numpy>=1.23.5,<3.0 - numpydoc - pandas>=2.0 diff --git a/conda/recipes/cuopt/recipe.yaml b/conda/recipes/cuopt/recipe.yaml index 0b4c8abc4f..3fd9f4a07f 100644 --- a/conda/recipes/cuopt/recipe.yaml +++ b/conda/recipes/cuopt/recipe.yaml @@ -89,8 +89,8 @@ requirements: - cupy >=13.6.0 - h5py - libcuopt =${{ version }} - - numba >=0.60.0 - - numba-cuda>=0.22.1,<0.23.0 + - numba>=0.60.0,<0.65.0 + - numba-cuda>=0.22.1 - numpy >=1.23,<3.0 - pandas >=2.0 - pylibraft =${{ minor_version }} diff --git a/dependencies.yaml b/dependencies.yaml index 4a96f20a4f..014889c7d5 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -346,8 +346,8 @@ dependencies: common: - output_types: [conda, requirements, pyproject] packages: - - numba-cuda>=0.22.1,<0.23.0 - - numba>=0.60.0 + - numba-cuda>=0.22.1 + - numba>=0.60.0,<0.65.0 - &pandas pandas>=2.0 - &pyyaml pyyaml>=6.0.0 - scipy>=1.14.1 diff --git a/python/cuopt/pyproject.toml b/python/cuopt/pyproject.toml index ae5e01b37c..e86b5bdd73 100644 --- a/python/cuopt/pyproject.toml +++ b/python/cuopt/pyproject.toml @@ -24,8 +24,8 @@ dependencies = [ "cuopt-mps-parser==26.4.*,>=0.0.0a0", "cupy-cuda13x>=13.6.0", "libcuopt==26.4.*,>=0.0.0a0", - "numba-cuda>=0.22.1,<0.23.0", - "numba>=0.60.0", + "numba-cuda>=0.22.1", + "numba>=0.60.0,<0.65.0", "numpy>=1.23.5,<3.0", "pandas>=2.0", "pylibraft==26.4.*,>=0.0.0a0", From 166bb8345cb877531d0f6d018d57f0a8fff43de9 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Mon, 9 Mar 2026 15:34:50 -0400 Subject: [PATCH 4/6] fix(conda): explictly request non-free-threaded python build --- conda/recipes/cuopt-server/recipe.yaml | 2 +- conda/recipes/cuopt-sh-client/recipe.yaml | 2 +- conda/recipes/cuopt/recipe.yaml | 2 +- conda/recipes/mps-parser/recipe.yaml | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/conda/recipes/cuopt-server/recipe.yaml b/conda/recipes/cuopt-server/recipe.yaml index 6a7579ecca..58227487f8 100644 --- a/conda/recipes/cuopt-server/recipe.yaml +++ b/conda/recipes/cuopt-server/recipe.yaml @@ -28,7 +28,7 @@ build: requirements: host: - pip - - python =${{ py_version }} + - python-gil =${{ py_version }} - rapids-build-backend >=0.4.0,<0.5.0 - setuptools>=77.0.0 run: diff --git a/conda/recipes/cuopt-sh-client/recipe.yaml b/conda/recipes/cuopt-sh-client/recipe.yaml index c2ae30edfc..d471f1917f 100644 --- a/conda/recipes/cuopt-sh-client/recipe.yaml +++ b/conda/recipes/cuopt-sh-client/recipe.yaml @@ -26,7 +26,7 @@ build: requirements: host: - pip - - python =${{ py_version }} + - python-gil =${{ py_version }} - setuptools>=77.0.0 run: - msgpack-python =1.1.2 diff --git a/conda/recipes/cuopt/recipe.yaml b/conda/recipes/cuopt/recipe.yaml index 3fd9f4a07f..87f0ee1057 100644 --- a/conda/recipes/cuopt/recipe.yaml +++ b/conda/recipes/cuopt/recipe.yaml @@ -75,7 +75,7 @@ requirements: - libcuopt =${{ version }} - pip - pylibraft =${{ minor_version }} - - python =${{ py_version }} + - python-gil =${{ py_version }} - rapids-build-backend >=0.4.0,<0.5.0 - rmm =${{ minor_version }} - scikit-build-core>=0.11.0 diff --git a/conda/recipes/mps-parser/recipe.yaml b/conda/recipes/mps-parser/recipe.yaml index 859bae6fae..7e423715b4 100644 --- a/conda/recipes/mps-parser/recipe.yaml +++ b/conda/recipes/mps-parser/recipe.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 schema_version: 1 @@ -41,7 +41,7 @@ requirements: - cython >=3.0.0 - libmps-parser =${{ version }} - pip - - python =${{ py_version }} + - python-gil =${{ py_version }} - rapids-build-backend >=0.4.0,<0.5.0 - scikit-build-core >=0.11.0 run: From 02c05240a9311aa2c7f53791fce70200f85938fb Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 10 Mar 2026 09:06:19 -0400 Subject: [PATCH 5/6] fix(argparse): escape invalid `%` in help string --- skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py b/skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py index 42a7490398..fb8918c11c 100644 --- a/skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py +++ b/skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py @@ -193,7 +193,7 @@ def compare_gaps( "--mip-gap", type=float, default=0.01, help="MIP gap tolerance" ) parser.add_argument( - "--compare", action="store_true", help="Compare 1% vs 0.1% gap" + "--compare", action="store_true", help="Compare 1%% vs 0.1%% gap" ) parser.add_argument( "--known-optimal", From 8646adaa3110e0c01b50af7f230cc1cddb963889 Mon Sep 17 00:00:00 2001 From: Gil Forsyth Date: Tue, 10 Mar 2026 17:45:14 -0400 Subject: [PATCH 6/6] refactor(multiprocessing): use explicit `fork` for cuopt_server --- .../cuopt_server/cuopt_service.py | 20 ++++++++++--------- .../cuopt_server/utils/process_handler.py | 9 +++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/python/cuopt_server/cuopt_server/cuopt_service.py b/python/cuopt_server/cuopt_server/cuopt_service.py index 15106bd293..8da26a39ad 100644 --- a/python/cuopt_server/cuopt_server/cuopt_service.py +++ b/python/cuopt_server/cuopt_server/cuopt_service.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2022-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 import argparse @@ -6,7 +6,7 @@ import os import signal import sys -from multiprocessing import Event, Process, Queue +from multiprocessing import get_context import psutil @@ -66,21 +66,23 @@ def watcher(app_exit, results_queue, job_queue, abort_queue, abort_list): except Exception: pass + ctx = get_context("fork") + # Flag for this process that says we have already run the # exit handler - terminated = Event() + terminated = ctx.Event() # Flag for all processes that the app is shutting down - app_exit = Event() + app_exit = ctx.Event() # Flag set by results thread when all jobs have been # marked done, to give a chance for anyone actively # waiting to get a graceful response - jobs_marked_done = Event() + jobs_marked_done = ctx.Event() - job_queue = Queue() - abort_queue = Queue() - results_queue = Queue() + job_queue = ctx.Queue() + abort_queue = ctx.Queue() + results_queue = ctx.Queue() w = None @@ -401,7 +403,7 @@ def record_factory(*args, **kwargs): from cuopt_server.webserver import run_server - w = Process( + w = ctx.Process( target=run_server, args=( app_exit, diff --git a/python/cuopt_server/cuopt_server/utils/process_handler.py b/python/cuopt_server/cuopt_server/utils/process_handler.py index 2a7d9e7969..d3d54d7009 100644 --- a/python/cuopt_server/cuopt_server/utils/process_handler.py +++ b/python/cuopt_server/cuopt_server/utils/process_handler.py @@ -1,10 +1,10 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 import logging import queue import time -from multiprocessing import Event, Process +from multiprocessing import get_context import psutil @@ -70,11 +70,12 @@ def terminate(job_queue, results_queue, abort_queue, signame): def create_process(app_exit, job_queue, results_queue, abort_list, gpu_id): global s_procs - complete = Event() + ctx = get_context("fork") + complete = ctx.Event() from cuopt_server.utils import solver - s = Process( + s = ctx.Process( target=solver.process_async_solve, args=( app_exit,