Skip to content

Commit e2c4e87

Browse files
authored
Merge pull request #2184 from rapidsai/branch-22.04
[RELEASE] cugraph v22.04
2 parents f391a5c + 4106a18 commit e2c4e87

307 files changed

Lines changed: 20274 additions & 5494 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ops-bot.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# This file controls which features from the `ops-bot` repository below are enabled.
2+
# - https://github.com/rapidsai/ops-bot
3+
4+
auto_merger: true
5+
branch_checker: true
6+
label_checker: true
7+
release_drafter: true
8+
external_contributors: false

.gitignore

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,6 @@ datasets/*
7979
## Doxygen
8080
cpp/doxygen/html
8181

82-
# Raft symlink
83-
python/cugraph/cugraph/raft
84-
python/pylibcugraph/pylibcugraph/raft
85-
python/_external_repositories/
86-
8782
# created by Dask tests
8883
python/dask-worker-space
8984
python/cugraph/dask-worker-space

CHANGELOG.md

Lines changed: 132 additions & 43 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,23 @@ There are 3 ways to get cuGraph :
3939
<br/><br/>
4040

4141
---
42+
# cuGraph News
43+
44+
### Scaling to 1 Trillion Edges
45+
cuGraph was recently tested on the Selene supercomputer using 2,048 GPUs and processing a graph with `1.1 Trillion edges`.
46+
47+
<div align="left"><img src="img/Scaling.png" width="500px" style="background-color: white;"/>&nbsp;</br>cuGraph Scaling</div>
48+
</br></br>
49+
50+
### cuGraph Software Stack
51+
cuGraph has a new multi-layer software stack that allows users and system integrators to access cuGraph at different layers.
52+
53+
<div align="left"><img src="img/cugraph-stack.png" width="500px" style="background-color: white;"/>&nbsp;</br>cuGraph Software Stack</div>
54+
</br></br>
55+
56+
57+
58+
4259
# Currently Supported Features
4360
As of Release 21.08 - including 21.08 nightly
4461

@@ -50,24 +67,24 @@ _Italic_ algorithms are planned for future releases.
5067
| ------------ | -------------------------------------- | ------------ | ------------------- |
5168
| Centrality | | | |
5269
| | Katz | Multi-GPU | |
53-
| | Betweenness Centrality | Single-GPU | |
70+
| | Betweenness Centrality | Single-GPU | MG planned for 22.08 |
5471
| | Edge Betweenness Centrality | Single-GPU | |
72+
| | _Eigenvector Centrality_ | | _MG planned for 22.06_ |
5573
| Community | | | |
56-
| | EgoNet | Single-GPU | |
5774
| | Leiden | Single-GPU | |
5875
| | Louvain | Multi-GPU | [C++ README](cpp/src/community/README.md#Louvain) |
5976
| | Ensemble Clustering for Graphs | Single-GPU | |
6077
| | Spectral-Clustering - Balanced Cut | Single-GPU | |
6178
| | Spectral-Clustering - Modularity | Single-GPU | |
6279
| | Subgraph Extraction | Single-GPU | |
63-
| | Triangle Counting | Single-GPU | |
64-
| | K-Truss | Single-GPU | |
80+
| | Triangle Counting | Single-GPU | MG planned for 22.06 |
81+
| | K-Truss | Single-GPU | MG planned for 22.10 |
6582
| Components | | | |
6683
| | Weakly Connected Components | Multi-GPU | |
67-
| | Strongly Connected Components | Single-GPU | |
84+
| | Strongly Connected Components | Single-GPU | MG planned for 22.06 |
6885
| Core | | | |
69-
| | K-Core | Single-GPU | |
70-
| | Core Number | Single-GPU | |
86+
| | K-Core | Single-GPU | MG planned for 22.10 |
87+
| | Core Number | Single-GPU | MG planned for 22.08 |
7188
| _Flow_ | | | |
7289
| | _MaxFlow_ | --- | |
7390
| _Influence_ | | | |
@@ -79,7 +96,7 @@ _Italic_ algorithms are planned for future releases.
7996
| Link Analysis| | | |
8097
| | Pagerank | Multi-GPU | [C++ README](cpp/src/centrality/README.md#Pagerank) |
8198
| | Personal Pagerank | Multi-GPU | [C++ README](cpp/src/centrality/README.md#Personalized-Pagerank) |
82-
| | HITS | Single-GPU | Multi-GPU C code is ready, Python wrapper in 22.04 |
99+
| | HITS | Multi-GPU | |
83100
| Link Prediction | | | |
84101
| | Jaccard Similarity | Single-GPU | |
85102
| | Weighted Jaccard Similarity | Single-GPU | |
@@ -89,10 +106,12 @@ _Italic_ algorithms are planned for future releases.
89106
| Sampling | | | |
90107
| | Random Walks (RW) | Single-GPU | Biased and Uniform |
91108
| | Egonet | Single-GPU | multi-seed |
92-
| | _node2vec_ | --- | C code is ready, Python wrapper coming in 22.04 |
109+
| | Node2Vec | Single-GPU | |
110+
| | Neighborhood sampling | Multi-GPU | |
93111
| Traversal | | | |
94112
| | Breadth First Search (BFS) | Multi-GPU | with cutoff support <br/> [C++ README](cpp/src/traversal/README.md#BFS) |
95113
| | Single Source Shortest Path (SSSP) | Multi-GPU | [C++ README](cpp/src/traversal/README.md#SSSP) |
114+
| | _ASSP / APSP_ | | |
96115
| Tree | | | |
97116
| | Minimum Spanning Tree | Single-GPU | |
98117
| | Maximum Spanning Tree | Single-GPU | |
@@ -164,20 +183,20 @@ Install and update cuGraph using the conda command:
164183

165184
```bash
166185

167-
# CUDA 11.0
168-
conda install -c nvidia -c rapidsai -c numba -c conda-forge cugraph cudatoolkit=11.0
169186

170-
# CUDA 11.2
171-
conda install -c nvidia -c rapidsai -c numba -c conda-forge cugraph cudatoolkit=11.2
187+
188+
172189

173190
# CUDA 11.4
174191
conda install -c nvidia -c rapidsai -c numba -c conda-forge cugraph cudatoolkit=11.4
175192

176193
# CUDA 11.5
177194
conda install -c nvidia -c rapidsai -c numba -c conda-forge cugraph cudatoolkit=11.5
195+
196+
For CUDA > 11.5, please use the 11.5 environment
178197
```
179198

180-
Note: This conda installation only applies to Linux and Python versions 3.7/3.8.
199+
Note: This conda installation only applies to Linux and Python versions 3.8/3.9.
181200

182201

183202
## Build from Source and Contributing <a name="source"></a>

SOURCEBUILD.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ conda activate cugraph_dev
7575

7676

7777
### Build and Install Using the `build.sh` Script
78-
Using the `build.sh` script make compiling and installig cuGraph a breeze. To build and install, simply do:
78+
Using the `build.sh` script make compiling and installing cuGraph a breeze. To build and install, simply do:
7979

8080
```bash
8181
$ cd $CUGRAPH_HOME
@@ -144,6 +144,30 @@ This project uses cmake for building the C/C++ library. To configure cmake, run:
144144
```
145145
The default installation locations are `$CMAKE_INSTALL_PREFIX/lib` and `$CMAKE_INSTALL_PREFIX/include/cugraph` respectively.
146146
147+
#### Updating the RAFT branch
148+
149+
`libcugraph` uses the [RAFT](https://github.com/rapidsai/raft) library and there are times when it might be desirable to build against a different RAFT branch, such as when working on new features that might span both RAFT and cuGraph.
150+
151+
For local development, the `CPM_raft_SOURCE=<path/to/raft/source>` option can be passed to the `cmake` command to enable `libcugraph` to use the local RAFT branch.
152+
153+
To have CI test a `cugraph` pull request against a different RAFT branch, modify the bottom of the `cpp/cmake/thirdparty/get_raft.cmake` file as follows:
154+
155+
```cmake
156+
# Change pinned tag and fork here to test a commit in CI
157+
# To use a different RAFT locally, set the CMake variable
158+
# RPM_raft_SOURCE=/path/to/local/raft
159+
find_and_configure_raft(VERSION ${CUGRAPH_MIN_VERSION_raft}
160+
FORK <your_git_fork>
161+
PINNED_TAG <your_git_branch_or_tag>
162+
163+
# When PINNED_TAG above doesn't match cugraph,
164+
# force local raft clone in build directory
165+
# even if it's already installed.
166+
CLONE_ON_PIN ON
167+
)
168+
```
169+
170+
When the above change is pushed to a pull request, the continuous integration servers will use the specified RAFT branch to run the cuGraph tests. After the changes in the RAFT branch are merged to the release branch, remember to revert the `get_raft.cmake` file back to the original cuGraph branch.
147171
148172
### Building and installing the Python package
149173

build.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ BUILD_DIRS="${LIBCUGRAPH_BUILD_DIR} ${LIBCUGRAPH_ETL_BUILD_DIR} ${CUGRAPH_BUILD_
5353
VERBOSE_FLAG=""
5454
CMAKE_VERBOSE_OPTION=""
5555
BUILD_TYPE=Release
56-
INSTALL_TARGET=install
56+
INSTALL_TARGET="--target install"
5757
BUILD_CPP_TESTS=ON
5858
BUILD_CPP_MG_TESTS=OFF
5959
BUILD_ALL_GPU_ARCH=0
@@ -198,7 +198,7 @@ if buildAll || hasArg libcugraph; then
198198
-DBUILD_TESTS=${BUILD_CPP_TESTS} \
199199
-DBUILD_CUGRAPH_MG_TESTS=${BUILD_CPP_MG_TESTS} \
200200
${CMAKE_VERBOSE_OPTION}
201-
cmake --build "${LIBCUGRAPH_BUILD_DIR}" -j${PARALLEL_LEVEL} --target ${INSTALL_TARGET} ${VERBOSE_FLAG}
201+
cmake --build "${LIBCUGRAPH_BUILD_DIR}" -j${PARALLEL_LEVEL} ${INSTALL_TARGET} ${VERBOSE_FLAG}
202202
fi
203203

204204
# Configure, build, and install libcugraph_etl
@@ -220,7 +220,7 @@ if buildAll || hasArg libcugraph_etl; then
220220
-DBUILD_CUGRAPH_MG_TESTS=${BUILD_CPP_MG_TESTS} \
221221
${CMAKE_VERBOSE_OPTION} \
222222
${REPODIR}/cpp/libcugraph_etl
223-
cmake --build "${LIBCUGRAPH_ETL_BUILD_DIR}" -j${PARALLEL_LEVEL} --target ${INSTALL_TARGET} ${VERBOSE_FLAG}
223+
cmake --build "${LIBCUGRAPH_ETL_BUILD_DIR}" -j${PARALLEL_LEVEL} ${INSTALL_TARGET} ${VERBOSE_FLAG}
224224
fi
225225

226226
# Build, and install pylibcugraph

ci/benchmark/build.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env bash
2-
# Copyright (c) 2018-2021, NVIDIA CORPORATION.
2+
# Copyright (c) 2018-2022, NVIDIA CORPORATION.
33
##########################################
44
# cuGraph Benchmark test script for CI #
55
##########################################
@@ -48,7 +48,7 @@ export DATASETS_DIR=${WORKSPACE}/datasets
4848
export BENCHMARKS_DIR=${WORKSPACE}/benchmarks
4949

5050
# ucx-py version
51-
export UCX_PY_VERSION='0.24.*'
51+
export UCX_PY_VERSION='0.25.*'
5252

5353
##########################################
5454
# Environment Setup #

ci/checks/copyright.py

Lines changed: 79 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2019-2021, NVIDIA CORPORATION.
1+
# Copyright (c) 2020-2022, NVIDIA CORPORATION.
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -18,7 +18,17 @@
1818
import argparse
1919
import io
2020
import os
21-
import git_helpers
21+
import sys
22+
23+
SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.expanduser(__file__)))
24+
25+
# Add the scripts dir for gitutils
26+
sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR,
27+
"../../cpp/scripts")))
28+
29+
# Now import gitutils. Ignore flake8 error here since there is no other way to
30+
# set up imports
31+
import gitutils # noqa: E402
2232

2333
FilesToCheck = [
2434
re.compile(r"[.](cmake|cpp|cu|cuh|h|hpp|sh|pxd|py|pyx)$"),
@@ -28,22 +38,25 @@
2838
re.compile(r"[.]flake8[.]cython$"),
2939
re.compile(r"meta[.]yaml$")
3040
]
41+
ExemptFiles = []
3142

3243
# this will break starting at year 10000, which is probably OK :)
33-
CheckSimple = re.compile(r"Copyright \(c\) (\d{4}), NVIDIA CORPORATION")
44+
CheckSimple = re.compile(
45+
r"Copyright *(?:\(c\))? *(\d{4}),? *NVIDIA C(?:ORPORATION|orporation)")
3446
CheckDouble = re.compile(
35-
r"Copyright \(c\) (\d{4})-(\d{4}), NVIDIA CORPORATION")
47+
r"Copyright *(?:\(c\))? *(\d{4})-(\d{4}),? *NVIDIA C(?:ORPORATION|orporation)" # noqa: E501
48+
)
3649

3750

3851
def checkThisFile(f):
3952
# This check covers things like symlinks which point to files that DNE
40-
if not(os.path.exists(f)):
53+
if not (os.path.exists(f)):
4154
return False
42-
if git_helpers and git_helpers.isFileEmpty(f):
43-
return False
44-
# Special case for versioneer.py - it uses a separate copyright.
45-
if os.path.basename(f) == "versioneer.py":
55+
if gitutils and gitutils.isFileEmpty(f):
4656
return False
57+
for exempt in ExemptFiles:
58+
if exempt.search(f):
59+
return False
4760
for checker in FilesToCheck:
4861
if checker.search(f):
4962
return True
@@ -87,12 +100,22 @@ def checkCopyright(f, update_current_year):
87100
continue
88101
crFound = True
89102
if start > end:
90-
e = [f, lineNum, "First year after second year in the copyright "
91-
"header (manual fix required)", None]
103+
e = [
104+
f,
105+
lineNum,
106+
"First year after second year in the copyright "
107+
"header (manual fix required)",
108+
None
109+
]
92110
errs.append(e)
93111
if thisYear < start or thisYear > end:
94-
e = [f, lineNum, "Current year not included in the "
95-
"copyright header", None]
112+
e = [
113+
f,
114+
lineNum,
115+
"Current year not included in the "
116+
"copyright header",
117+
None
118+
]
96119
if thisYear < start:
97120
e[-1] = replaceCurrentYear(line, thisYear, end)
98121
if thisYear > end:
@@ -103,8 +126,13 @@ def checkCopyright(f, update_current_year):
103126
fp.close()
104127
# copyright header itself not found
105128
if not crFound:
106-
e = [f, 0, "Copyright header missing or formatted incorrectly "
107-
"(manual fix required)", None]
129+
e = [
130+
f,
131+
0,
132+
"Copyright header missing or formatted incorrectly "
133+
"(manual fix required)",
134+
None
135+
]
108136
errs.append(e)
109137
# even if the year matches a copyright header, make the check pass
110138
if yearMatched:
@@ -125,7 +153,6 @@ def checkCopyright(f, update_current_year):
125153
return errs
126154

127155

128-
129156
def getAllFilesUnderDir(root, pathFilter=None):
130157
retList = []
131158
for (dirpath, dirnames, filenames) in os.walk(root):
@@ -143,25 +170,47 @@ def checkCopyright_main():
143170
it compares between branches "$PR_TARGET_BRANCH" and "current-pr-branch"
144171
"""
145172
retVal = 0
173+
global ExemptFiles
146174

147175
argparser = argparse.ArgumentParser(
148-
description="Checks for a consistent copyright header")
149-
argparser.add_argument("--update-current-year", dest='update_current_year',
150-
action="store_true", required=False, help="If set, "
151-
"update the current year if a header is already "
152-
"present and well formatted.")
153-
argparser.add_argument("--git-modified-only", dest='git_modified_only',
154-
action="store_true", required=False, help="If set, "
155-
"only files seen as modified by git will be "
156-
"processed.")
176+
"Checks for a consistent copyright header in git's modified files")
177+
argparser.add_argument("--update-current-year",
178+
dest='update_current_year',
179+
action="store_true",
180+
required=False,
181+
help="If set, "
182+
"update the current year if a header "
183+
"is already present and well formatted.")
184+
argparser.add_argument("--git-modified-only",
185+
dest='git_modified_only',
186+
action="store_true",
187+
required=False,
188+
help="If set, "
189+
"only files seen as modified by git will be "
190+
"processed.")
191+
argparser.add_argument("--exclude",
192+
dest='exclude',
193+
action="append",
194+
required=False,
195+
default=["python/cuml/_thirdparty/"],
196+
help=("Exclude the paths specified (regexp). "
197+
"Can be specified multiple times."))
157198

158199
(args, dirs) = argparser.parse_known_args()
200+
try:
201+
ExemptFiles = ExemptFiles + [pathName for pathName in args.exclude]
202+
ExemptFiles = [re.compile(file) for file in ExemptFiles]
203+
except re.error as reException:
204+
print("Regular expression error:")
205+
print(reException)
206+
return 1
207+
159208
if args.git_modified_only:
160-
files = git_helpers.modifiedFiles(pathFilter=checkThisFile)
209+
files = gitutils.modifiedFiles(pathFilter=checkThisFile)
161210
else:
162211
files = []
163212
for d in [os.path.abspath(d) for d in dirs]:
164-
if not(os.path.isdir(d)):
213+
if not (os.path.isdir(d)):
165214
raise ValueError(f"{d} is not a directory.")
166215
files += getAllFilesUnderDir(d, pathFilter=checkThisFile)
167216

@@ -178,8 +227,9 @@ def checkCopyright_main():
178227
path_parts = os.path.abspath(__file__).split(os.sep)
179228
file_from_repo = os.sep.join(path_parts[path_parts.index("ci"):])
180229
if n_fixable > 0:
181-
print("You can run {} --update-current-year to fix {} of these "
182-
"errors.\n".format(file_from_repo, n_fixable))
230+
print(("You can run `python {} --git-modified-only "
231+
"--update-current-year` to fix {} of these "
232+
"errors.\n").format(file_from_repo, n_fixable))
183233
retVal = 1
184234
else:
185235
print("Copyright check passed")

0 commit comments

Comments
 (0)