NVIDIA's CUDA Python 1.0 Makes Python a First-Class GPU Citizen

NVIDIA ships CUDA Python 1.0 with semantic versioning, a shared cuda.core foundation, and PyTorch and CuPy already building on it.

·
·
NVIDIA's CUDA Python 1.0 Makes Python a First-Class GPU Citizen
Read5 min
TypeNews
TopicGpus · Infra
  • NVIDIA released CUDA Python 1.0 alongside CUDA 13.3, making Python a first-class CUDA platform target.
  • Semantic versioning contract: breaking changes only in major releases, with deprecation paths for removed APIs.
  • cuda.core 1.0 adds green contexts, process checkpointing, and inter-process GPU memory sharing.
  • PyTorch CUDA wheels now depend on cuda.bindings; CuPy also builds on the shared foundation.
  • cuda.compute exposes CCCL sort, scan, reduce, top-k as host-callable Python functions with lambda customization.
  • Install via pip install cuda-python cuda-cccl numba-cuda-mlir[cu13]; only an up-to-date driver required.

For years, reaching a GPU from Python meant either writing a C++ extension with a build toolchain or trusting whatever binding layer your favorite framework happened to ship. NVIDIA is now trying to close that gap with CUDA Python 1.0, a bundle of libraries that promises a single, officially supported path from Python to the full CUDA platform, with stability guarantees attached.

Shipped alongside CUDA 13.3, the 1.0 release makes Python a first-class way to drive the platform. The practical consequence is that PyTorch, CuPy, RAPIDS, and your own kernels can finally agree on what a stream, a device, or a memory buffer actually is.

What actually ships in the 1.0 bundle

Despite the marketing label, CUDA Python 1.0 names a milestone, not a version number you will type into pip. The components are versioned independently, and these land together:

  • cuda.core 1.0.0, a Pythonic wrapper over the CUDA runtime
  • cuda.compute 1.0.0, CCCL parallel algorithms callable from Python
  • cuda.bindings 13.3.0, exhaustive 1:1 bindings to the CUDA C APIs
  • cuda-pathfinder, which figures out which CUDA runtime your process actually loaded
  • nvmath-python 1.0, NVIDIA's math libraries with their own stability track

The centerpiece is cuda.core, a Pythonic interface covering devices, streams, programs, linkers, memory resources, and graphs, along with runtime compilation of CUDA C++ so a kernel can go from source to running without a separate build step. Resources are real Python objects, and failures raise exceptions rather than returning error codes.

Semantic versioning is the actual news

Most of these libraries have existed for a while. What changes at 1.0 is a contract: breaking API changes happen only in major releases, minor releases add features, patch releases fix bugs, and any public API scheduled for removal is deprecated first, in a minor release, with a clear replacement path. If you have avoided pinning production code to an NVIDIA Python package because you were unsure the surface would survive the next upgrade, that guarantee is what matters here.

One caveat: a few pieces, including some of the newer kernel-authoring languages, remain experimental and are not yet covered by the 1.0 semantic-versioning guarantees. Numba CUDA MLIR, the new compiler backend, sits in that bucket.

One binding layer to rule them all

The messier problem CUDA Python 1.0 tries to fix is fragmentation. Every project reaching CUDA from Python built or inherited its own binding layer, and those layers disagreed with each other. Getting two GPU libraries to share a buffer on the same stream, without copying, required interchange protocols and careful ownership tracking.

CuPy gets a simpler build and a faster, smaller footprint when importing the module. PyTorch now depends on cuda.bindings in its CUDA wheels. Because cuda.core uses a standard CUDA context, it shares devices, streams, and memory with the rest of the Python GPU ecosystem, so your own kernels can run against CuPy arrays or PyTorch tensors without copying data.

CUDA Python ecosystem stack diagram

Three tiers, pick the one that fits

The stack is organized as three layers on top of a shared runtime, and you enter at whichever tier your problem needs.

TierPackageUse when
Algorithmscuda.computeYour problem decomposes into sort, scan, reduce, transform, histogram, top-k
Kernel authoringnumba-cudaYour logic does not match a prepackaged algorithm and you want per-thread control
Driver/runtimecuda.core, cuda.bindingsYou are building a GPU library or integrating CUDA into a toolkit

cuda.compute brings the CUDA Core Compute Libraries parallel algorithms to Python as host-callable building blocks: sort, scan, reduce, transform, unique, histogram, top-k, and more. These are the same algorithms behind high-performance C++ CUDA code, and from Python they are ordinary function calls on GPU arrays you already have. Version 1.0 also lets you customize algorithm behavior with ordinary Python functions, including lambdas.

For custom kernels, Numba CUDA MLIR is a Numba-compatible kernel generator built on MLIR and the modern NVVM toolchain. It keeps the programming model you already know and swaps the compiler underneath, delivering faster warm JIT compiles and lower kernel-launch latency. For most existing Numba code, the migration is a one-line import change.

New capabilities in cuda.core

Beyond consolidating the API surface, cuda.core 1.0 exposes three platform features that previously required each library to bind independently:

  • Green contexts: partition a GPU's SMs into disjoint groups so latency-sensitive kernels stay shielded from long-running throughput kernels in the same process
  • Process checkpointing: snapshot the full CUDA state of a running process and restore it later
  • Inter-process sharing (IPC): share GPU memory between processes without going through host memory

Green contexts matter for anyone running inference alongside background work on the same GPU. Process checkpointing opens the door to migration, preemption, and fault-recovery patterns that used to require framework-specific hacks.

Getting started

Installation is a single pip line, with nvmath-python as a separate install:

pip install cuda-python cuda-cccl numba-cuda-mlir[cu13]
pip install nvmath-python[cu13]

The only system requirement is an up-to-date NVIDIA driver; a separate CUDA Toolkit installation is generally not required. Documentation and examples live in the cuda-python repository, and broader learning material sits in the Accelerated Computing Hub.

What changes for your work

If you write applications on top of PyTorch, CuPy, or RAPIDS, the benefit reaches you indirectly: fewer dependency conflicts as those libraries converge on shared plumbing, and fewer mysterious interop bugs when you mix them. If you write libraries that target CUDA, the shift is more direct. You no longer have to maintain your own binding layer, and features NVIDIA adds to cuda.core become available without any glue code.

The subtler shift is philosophical. Python is no longer a second-class citizen bolted onto CUDA through community bindings; it is a supported entry point with parity commitments from the platform vendor. That changes the calculus for anyone deciding whether to write the next GPU library in C++ or Python.

Comments

avatar