Skip to main content

Reusable Accelerated Functions & Tools Dask Infrastructure

Project description

 RAFT: Reusable Accelerated Functions and Tools

RAFT tech stack

Contents


  1. Useful Resources
  2. What is RAFT?
  3. Use cases
  4. Is RAFT right for me?
  5. Getting Started
  6. Installing RAFT
  7. Codebase structure and contents
  8. Contributing
  9. References

Useful Resources

What is RAFT?

RAFT contains fundamental widely-used algorithms and primitives for machine learning and data mining. The algorithms are CUDA-accelerated and form building blocks for more easily writing high performance applications.

By taking a primitives-based approach to algorithm development, RAFT

  • accelerates algorithm construction time
  • reduces the maintenance burden by maximizing reuse across projects, and
  • centralizes core reusable computations, allowing future optimizations to benefit all algorithms that use them.

While not exhaustive, the following general categories help summarize the accelerated functions in RAFT:

Category Accelerated Functions in RAFT
Data Formats sparse & dense, conversions, data generation
Dense Operations linear algebra, matrix and vector operations, reductions, slicing, norms, factorization, least squares, svd & eigenvalue problems
Sparse Operations linear algebra, eigenvalue problems, slicing, norms, reductions, factorization, symmetrization, components & labeling
Solvers combinatorial optimization, iterative solvers
Statistics sampling, moments and summary statistics, metrics, model evaluation
Tools & Utilities common tools and utilities for developing CUDA applications, multi-node multi-gpu infrastructure

RAFT is a C++ header-only template library with an optional shared library that

  1. can speed up compile times for common template types, and
  2. provides host-accessible "runtime" APIs, which don't require a CUDA compiler to use

In addition being a C++ library, RAFT also provides 2 Python libraries:

  • pylibraft - lightweight Python wrappers around RAFT's host-accessible "runtime" APIs.
  • raft-dask - multi-node multi-GPU communicator infrastructure for building distributed algorithms on the GPU with Dask.

RAFT is a C++ header-only template library with optional shared library and lightweight Python wrappers

Is RAFT right for me?

RAFT contains low-level primitives for accelerating applications and workflows. Data source providers and application developers may find specific tools very useful. RAFT is not intended to be used directly by data scientists for discovery and experimentation. For data science tools, please see the RAPIDS website.

Getting started

RAPIDS Memory Manager (RMM)

RAFT relies heavily on RMM which eases the burden of configuring different allocation strategies globally across the libraries that use it.

Multi-dimensional Arrays

The APIs in RAFT accept the mdspan multi-dimensional array view for representing data in higher dimensions similar to the ndarray in the Numpy Python library. RAFT also contains the corresponding owning mdarray structure, which simplifies the allocation and management of multi-dimensional data in both host and device (GPU) memory.

The mdarray forms a convenience layer over RMM and can be constructed in RAFT using a number of different helper functions:

#include <raft/core/device_mdarray.hpp>

int n_rows = 10;
int n_cols = 10;

auto scalar = raft::make_device_scalar<float>(handle, 1.0);
auto vector = raft::make_device_vector<float>(handle, n_cols);
auto matrix = raft::make_device_matrix<float>(handle, n_rows, n_cols);

C++ Example

Most of the primitives in RAFT accept a raft::device_resources object for the management of resources which are expensive to create, such CUDA streams, stream pools, and handles to other CUDA libraries like cublas and cusolver.

The example below demonstrates creating a RAFT handle and using it with device_matrix and device_vector to allocate memory, generating random clusters, and computing pairwise Euclidean distances with the NVIDIA cuVS library:

#include <raft/core/device_resources.hpp>
#include <raft/core/device_mdspan.hpp>
#include <raft/random/make_blobs.cuh>
#include <cuvs/distance/distance.hpp>

raft::device_resources handle;

int n_samples = 5000;
int n_features = 50;

float *input;
int *labels;
float *output;

...
// Allocate input, labels, and output pointers
...

auto input_view = raft::make_device_matrix_view(input, n_samples, n_features);
auto labels_view = raft::make_device_vector_view(labels, n_samples);
auto output_view = raft::make_device_matrix_view(output, n_samples, n_samples);

raft::random::make_blobs(handle, input_view, labels_view);

auto metric = cuvs::distance::DistanceType::L2SqrtExpanded;
cuvs::distance::pairwise_distance(handle, input_view, input_view, output_view, metric);

Python Example

The pylibraft package contains a Python API for RAFT algorithms and primitives. pylibraft integrates nicely into other libraries by being very lightweight with minimal dependencies and accepting any object that supports the __cuda_array_interface__, such as CuPy's ndarray. The number of RAFT algorithms exposed in this package is continuing to grow from release to release.

The example below demonstrates computing the pairwise Euclidean distances between CuPy arrays using the NVIDIA cuVS library. Note that CuPy is not a required dependency for pylibraft.

import cupy as cp

from cuvs.distance import pairwise_distance

n_samples = 5000
n_features = 50

in1 = cp.random.random_sample((n_samples, n_features), dtype=cp.float32)
in2 = cp.random.random_sample((n_samples, n_features), dtype=cp.float32)

output = pairwise_distance(in1, in2, metric="euclidean")

The output array in the above example is of type raft.common.device_ndarray, which supports cuda_array_interface making it interoperable with other libraries like CuPy, Numba, PyTorch and RAPIDS cuDF that also support it. CuPy supports DLPack, which also enables zero-copy conversion from raft.common.device_ndarray to JAX and Tensorflow.

Below is an example of converting the output pylibraft.device_ndarray to a CuPy array:

cupy_array = cp.asarray(output)

And converting to a PyTorch tensor:

import torch

torch_tensor = torch.as_tensor(output, device='cuda')

Or converting to a RAPIDS cuDF dataframe:

cudf_dataframe = cudf.DataFrame(output)

When the corresponding library has been installed and available in your environment, this conversion can also be done automatically by all RAFT compute APIs by setting a global configuration option:

import pylibraft.config
pylibraft.config.set_output_as("cupy")  # All compute APIs will return cupy arrays
pylibraft.config.set_output_as("torch") # All compute APIs will return torch tensors

You can also specify a callable that accepts a pylibraft.common.device_ndarray and performs a custom conversion. The following example converts all output to numpy arrays:

pylibraft.config.set_output_as(lambda device_ndarray: return device_ndarray.copy_to_host())

pylibraft also supports writing to a pre-allocated output array so any __cuda_array_interface__ supported array can be written to in-place:

import cupy as cp

from cuvs.distance import pairwise_distance

n_samples = 5000
n_features = 50

in1 = cp.random.random_sample((n_samples, n_features), dtype=cp.float32)
in2 = cp.random.random_sample((n_samples, n_features), dtype=cp.float32)
output = cp.empty((n_samples, n_samples), dtype=cp.float32)

pairwise_distance(in1, in2, out=output, metric="euclidean")

Installing

RAFT's C++ and Python libraries can both be installed through Conda and the Python libraries through Pip.

Installing C++ and Python through Conda

The easiest way to install RAFT is through conda and several packages are provided.

  • libraft-headers C++ headers
  • pylibraft (optional) Python library
  • raft-dask (optional) Python library for deployment of multi-node multi-GPU algorithms that use the RAFT raft::comms abstraction layer in Dask clusters.

Use the following command, depending on your CUDA version, to install all of the RAFT packages with conda (replace rapidsai with rapidsai-nightly to install more up-to-date but less stable nightly packages). mamba is preferred over the conda command.

# CUDA 13
mamba install -c rapidsai -c conda-forge raft-dask pylibraft cuda-version=13.1

# CUDA 12
mamba install -c rapidsai -c conda-forge raft-dask pylibraft cuda-version=12.9

Note that the above commands will also install libraft-headers and libraft.

You can also install the conda packages individually using the mamba command above. For example, if you'd like to install RAFT's headers and pre-compiled shared library to use in your project:

# CUDA 13
mamba install -c rapidsai -c conda-forge libraft libraft-headers cuda-version=13.1

# CUDA 12
mamba install -c rapidsai -c conda-forge libraft libraft-headers cuda-version=12.9

Installing Python through Pip

pylibraft and raft-dask both have experimental packages that can be installed through pip:

# CUDA 13
pip install pylibraft-cu13 --extra-index-url=https://pypi.nvidia.com
pip install raft-dask-cu13 --extra-index-url=https://pypi.nvidia.com

# CUDA 12
pip install pylibraft-cu12 --extra-index-url=https://pypi.nvidia.com
pip install raft-dask-cu12 --extra-index-url=https://pypi.nvidia.com

These packages statically build RAFT's pre-compiled instantiations and so the C++ headers won't be readily available to use in your code.

The build instructions contain more details on building RAFT from source and including it in downstream projects. You can also find a more comprehensive version of the above CPM code snippet the Building RAFT C++ and Python from source section of the build instructions.

Contributing

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

References

When citing RAFT generally, please consider referencing this Github project.

@misc{rapidsai,
  title={Rapidsai/raft: RAFT contains fundamental widely-used algorithms and primitives for data science, Graph and machine learning.},
  url={https://github.com/rapidsai/raft},
  journal={GitHub},
  publisher={NVIDIA RAPIDS},
  author={Rapidsai},
  year={2022}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

raft_dask_cu12-26.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

raft_dask_cu12-26.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

raft_dask_cu12-26.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

raft_dask_cu12-26.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

raft_dask_cu12-26.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

raft_dask_cu12-26.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

raft_dask_cu12-26.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

raft_dask_cu12-26.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

File details

Details for the file raft_dask_cu12-26.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a6e7c76e19ed3761850d0ad2298a58cab9a51acf3512339f47252c8d57d3b45
MD5 17256fd27ad3387ac598f94de6dd791b
BLAKE2b-256 99b7671d1f61afaa3af9706c794e2be623d49d3775bf7045c16ad23549a1240d

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 10c1e284a0728b4bb0c6b0e8506fc8e306acff89737e6fc7a800a3bdd7c1e41d
MD5 f79981864fd207c65170ea5613027819
BLAKE2b-256 7479cf40ab50702eb65911a86e35cc8551becacf3fcd7b42041bf970f510d334

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 58cc413003449e3b178c806cf89310b72e465b3960bc68064c2fae0112e5e8f9
MD5 3c7600c14fee4493f43052b936e5f651
BLAKE2b-256 89f0ff8bd8f6cafe411ca7b7d39a90058f3692cc90741c32a7eb37688b0b143b

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a9ac8e18cde0427423283bfd2f285b210fef9323c833f8f9e0a3fb4c3aa36673
MD5 7a2a4afd728644e37940e6a9147f240a
BLAKE2b-256 0aa480cb3a854df309ecc6d13d4e91a4b03639f4bfaeba472ff73abb3d19c687

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d35ee50596b6db51c6747a86897014807b6a05d2e88a73dc9bc543240fc29aae
MD5 0b5604c99db93b118cd87fc6f90e2164
BLAKE2b-256 6f9c32b0cc30cd41a4082dc04d13fd978588f95592edc170e51d52a5fa398e10

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 08ec4674905ca28b57c4c026c238f7b39e59bf48c5e6f83018881871bf3b0c39
MD5 2a029464530ed4c403ff820d4b37a957
BLAKE2b-256 a710bee40301a9749e367ca0e24a61c7258ac588324c378e5aaefc2b4e3ddeb5

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aafea402c571409ba44cc95e5fcdcec0e10fffade868a01dcd926b75c7296073
MD5 8baaa966cc9ac8e7bbb5105341249d3b
BLAKE2b-256 c158dbdf6372863521a7591e5594c064b21822fdd908ac789ad9012f4b40a08a

See more details on using hashes here.

File details

Details for the file raft_dask_cu12-26.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for raft_dask_cu12-26.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bfa9622d271811f23effefd69d4f979824bf1cbf03d97a84a8c89b0e007d8018
MD5 57ede1dfe865f00102d04f956fed002d
BLAKE2b-256 5170c36ca2cfa3404617e4c8c6d496bec9c8d259f17148efe47ce5a14994839a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page