From bdbbfce4dcdb34c398dbf8ace74488394279f4be Mon Sep 17 00:00:00 2001 From: "Corey J. Nolet" Date: Tue, 6 Feb 2024 16:16:52 -0500 Subject: [PATCH] Adding intial content to README. --- README.md | 145 ++++++++++++++++++++++++++++++++++-- docs/source/contributing.md | 8 +- 2 files changed, 143 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 52d79822b..8c0b34b45 100755 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@ #
 cuVS: Vector Search and Clustering on the GPU
-### NOTE: We thank you for your patience while the vector search parts of the [RAPIDS RAFT](https://github.com/rapidsai/raft) library are being migrated over to cuVS. We plan for cuVS to become its own fully-featured library by August 2024 (release 24.08) - ## Contents 1. [Useful Resources](#useful-resources) 2. [What is cuVS?](#what-is-cuvs) -3. [Getting Started](#getting-started) -4. [Installing cuVS](#installing) +3. [Installing cuVS](#installing) +4. [Getting Started](#getting-started) 5. [Contributing](#contributing) 6. [References](#references) @@ -23,15 +21,150 @@ ## What is cuVS? -cuVS contains many algorithms for running approximate nearest neighbors and clustering on the GPU. +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. + +**Please note** that cuVS is a new library mostly derived from the approximate nearest neighbors and clustering algorithms in the [RAPIDS RAFT](https://github.com/rapidsai) library of data mining primitives. RAPIDS RAFT currently contains the most fully-featured versions of the approximate nearest neighbors and clustering algorithms in cuVS. We are in the process of migrating the algorithms from RAFT to cuVS, but if you are unsure of which to use, please consider the following: +1. RAFT contains C++ and Python APIs for all of the approximate nearest neighbors and clustering algorithms. +2. cuVS contains a growing support for different languages, including C, C++, Python, and Rust. We will be adding more language support to cuVS in the future but will not be improving the language support for RAFT. +3. Once all of RAFT's approximate nearest neighbors and clustering algorithms are moved to cuVS, the RAFT APIs will be deprecated and eventually removed altogether. Once removed, RAFT will become a lightweight header-only library. In the meantime, there's no harm in using RAFT if support for additional languages is not needed. + +## Installing cuVS + +cuVS comes with pre-built packages that can be installed through [conda](https://conda.io/projects/conda/en/latest/user-guide/getting-started.html#managing-python). Different packages are available for the different languages supported by cuVS: + +| Python | C++ | C | Rust | +|--------|-----|---|------| +| `pycuvs`| `libcuvs` | `libcuvs_c` | `cuvs-rs` | + +### Stable release + +It is recommended to use [mamba](https://mamba.readthedocs.io/en/latest/installation/mamba-installation.html) to install the desired packages. The following command will install the Python package. You can substitute `pycuvs` for any of the packages in the table above: +```bash +mamba install -c conda-forge -c nvidia -c rapidsai pycuvs +``` + +### Nightlies +If installing a version that has not yet been released, the `rapidsai` channel can be replaced with `rapidsai-nightly`: +```bash +mamba install -c conda-forge -c nvidia -c rapidsai-nightly pycuvs=24.02* +``` + +Please see the [Build and Install Guide](docs/source/build.md) for more information on installing cuVS and building from source. ## Getting Started +The following code snippets train an approximate nearest neighbors index for the CAGRA algorithm. +### Python API + +```python +from cuvs.neighbors import cagra + +dataset = load_data() +index_params = cagra.IndexParams() + +index = cagra.build_index(build_params, dataset) +``` + +### C++ API + +```c++ +#include + +using namespace cuvs::neighbors; + +raft::device_matrix_view dataset = load_dataset(); +raft::device_resources res; + +cagra::index_params index_params; + +auto index = cagra::build(res, index_params, dataset); +``` + +### C API + +```c +#include + +cuvsResources_t res; +cuvsCagraIndexParams_t index_params; +cuvsCagraIndex_t index; + +DLManagedTensor *dataset; +load_dataset(dataset); + +cuvsResourcesCreate(&res); +cuvsCagraIndexParamsCreate(&index_params); +cuvsCagraIndexCreate(&index); + +cuvsCagraBuild(res, index_params, dataset, index); + +cuvsCagraIndexDestroy(index); +cuvsCagraIndexParamsDestroy(index_params); +cuvsResourcesDestroy(res); +``` -## Installing cuVS ## Contributing +If you are interested in contributing to the cuVS library, please read our [Contributing guidelines](docs/source/contributing.md). Refer to the [Developer Guide](docs/source/developer_guide.md) for details on the developer guidelines, workflows, and principals. + ## References +When citing cuVS generally, please consider referencing this Github repository. +```bibtex +@misc{rapidsai, + title={Rapidsai/cuVS: Vector Search and Clustering on the GPU.}, + url={https://github.com/rapidsai/cuvs}, + journal={GitHub}, + publisher={Nvidia RAPIDS}, + author={Rapidsai}, + year={2024} +} +``` + +If citing CAGRA, please consider the following bibtex: +```bibtex +@misc{ootomo2023cagra, + title={CAGRA: Highly Parallel Graph Construction and Approximate Nearest Neighbor Search for GPUs}, + author={Hiroyuki Ootomo and Akira Naruse and Corey Nolet and Ray Wang and Tamas Feher and Yong Wang}, + year={2023}, + eprint={2308.15136}, + archivePrefix={arXiv}, + primaryClass={cs.DS} +} +``` + +If citing the k-selection routines, please consider the following bibtex: +```bibtex +@proceedings{10.1145/3581784, + title = {SC '23: Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis}, + year = {2023}, + isbn = {9798400701092}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + abstract = {Started in 1988, the SC Conference has become the annual nexus for researchers and practitioners from academia, industry and government to share information and foster collaborations to advance the state of the art in High Performance Computing (HPC), Networking, Storage, and Analysis.}, + location = {, Denver, CO, USA, } +} +``` + +If citing the nearest neighbors descent API, please consider the following bibtex: +```bibtex +@inproceedings{10.1145/3459637.3482344, + author = {Wang, Hui and Zhao, Wan-Lei and Zeng, Xiangxiang and Yang, Jianye}, + title = {Fast K-NN Graph Construction by GPU Based NN-Descent}, + year = {2021}, + isbn = {9781450384469}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/3459637.3482344}, + doi = {10.1145/3459637.3482344}, + abstract = {NN-Descent is a classic k-NN graph construction approach. It is still widely employed in machine learning, computer vision, and information retrieval tasks due to its efficiency and genericness. However, the current design only works well on CPU. In this paper, NN-Descent has been redesigned to adapt to the GPU architecture. A new graph update strategy called selective update is proposed. It reduces the data exchange between GPU cores and GPU global memory significantly, which is the processing bottleneck under GPU computation architecture. This redesign leads to full exploitation of the parallelism of the GPU hardware. In the meantime, the genericness, as well as the simplicity of NN-Descent, are well-preserved. Moreover, a procedure that allows to k-NN graph to be merged efficiently on GPU is proposed. It makes the construction of high-quality k-NN graphs for out-of-GPU-memory datasets tractable. Our approach is 100-250\texttimes{} faster than the single-thread NN-Descent and is 2.5-5\texttimes{} faster than the existing GPU-based approaches as we tested on million as well as billion scale datasets.}, + booktitle = {Proceedings of the 30th ACM International Conference on Information \& Knowledge Management}, + pages = {1929–1938}, + numpages = {10}, + keywords = {high-dimensional, nn-descent, gpu, k-nearest neighbor graph}, + location = {Virtual Event, Queensland, Australia}, + series = {CIKM '21} +} +``` \ No newline at end of file diff --git a/docs/source/contributing.md b/docs/source/contributing.md index 090fd834b..c426ce534 100755 --- a/docs/source/contributing.md +++ b/docs/source/contributing.md @@ -1,9 +1,9 @@ # Contributing -If you are interested in contributing to CUVS, your contributions will fall +If you are interested in contributing to cuVS, your contributions will fall into three categories: 1. You want to report a bug, feature request, or documentation issue - - File an [issue](https://github.com/rapidsai/CUVS/issues/new/choose) + - File an [issue](https://github.com/rapidsai/cuvs/issues/new/choose) describing what you encountered or what you want to see changed. - The RAPIDS team will evaluate the issues and triage them, scheduling them for a release. If you believe the issue needs priority attention @@ -26,10 +26,10 @@ into three categories: 1. Read the project's [README.md](https://github.com/rapidsai/cuvs) to learn how to setup the development environment 2. Find an issue to work on. The best way is to look for the [good first issue](https://github.com/rapidsai/CUVS/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - or [help wanted](https://github.com/rapidsai/CUVS/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) labels + or [help wanted](https://github.com/rapidsai/cuvs/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) labels 3. Comment on the issue saying you are going to work on it 4. Code! Make sure to update unit tests! -5. When done, [create your pull request](https://github.com/rapidsai/CUVS/compare) +5. When done, [create your pull request](https://github.com/rapidsai/cuvs/compare) 6. Verify that CI passes all [status checks](https://help.github.com/articles/about-status-checks/). Fix if needed 7. Wait for other developers to review your code and update code as needed 8. Once reviewed and approved, a RAPIDS developer will merge your pull request