Skip to main content

 cuVS: Vector Search and Clustering on the GPU

Contents

  1. Useful Resources
  2. What is cuVS?
  3. Installing cuVS
  4. Getting Started
  5. Contributing
  6. References

Useful Resources

What is cuVS?

cuVS contains state-of-the-art implementations of several algorithms for running approximate nearest neighbors and clustering on the GPU. It can be used directly or through the various databases and other libraries that have integrated it. The primary goal of cuVS is to simplify the use of GPUs for vector similarity search and clustering.

Vector search is an information retrieval method that has been growing in popularity over the past few years, partly because of the rising importance of multimedia embeddings created from unstructured data and the need to perform semantic search on the embeddings to find items which are semantically similar to each other.

Vector search is also used in data mining and machine learning tasks and comprises an important step in many clustering and visualization algorithms like UMAP, t-SNE, K-means, and HDBSCAN.

Finally, faster vector search enables interactions between dense vectors and graphs. Converting a pile of dense vectors into nearest neighbors graphs unlocks the entire world of graph analysis algorithms, such as those found in GraphBLAS and cuGraph.

Below are some common use-cases for vector search

    • Generative AI & Retrieval augmented generation (RAG)
    • Recommender systems
    • Computer vision
    • Image search
    • Text search
    • Audio search
    • Molecular search
    • Model training
  • Data mining

    • Clustering algorithms
    • Visualization algorithms
    • Sampling algorithms
    • Class balancing
    • Ensemble methods
    • k-NN graph construction

Why cuVS?

There are several benefits to using cuVS and GPUs for vector search, including

  1. Fast index build
  2. Latency critical and high throughput search
  3. Parameter tuning
  4. Cost savings
  5. Interoperability (build on GPU, deploy on CPU)
  6. Multiple language support
  7. Building blocks for composing new or accelerating existing algorithms

In addition to the items above, cuVS shoulders the burden of keeping non-trivial accelerated code up to date as new NVIDIA architectures and CUDA versions are released. This provides a delightful development experience, guaranteeing that any libraries, databases, or applications built on top of it will always be getting the best performance and scale.

cuVS Technology Stack

cuVS is built on top of the RAPIDS RAFT library of high performance machine learning primitives and provides all the necessary routines for vector search and clustering on the GPU.

cuVS is built on top of low-level CUDA libraries and provides many important routines that enable vector search and clustering on the GPU

Installing cuVS

cuVS comes with pre-built packages that can be installed through conda and pip or tarball. Different packages are available for the different languages supported by cuVS.

Please see the Build and Install Guide for more information on installing the available cuVS packages and building from source.

Standalone C library (Docker)

To build the standalone C library tarball (libcuvs_c.tar.gz) for use in your own C/C++ projects, see Building the standalone C library with Docker.

Getting Started

The following code snippets train an approximate nearest neighbors index for the CAGRA algorithm in the various different languages supported by cuVS.

Python API

from cuvs.neighbors import cagra

dataset = load_data()
index_params = cagra.IndexParams()

index = cagra.build(index_params, dataset)

C++ API

#include <cuvs/neighbors/cagra.hpp>

using namespace cuvs::neighbors;

raft::device_matrix_view<float> dataset = load_dataset();
raft::device_resources res;

cagra::index_params index_params;

auto index = cagra::build(res, index_params, dataset);

For more code examples of the C++ APIs, including drop-in Cmake project templates, please refer to the C++ examples directory in the codebase.

C API

#include <cuvs/neighbors/cagra.h>

cuvsResources_t res;
cuvsCagraIndexParams_t index_params;
cuvsCagraIndex_t index;

DLManagedTensor *dataset;
load_dataset(dataset);

cuvsResourcesCreate(&res);
cuvsCagraIndexParamsCreate(&index_params);
cuvsCagraIndexCreate(&index);

cuvsDataset_t dataset_view;
cuvsDatasetMakeStandardView(res, dataset, &dataset_view);

cuvsCagraBuild(res, index_params, dataset_view, index);

cuvsDatasetDestroy(dataset_view);
cuvsCagraIndexDestroy(index);
cuvsCagraIndexParamsDestroy(index_params);
cuvsResourcesDestroy(res);

For more code examples of the C APIs, including drop-in Cmake project templates, please refer to the C examples

Rust API

use cuvs::distance::DistanceType;
use cuvs::neighbors::cagra::{Index, IndexParams, SearchParams};
use cuvs::{AsDlTensor, AsDlTensorMut, DLPackError, DLTensorView, DLTensorViewMut, Resources};

// cuVS is agnostic about where your vectors live: `build` and `search` accept
// any type implementing `AsDlTensor` (inputs) / `AsDlTensorMut` (outputs). Wrap
// your own GPU buffer by implementing these traits. See `rust/cuvs/examples`
// for a complete, runnable CUDA-backed implementation.
struct GpuTensor;
impl AsDlTensor for GpuTensor {
    fn as_dl_tensor(&self) -> Result<DLTensorView<'_>, DLPackError> {
        unimplemented!("wrap your device buffer; see rust/cuvs/examples")
    }
}
impl AsDlTensorMut for GpuTensor {
    fn as_dl_tensor_mut(&mut self) -> Result<DLTensorViewMut<'_>, DLPackError> {
        unimplemented!("wrap your device buffer; see rust/cuvs/examples")
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = Resources::new()?;

    // Build a CAGRA index over your dataset.
    let dataset = GpuTensor;
    let index_params = IndexParams::builder()
        .metric(DistanceType::L2Expanded)
        .graph_degree(64)
        .build()?;
    let index = Index::build(&res, &index_params, &dataset)?;

    // Search for the k nearest neighbors of each query, writing the results into
    // the neighbor and distance device buffers.
    let queries = GpuTensor;
    let (mut neighbors, mut distances) = (GpuTensor, GpuTensor);
    let search_params = SearchParams::builder().itopk_size(64).build()?;
    index.search(&res, &search_params, &queries, &mut neighbors, &mut distances)?;

    Ok(())
}

For more code examples of the Rust APIs, including a drop-in project templates, please refer to the Rust examples.

Contributing

If you are interested in contributing to the cuVS library, please read our Contributing guidelines. Refer to the Developer Guide for details on the developer guidelines, workflows, and principles.

References

For the interested reader, many of the accelerated implementations in cuVS are also based on research papers which can provide a lot more background. We also ask you to please cite the corresponding algorithms by referencing them in your own research.

Metadata

Release files for libcuvs-cu13 26.10.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for libcuvs-cu13 26.10.0
File Interpreter ABI Platform
libcuvs_cu13-26.10.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
libcuvs_cu13-26.10.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.27+ ARM64, Linux glibc 2.28+ ARM64 Details

Total release size: 481.0 MB

Release files / libcuvs_cu13-26.10.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libcuvs_cu13-26.10.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 241.2 MB
Tags Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
c414ff2981066f924f274eb874204d161558394362cc9a05beed49fea7096b3a
BLAKE2b-256 checksum
How to use checksums
67f40ff34619fa5629036d03d2013ff55ee9dd742393d6a25f0bd8871498c88a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Release files / libcuvs_cu13-26.10.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL libcuvs_cu13-26.10.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 239.8 MB
Tags Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
98ff39b9a2670e8ee3a17cc9e4bdae0107bc5e6ca1f5ae422f830743f231af87
BLAKE2b-256 checksum
How to use checksums
cd2366e8b2ff98eda5e5d5539f1bcde4544587c2c5e15a9a3b1d123f4171b5f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.8

Release history Release notifications | RSS feed

This release

26.10.0 This release

2 release files

26.4.0

1 release file

26.2.0

1 release file

25.12.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page