diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1f7f106da..bbe88957a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -35,7 +35,7 @@ concurrency: jobs: conda-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 }} @@ -47,7 +47,7 @@ jobs: if: github.ref_type == 'branch' needs: conda-cpp-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: arch: "amd64" branch: ${{ inputs.branch }} @@ -60,7 +60,7 @@ jobs: upload-conda: needs: [conda-cpp-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 }} @@ -68,7 +68,7 @@ jobs: sha: ${{ inputs.sha }} wheel-build-libucxx: 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 }} @@ -83,7 +83,7 @@ jobs: wheel-publish-libucxx: needs: wheel-build-libucxx 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 }} @@ -94,7 +94,7 @@ jobs: wheel-build-ucxx: needs: wheel-build-libucxx 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 }} @@ -107,7 +107,7 @@ jobs: wheel-publish-ucxx: needs: wheel-build-ucxx 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 }} @@ -117,7 +117,7 @@ jobs: package-type: python wheel-build-distributed-ucxx: 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 }} @@ -131,7 +131,7 @@ jobs: wheel-publish-distributed-ucxx: needs: [wheel-build-ucxx, wheel-build-distributed-ucxx] 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 a768fd993..b3847ece8 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -25,7 +25,7 @@ jobs: - wheel-tests-distributed-ucxx - telemetry-setup 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) }} @@ -59,7 +59,7 @@ jobs: changed-files: secrets: inherit needs: telemetry-setup - 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: @@ -147,7 +147,7 @@ jobs: - '!docs/**' checks: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@python-3.14 needs: telemetry-setup with: enable_check_generated_files: false @@ -155,7 +155,7 @@ jobs: conda-cpp-build: needs: checks 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 node_type: cpu8 @@ -163,7 +163,7 @@ jobs: docs-build: needs: [conda-cpp-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 @@ -174,7 +174,7 @@ jobs: conda-cpp-tests: needs: [conda-cpp-build, changed-files] secrets: inherit - 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 @@ -183,7 +183,7 @@ jobs: conda-python-tests: needs: [conda-cpp-build, changed-files] secrets: inherit - 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: build_type: pull-request @@ -192,7 +192,7 @@ jobs: conda-python-distributed-tests: needs: [conda-cpp-build, changed-files] secrets: inherit - 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: build_type: pull-request @@ -201,7 +201,7 @@ jobs: wheel-build-libucxx: needs: checks 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 node_type: cpu8 @@ -213,7 +213,7 @@ jobs: wheel-build-ucxx: needs: wheel-build-libucxx 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 node_type: cpu8 @@ -223,7 +223,7 @@ jobs: wheel-tests-ucxx: needs: [wheel-build-ucxx, changed-files] secrets: inherit - 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 @@ -232,7 +232,7 @@ jobs: wheel-build-distributed-ucxx: needs: checks 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 node_type: cpu8 @@ -243,7 +243,7 @@ jobs: wheel-tests-distributed-ucxx: needs: [wheel-build-ucxx, wheel-build-distributed-ucxx, changed-files] secrets: inherit - 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 @@ -252,7 +252,7 @@ jobs: devcontainer: secrets: inherit needs: [checks, telemetry-setup] - uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@python-3.14 with: arch: '["amd64", "arm64"]' cuda: '["13.1"]' diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2017babce..dbfd3fdb5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -25,7 +25,7 @@ on: jobs: conda-cpp-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@python-3.14 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -35,7 +35,7 @@ jobs: container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" conda-python-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@python-3.14 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -45,7 +45,7 @@ jobs: container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" conda-python-distributed-tests: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@python-3.14 with: build_type: ${{ inputs.build_type }} script: "ci/test_python_distributed.sh" @@ -55,7 +55,7 @@ jobs: container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" wheel-tests-ucxx: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 with: build_type: ${{ inputs.build_type }} branch: ${{ inputs.branch }} @@ -65,7 +65,7 @@ jobs: script: ci/test_wheel_ucxx.sh wheel-tests-distributed-ucxx: secrets: inherit - uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@main + uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@python-3.14 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 c471e2a15..680142fe3 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@main + uses: rapidsai/shared-workflows/.github/workflows/breaking-change-alert.yaml@python-3.14 with: sender_login: ${{ github.event.sender.login }} sender_avatar: ${{ github.event.sender.avatar_url }} diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml index 8a54a2439..0909fd34d 100644 --- a/conda/environments/all_cuda-129_arch-aarch64.yaml +++ b/conda/environments/all_cuda-129_arch-aarch64.yaml @@ -37,7 +37,7 @@ dependencies: - pytest-asyncio>=1.0.0 - pytest-rerunfailures!=16.0.0 - pytest<9.0.0 -- python>=3.11,<3.14 +- python>=3.11 - pyyaml>=6 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-dask-dependency==26.4.*,>=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 0333a44bc..b594e80b3 100644 --- a/conda/environments/all_cuda-129_arch-x86_64.yaml +++ b/conda/environments/all_cuda-129_arch-x86_64.yaml @@ -37,7 +37,7 @@ dependencies: - pytest-asyncio>=1.0.0 - pytest-rerunfailures!=16.0.0 - pytest<9.0.0 -- python>=3.11,<3.14 +- python>=3.11 - pyyaml>=6 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-dask-dependency==26.4.*,>=0.0.0a0 diff --git a/conda/environments/all_cuda-131_arch-aarch64.yaml b/conda/environments/all_cuda-131_arch-aarch64.yaml index 30b98c8ff..4d277c612 100644 --- a/conda/environments/all_cuda-131_arch-aarch64.yaml +++ b/conda/environments/all_cuda-131_arch-aarch64.yaml @@ -37,7 +37,7 @@ dependencies: - pytest-asyncio>=1.0.0 - pytest-rerunfailures!=16.0.0 - pytest<9.0.0 -- python>=3.11,<3.14 +- python>=3.11 - pyyaml>=6 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-dask-dependency==26.4.*,>=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 4772759b8..9615be408 100644 --- a/conda/environments/all_cuda-131_arch-x86_64.yaml +++ b/conda/environments/all_cuda-131_arch-x86_64.yaml @@ -37,7 +37,7 @@ dependencies: - pytest-asyncio>=1.0.0 - pytest-rerunfailures!=16.0.0 - pytest<9.0.0 -- python>=3.11,<3.14 +- python>=3.11 - pyyaml>=6 - rapids-build-backend>=0.4.0,<0.5.0 - rapids-dask-dependency==26.4.*,>=0.0.0a0 diff --git a/conda/recipes/ucxx/conda_build_config.yaml b/conda/recipes/ucxx/conda_build_config.yaml index 09d0fd840..f9f4df1fb 100644 --- a/conda/recipes/ucxx/conda_build_config.yaml +++ b/conda/recipes/ucxx/conda_build_config.yaml @@ -20,6 +20,7 @@ python: - 3.11 - 3.12 - 3.13 + - 3.14 ucx: - "==1.18.*" # [os.environ.get("RAPIDS_CUDA_VERSION", "").startswith("12")] diff --git a/dependencies.yaml b/dependencies.yaml index de6cb56f3..00a817efe 100644 --- a/dependencies.yaml +++ b/dependencies.yaml @@ -288,8 +288,12 @@ dependencies: packages: - python=3.13 - matrix: + py: "3.14" packages: - - python>=3.11,<3.14 + - python=3.14 + - matrix: + packages: + - python>=3.11 run_python_ucxx: common: - output_types: [conda, requirements, pyproject] diff --git a/python/distributed-ucxx/pyproject.toml b/python/distributed-ucxx/pyproject.toml index e0de7a322..a4b3067db 100644 --- a/python/distributed-ucxx/pyproject.toml +++ b/python/distributed-ucxx/pyproject.toml @@ -31,6 +31,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] [project.entry-points."distributed.comm.backends"] diff --git a/python/ucxx/ucxx/_lib_async/tests/conftest.py b/python/ucxx/ucxx/_lib_async/tests/conftest.py index 1ad67c7c9..4933834bb 100644 --- a/python/ucxx/ucxx/_lib_async/tests/conftest.py +++ b/python/ucxx/ucxx/_lib_async/tests/conftest.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. +# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. # SPDX-License-Identifier: BSD-3-Clause import asyncio @@ -67,8 +67,14 @@ def ucxx_setup_teardown(): ucxx.reset() # Let's make sure that UCX gets time to cancel # progress tasks before closing the event loop. - loop = asyncio.get_event_loop() - if loop.is_running(): + try: + loop = asyncio.get_event_loop() + except RuntimeError: + # Python 3.14+ raises if there is no event loop + loop = None + if loop is None: + pass + elif loop.is_running(): # If loop is running, we can't run_until_complete # The cleanup will happen when the loop is closed pass diff --git a/python/ucxx/ucxx/benchmarks/utils.py b/python/ucxx/ucxx/benchmarks/utils.py index 5ff72b9a0..cb77a543b 100644 --- a/python/ucxx/ucxx/benchmarks/utils.py +++ b/python/ucxx/ucxx/benchmarks/utils.py @@ -163,8 +163,9 @@ def _run_cluster_server( A tuple with two elements: the process spawned and a queue where results will eventually be stored. """ - q = mp.Queue() - p = mp.Process( + ctx = mp.get_context("fork") + q = ctx.Queue() + p = ctx.Process( target=_server_process, args=( q, @@ -173,6 +174,7 @@ def _run_cluster_server( ucx_options_list, ), ) + p.start() return p, q @@ -343,10 +345,11 @@ def _run_cluster_workers( ) processes = [] + ctx = mp.get_context("fork") for worker_num in range(num_node_workers): rank = node_idx * num_node_workers + worker_num - q = mp.Queue() - p = mp.Process( + q = ctx.Queue() + p = ctx.Process( target=_worker_process, args=( q,