From 88e0d118cd9057778109329844650d3044150d12 Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Tue, 18 Aug 2020 15:34:37 -0400
Subject: [PATCH 1/7] new notebook for benchmarking
---
notebooks/cugraph_benchmarks/release.ipynb | 597 +++++++++++++++++++++
1 file changed, 597 insertions(+)
create mode 100644 notebooks/cugraph_benchmarks/release.ipynb
diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb
new file mode 100644
index 00000000000..b4cbf572d79
--- /dev/null
+++ b/notebooks/cugraph_benchmarks/release.ipynb
@@ -0,0 +1,597 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Release Benchmarking\n",
+ "\n",
+ "With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n",
+ "This notebook run all the various algorithms to compuite the performance gain. \n",
+ "\n",
+ "### Algorithms\n",
+ "| Algorithm |\n",
+ "| ------------------------|\n",
+ "| BFS |\n",
+ "| SSSP |\n",
+ "| PageRank |\n",
+ "| WCC |\n",
+ "| Betweenness Centrality (vertex) |\n",
+ "| Louvain |\n",
+ "| Triangle Counting |\n",
+ "\n",
+ "### Test Data\n",
+ "\n",
+ "| File Name | Num of Vertices | Num of Edges |\n",
+ "| ---------------------- | --------------: | -----------: |\n",
+ "| preferentialAttachment | 100,000 | 999,970 |\n",
+ "| dblp-2010 | 326,186 | 1,615,400 |\n",
+ "| coPapersCiteseer | 434,102 | 32,073,440 |\n",
+ "| as-Skitter | 1,696,415 | 22,190,596 |\n",
+ "\n",
+ "\n",
+ "Notebook Credits\n",
+ "\n",
+ " Original Authors: Bradley Rees\n",
+ " Last Edit: 08/17/2020\n",
+ " \n",
+ "RAPIDS Versions: 0.15\n",
+ "\n",
+ "Test Hardware\n",
+ " GV100 32G, CUDA 10.2\n",
+ " Intel(R) Core(TM) CPU i7-7800X @ 3.50GHz\n",
+ " 32GB system memory\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Timing \n",
+ "What is not timed: Reading the data
\n",
+ "What is timmed: (1) creating a Graph, (2) running the algorithm"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Import Modules"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# system and other\n",
+ "import gc\n",
+ "import os\n",
+ "import time\n",
+ "import numpy as np\n",
+ "\n",
+ "# rapids\n",
+ "import cugraph\n",
+ "import cudf\n",
+ "\n",
+ "# NetworkX libraries\n",
+ "import networkx as nx"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try: \n",
+ " import community\n",
+ "except ModuleNotFoundError:\n",
+ " os.system('pip install python-louvain')\n",
+ " import community"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try: \n",
+ " import matplotlib\n",
+ "except ModuleNotFoundError:\n",
+ " os.system('pip install matplotlib')\n",
+ "\n",
+ "import matplotlib.pyplot as plt; plt.rcdefaults()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Define the test data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Test File\n",
+ "data = {\n",
+ " 'preferentialAttachment' : '../data/preferentialAttachment.csv',\n",
+ " 'dblp' : '../data/dblp.csv',\n",
+ " 'coPapersCiteseer' : '../data/coPapersCiteseer.csv',\n",
+ " 'as-Skitter' : '../data/as-Skitter.csv'\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Read data\n",
+ "The data is read in once once and used for both cuGraph and NetworkX."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def read_data(datafile):\n",
+ " print (f\"reading {v}\")\n",
+ " _gdf = cudf.read_csv(datafile, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'] )\n",
+ " return _gdf"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Create Graph functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# NetworkX\n",
+ "def create_nx_graph(_df):\n",
+ " t1 = time.time()\n",
+ "\n",
+ " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n",
+ "\n",
+ " t2 = time.time() - t1\n",
+ "\n",
+ " return _gnx, t2\n",
+ "\n",
+ "# cuGraph - force CSR creation\n",
+ "def create_cu_graph(_df):\n",
+ " t1 = time.time()\n",
+ "\n",
+ " _g = cugraph.DiGraph()\n",
+ " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n",
+ " _ = _g.view_adj_list()\n",
+ " t2 = time.time() - t1\n",
+ "\n",
+ " return _g, t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### BFS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_bfs(_G):\n",
+ " t1 = time.time()\n",
+ " _ = nx.bfs_edges(_G, 1)\n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_bfs(_G):\n",
+ " t1 = time.time()\n",
+ " _ = cugraph.bfs(_G, 1)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### SSSP"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_sssp(_G):\n",
+ " t1 = time.time()\n",
+ " _ = nx.shortest_path(_G, 1)\n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_sssp(_G):\n",
+ " t1 = time.time()\n",
+ " _ = cugraph.sssp(_G, 1)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### PageRank"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_pagerank(_G):\n",
+ " t1 = time.time()\n",
+ " _ = nx.pagerank(_G)\n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_pagerank(_G):\n",
+ " t1 = time.time() \n",
+ " _ = cugraph.pagerank(_G)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### WCC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_wcc(_G):\n",
+ " t1 = time.time()\n",
+ " _ = nx.weakly_connected_components(_G)\n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_wcc(_G):\n",
+ " t1 = time.time()\n",
+ " _ = cugraph.weakly_connected_components(_G)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Betweenness Centrality (vertex)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_bc(_G):\n",
+ " t1 = time.time()\n",
+ " _ = nx.betweenness_centrality(_G, k=100)\n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_bc(_G):\n",
+ " t1 = time.time()\n",
+ " _ = cugraph.betweenness_centrality(_G, k=100)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Louvain"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_louvain(_G):\n",
+ " t1 = time.time()\n",
+ " ug = _G.to_undirected()\n",
+ " \n",
+ " parts = community.best_partition(ug)\n",
+ " \n",
+ " # Calculating modularity scores for comparison \n",
+ " _ = community.modularity(parts, ug) \n",
+ " \n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_louvain(_G):\n",
+ " t1 = time.time()\n",
+ " _,_ = cugraph.louvain(_G)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Triangle Counting"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def nx_tc(_G):\n",
+ " t1 = time.time()\n",
+ " nx_count = nx.triangles(_G)\n",
+ " \n",
+ " # To get the number of triangles, we would need to loop through the array and add up each count\n",
+ " count = 0\n",
+ " for key, value in nx_count.items():\n",
+ " count = count + value \n",
+ " \n",
+ " \n",
+ " t2 = time.time() - t1\n",
+ " return t2\n",
+ "\n",
+ "def cu_tc(_G):\n",
+ " t1 = time.time()\n",
+ " _ = cugraph.triangles(_G)\n",
+ " t2 = time.time() - t1\n",
+ " return t2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Benchmark Functions"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# number of datasets\n",
+ "num_datasets = len(data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "reading ../data/preferentialAttachment.csv\n",
+ "reading ../data/preferentialAttachment.csv\n",
+ "\tdata in gdf 999970 and data in pandas 999970\n",
+ "\tcugraph Size 999970\n",
+ "\tcugraph Order 100000\n",
+ "\tcreated Gx in 2.2733235359191895 seconds vs Cu in 0.0037124156951904297\n",
+ "\tBFS\n",
+ "\tSSSP\n",
+ "\tPageRank\n",
+ "\tWCC\n",
+ "\tBC\n",
+ "\tLouvain\n"
+ ]
+ }
+ ],
+ "source": [
+ "# arrays to capture performance gains\n",
+ "names = []\n",
+ "time_create_cu = []\n",
+ "time_create_nx = []\n",
+ "\n",
+ "# Two dimension data\n",
+ "time_algo_cu = [] # will be two dimensional\n",
+ "time_algo_nx = [] # will be two dimensional\n",
+ "perf = []\n",
+ "\n",
+ "# do a simple pass just to get all the libraries initiallized\n",
+ "v = '../data/preferentialAttachment.csv'\n",
+ "gdf = read_data(v)\n",
+ "#trapids = cugraph_call(M)\n",
+ "del gdf\n",
+ "gc.collect()\n",
+ "\n",
+ "\n",
+ "i = 0\n",
+ "for k,v in data.items():\n",
+ " time_algo_cu.append([])\n",
+ " time_algo_nx.append([])\n",
+ " perf.append([])\n",
+ " \n",
+ " # Saved the file Name\n",
+ " names.append(k)\n",
+ "\n",
+ " # read data\n",
+ " gdf = read_data(v)\n",
+ " pdf = gdf.to_pandas()\n",
+ " print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n",
+ "\n",
+ " # Create the DiGraphs\n",
+ "\n",
+ " Gx, tx = create_nx_graph(pdf)\n",
+ " Gc, tc = create_cu_graph(gdf)\n",
+ " \n",
+ " time_create_nx.append(tx)\n",
+ " time_create_cu.append(tc)\n",
+ " \n",
+ " print(f\"\\tcugraph Size {Gc.number_of_edges()}\")\n",
+ " print(f\"\\tcugraph Order {Gc.number_of_vertices()}\")\n",
+ " print(f\"\\tcreated Gx in {tx} seconds vs Cu in {tc}\")\n",
+ " \n",
+ " # BFS\n",
+ " print(\"\\tBFS\")\n",
+ " tx = nx_bfs(Gx)\n",
+ " tc = cu_bfs(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ " \n",
+ " # SSSP\n",
+ " print(\"\\tSSSP\")\n",
+ " tx = nx_sssp(Gx)\n",
+ " tc = cu_sssp(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ "\n",
+ " # PageRank\n",
+ " print(\"\\tPageRank\") \n",
+ " tx = nx_pagerank(Gx)\n",
+ " tc = cu_pagerank(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ "\n",
+ " # WCC\n",
+ " print(\"\\tWCC\")\n",
+ " tx = nx_wcc(Gx)\n",
+ " tc = cu_wcc(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ "\n",
+ " # BC\n",
+ " print(\"\\tBC\")\n",
+ " tx = nx_bc(Gx)\n",
+ " tc = cu_bc(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ "\n",
+ " # Louvain\n",
+ " print(\"\\tLouvain\")\n",
+ " tx = nx_louvain(Gx)\n",
+ " tc = cu_lovain(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ "\n",
+ " # TC\n",
+ " print(\"\\tTC\")\n",
+ " tx = nx_tc(Gx)\n",
+ " tc = cu_tc(Gc)\n",
+ "\n",
+ " time_algo_nx[i].append(tx)\n",
+ " time_algo_cu[i].append(tc)\n",
+ " perf[i].append(tx/tc)\n",
+ "\n",
+ " i = i + 1\n",
+ " gc.collect()\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Print results\n",
+ "for i in range(num_datasets):\n",
+ " perf[i]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "cugraph_dev",
+ "language": "python",
+ "name": "cugraph_dev"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
From 740b62e0de706288a25b6a5f55e35466b3efa499 Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Wed, 19 Aug 2020 10:51:12 -0400
Subject: [PATCH 2/7] updated processing and what is timed
---
notebooks/cugraph_benchmarks/release.ipynb | 221 +++++++++++++--------
1 file changed, 137 insertions(+), 84 deletions(-)
diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb
index b4cbf572d79..a4f8c9887f1 100644
--- a/notebooks/cugraph_benchmarks/release.ipynb
+++ b/notebooks/cugraph_benchmarks/release.ipynb
@@ -10,15 +10,15 @@
"This notebook run all the various algorithms to compuite the performance gain. \n",
"\n",
"### Algorithms\n",
- "| Algorithm |\n",
- "| ------------------------|\n",
- "| BFS |\n",
- "| SSSP |\n",
- "| PageRank |\n",
- "| WCC |\n",
- "| Betweenness Centrality (vertex) |\n",
- "| Louvain |\n",
- "| Triangle Counting |\n",
+ "| Algorithm | Graph | DiGraph |\n",
+ "| ------------------------| -------- | ----------- |\n",
+ "| BFS | X | |\n",
+ "| SSSP | X | |\n",
+ "| PageRank | | X |\n",
+ "| WCC | | X |\n",
+ "| Betweenness Centrality | X | |\n",
+ "| Louvain | X | |\n",
+ "| Triangle Counting | X | |\n",
"\n",
"### Test Data\n",
"\n",
@@ -77,7 +77,10 @@
"import cudf\n",
"\n",
"# NetworkX libraries\n",
- "import networkx as nx"
+ "import networkx as nx\n",
+ "\n",
+ "# MTX file reader\n",
+ "from scipy.io import mmread"
]
},
{
@@ -122,10 +125,10 @@
"source": [
"# Test File\n",
"data = {\n",
- " 'preferentialAttachment' : '../data/preferentialAttachment.csv',\n",
- " 'dblp' : '../data/dblp.csv',\n",
- " 'coPapersCiteseer' : '../data/coPapersCiteseer.csv',\n",
- " 'as-Skitter' : '../data/as-Skitter.csv'\n",
+ " 'preferentialAttachment' : './data/preferentialAttachment.mtx'\n",
+ "# 'dblp' : './data/dblp.mtx',\n",
+ "# 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n",
+ "# 'as-Skitter' : './data/as-Skitter.mtx'\n",
"}"
]
},
@@ -143,9 +146,15 @@
"metadata": {},
"outputs": [],
"source": [
+ "# Data reader - the file format is MTX, so we will use the reader from SciPy\n",
"def read_data(datafile):\n",
- " print (f\"reading {v}\")\n",
- " _gdf = cudf.read_csv(datafile, delimiter=' ', names=['src', 'dst'], dtype=['int32', 'int32'] )\n",
+ " print('Reading ' + str(datafile) + '...')\n",
+ " M = mmread(datafile).asfptype()\n",
+ "\n",
+ " _gdf = cudf.DataFrame()\n",
+ " _gdf['src'] = M.row\n",
+ " _gdf['dst'] = M.col\n",
+ " \n",
" return _gdf"
]
},
@@ -164,24 +173,26 @@
"source": [
"# NetworkX\n",
"def create_nx_graph(_df):\n",
- " t1 = time.time()\n",
- "\n",
" _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n",
+ " return _gnx\n",
"\n",
- " t2 = time.time() - t1\n",
+ "def create_nx_ugraph(_df):\n",
+ " _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.Graph)\n",
+ " return _gnx\n",
"\n",
- " return _gnx, t2\n",
"\n",
- "# cuGraph - force CSR creation\n",
+ "# cuGraph\n",
"def create_cu_graph(_df):\n",
- " t1 = time.time()\n",
- "\n",
" _g = cugraph.DiGraph()\n",
" _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n",
" _ = _g.view_adj_list()\n",
- " t2 = time.time() - t1\n",
+ " return _g\n",
"\n",
- " return _g, t2"
+ "def create_cu_ugraph(_df):\n",
+ " _g = cugraph.Graph()\n",
+ " _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n",
+ " _ = _g.view_adj_list()\n",
+ " return _g"
]
},
{
@@ -197,14 +208,16 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_bfs(_G):\n",
+ "def nx_bfs(_df):\n",
" t1 = time.time()\n",
+ " _G = create_nx_ugraph(_df)\n",
" _ = nx.bfs_edges(_G, 1)\n",
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_bfs(_G):\n",
+ "def cu_bfs(_df):\n",
" t1 = time.time()\n",
+ " _G = create_cu_ugraph(_df)\n",
" _ = cugraph.bfs(_G, 1)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -223,14 +236,16 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_sssp(_G):\n",
+ "def nx_sssp(_df):\n",
" t1 = time.time()\n",
+ " _G = create_nx_ugraph(_df)\n",
" _ = nx.shortest_path(_G, 1)\n",
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_sssp(_G):\n",
+ "def cu_sssp(_df):\n",
" t1 = time.time()\n",
+ " _G = create_cu_ugraph(_df) \n",
" _ = cugraph.sssp(_G, 1)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -249,14 +264,16 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_pagerank(_G):\n",
+ "def nx_pagerank(_df):\n",
" t1 = time.time()\n",
+ " _G = create_nx_graph(_df)\n",
" _ = nx.pagerank(_G)\n",
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_pagerank(_G):\n",
- " t1 = time.time() \n",
+ "def cu_pagerank(_df):\n",
+ " t1 = time.time()\n",
+ " _G = create_cu_graph(_df)\n",
" _ = cugraph.pagerank(_G)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -275,14 +292,16 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_wcc(_G):\n",
+ "def nx_wcc(_df):\n",
" t1 = time.time()\n",
+ " _G = create_nx_graph(_df)\n",
" _ = nx.weakly_connected_components(_G)\n",
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_wcc(_G):\n",
+ "def cu_wcc(_df):\n",
" t1 = time.time()\n",
+ " _G = create_cu_graph(_df) \n",
" _ = cugraph.weakly_connected_components(_G)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -301,14 +320,16 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_bc(_G):\n",
+ "def nx_bc(_df):\n",
" t1 = time.time()\n",
+ " _G = create_nx_ugraph(_df)\n",
" _ = nx.betweenness_centrality(_G, k=100)\n",
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_bc(_G):\n",
+ "def cu_bc(_df):\n",
" t1 = time.time()\n",
+ " _G = create_cu_ugraph(_df)\n",
" _ = cugraph.betweenness_centrality(_G, k=100)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -327,11 +348,10 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_louvain(_G):\n",
+ "def nx_louvain(_df):\n",
" t1 = time.time()\n",
- " ug = _G.to_undirected()\n",
- " \n",
- " parts = community.best_partition(ug)\n",
+ " _G = create_nx_ugraph(_df)\n",
+ " parts = community.best_partition(_G)\n",
" \n",
" # Calculating modularity scores for comparison \n",
" _ = community.modularity(parts, ug) \n",
@@ -339,8 +359,9 @@
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_louvain(_G):\n",
+ "def cu_louvain(_df):\n",
" t1 = time.time()\n",
+ " _G = create_cu_ugraph(_df)\n",
" _,_ = cugraph.louvain(_G)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -359,8 +380,9 @@
"metadata": {},
"outputs": [],
"source": [
- "def nx_tc(_G):\n",
+ "def nx_tc(_df):\n",
" t1 = time.time()\n",
+ " _G = create_nx_ugraph(_df)\n",
" nx_count = nx.triangles(_G)\n",
" \n",
" # To get the number of triangles, we would need to loop through the array and add up each count\n",
@@ -368,12 +390,12 @@
" for key, value in nx_count.items():\n",
" count = count + value \n",
" \n",
- " \n",
" t2 = time.time() - t1\n",
" return t2\n",
"\n",
- "def cu_tc(_G):\n",
+ "def cu_tc(_df):\n",
" t1 = time.time()\n",
+ " _G = create_cu_ugraph(_df)\n",
" _ = cugraph.triangles(_G)\n",
" t2 = time.time() - t1\n",
" return t2"
@@ -403,6 +425,55 @@
"num_datasets = len(data)"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Reading ./data/preferentialAttachment.mtx...\n",
+ "\tGDF Size 999970\n",
+ "\tcugraph Size 499985\n",
+ "\tcugraph Order 100000\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# do a simple pass just to get all the libraries initiallized\n",
+ "v = './data/preferentialAttachment.mtx'\n",
+ "gdf = read_data(v)\n",
+ "print(f\"\\tGDF Size {len(gdf)}\")\n",
+ "\n",
+ "g = create_cu_ugraph(gdf)\n",
+ "\n",
+ "print(f\"\\tcugraph Size {g.number_of_edges()}\")\n",
+ "print(f\"\\tcugraph Order {g.number_of_vertices()}\")\n",
+ "\n",
+ "del gdf\n",
+ "del g\n",
+ "gc.collect()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
{
"cell_type": "code",
"execution_count": null,
@@ -412,12 +483,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "reading ../data/preferentialAttachment.csv\n",
- "reading ../data/preferentialAttachment.csv\n",
+ "Reading ./data/preferentialAttachment.mtx...\n",
"\tdata in gdf 999970 and data in pandas 999970\n",
- "\tcugraph Size 999970\n",
- "\tcugraph Order 100000\n",
- "\tcreated Gx in 2.2733235359191895 seconds vs Cu in 0.0037124156951904297\n",
"\tBFS\n",
"\tSSSP\n",
"\tPageRank\n",
@@ -430,20 +497,12 @@
"source": [
"# arrays to capture performance gains\n",
"names = []\n",
- "time_create_cu = []\n",
- "time_create_nx = []\n",
"\n",
"# Two dimension data\n",
"time_algo_cu = [] # will be two dimensional\n",
"time_algo_nx = [] # will be two dimensional\n",
"perf = []\n",
"\n",
- "# do a simple pass just to get all the libraries initiallized\n",
- "v = '../data/preferentialAttachment.csv'\n",
- "gdf = read_data(v)\n",
- "#trapids = cugraph_call(M)\n",
- "del gdf\n",
- "gc.collect()\n",
"\n",
"\n",
"i = 0\n",
@@ -460,83 +519,77 @@
" pdf = gdf.to_pandas()\n",
" print(f\"\\tdata in gdf {len(gdf)} and data in pandas {len(pdf)}\")\n",
"\n",
- " # Create the DiGraphs\n",
- "\n",
- " Gx, tx = create_nx_graph(pdf)\n",
- " Gc, tc = create_cu_graph(gdf)\n",
- " \n",
- " time_create_nx.append(tx)\n",
- " time_create_cu.append(tc)\n",
- " \n",
- " print(f\"\\tcugraph Size {Gc.number_of_edges()}\")\n",
- " print(f\"\\tcugraph Order {Gc.number_of_vertices()}\")\n",
- " print(f\"\\tcreated Gx in {tx} seconds vs Cu in {tc}\")\n",
- " \n",
" # BFS\n",
" print(\"\\tBFS\")\n",
- " tx = nx_bfs(Gx)\n",
- " tc = cu_bfs(Gc)\n",
+ " tx = nx_bfs(pdf)\n",
+ " tc = cu_bfs(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
" \n",
" # SSSP\n",
" print(\"\\tSSSP\")\n",
- " tx = nx_sssp(Gx)\n",
- " tc = cu_sssp(Gc)\n",
+ " tx = nx_sssp(pdf)\n",
+ " tc = cu_sssp(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
"\n",
" # PageRank\n",
" print(\"\\tPageRank\") \n",
- " tx = nx_pagerank(Gx)\n",
- " tc = cu_pagerank(Gc)\n",
+ " tx = nx_pagerank(pdf)\n",
+ " tc = cu_pagerank(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
"\n",
" # WCC\n",
" print(\"\\tWCC\")\n",
- " tx = nx_wcc(Gx)\n",
- " tc = cu_wcc(Gc)\n",
+ " tx = nx_wcc(pdf)\n",
+ " tc = cu_wcc(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
"\n",
" # BC\n",
" print(\"\\tBC\")\n",
- " tx = nx_bc(Gx)\n",
- " tc = cu_bc(Gc)\n",
+ " tx = nx_bc(pdf)\n",
+ " tc = cu_bc(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
"\n",
" # Louvain\n",
" print(\"\\tLouvain\")\n",
- " tx = nx_louvain(Gx)\n",
- " tc = cu_lovain(Gc)\n",
+ " tx = nx_louvain(pdf)\n",
+ " tc = cu_lovain(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
"\n",
" # TC\n",
" print(\"\\tTC\")\n",
- " tx = nx_tc(Gx)\n",
- " tc = cu_tc(Gc)\n",
+ " tx = nx_tc(pdf)\n",
+ " tc = cu_tc(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
" perf[i].append(tx/tc)\n",
+ " gc.collect()\n",
"\n",
" i = i + 1\n",
- " gc.collect()\n",
"\n"
]
},
From 2827cac17921f32914aae7b58a69309c057d499b Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Wed, 19 Aug 2020 11:37:49 -0400
Subject: [PATCH 3/7] typos
---
notebooks/cugraph_benchmarks/release.ipynb | 74 ++++++----------------
1 file changed, 19 insertions(+), 55 deletions(-)
diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb
index a4f8c9887f1..1fd742d627b 100644
--- a/notebooks/cugraph_benchmarks/release.ipynb
+++ b/notebooks/cugraph_benchmarks/release.ipynb
@@ -62,7 +62,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -85,7 +85,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -98,7 +98,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -119,7 +119,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -142,7 +142,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -167,7 +167,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -204,7 +204,7 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -232,7 +232,7 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -260,7 +260,7 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -288,7 +288,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -316,7 +316,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -344,7 +344,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -354,7 +354,7 @@
" parts = community.best_partition(_G)\n",
" \n",
" # Calculating modularity scores for comparison \n",
- " _ = community.modularity(parts, ug) \n",
+ " _ = community.modularity(parts, _G) \n",
" \n",
" t2 = time.time() - t1\n",
" return t2\n",
@@ -376,7 +376,7 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -417,7 +417,7 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -427,30 +427,9 @@
},
{
"cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Reading ./data/preferentialAttachment.mtx...\n",
- "\tGDF Size 999970\n",
- "\tcugraph Size 499985\n",
- "\tcugraph Order 100000\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "0"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
"# do a simple pass just to get all the libraries initiallized\n",
"v = './data/preferentialAttachment.mtx'\n",
@@ -478,22 +457,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Reading ./data/preferentialAttachment.mtx...\n",
- "\tdata in gdf 999970 and data in pandas 999970\n",
- "\tBFS\n",
- "\tSSSP\n",
- "\tPageRank\n",
- "\tWCC\n",
- "\tBC\n",
- "\tLouvain\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# arrays to capture performance gains\n",
"names = []\n",
From 6d88e2249ba35ceec016094cc7ee2f91f1033b3a Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Thu, 20 Aug 2020 09:14:33 -0400
Subject: [PATCH 4/7] tested and updated
---
notebooks/cugraph_benchmarks/release.ipynb | 28 ++++++++++++++++------
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb
index 1fd742d627b..bb1a373b672 100644
--- a/notebooks/cugraph_benchmarks/release.ipynb
+++ b/notebooks/cugraph_benchmarks/release.ipynb
@@ -7,7 +7,7 @@
"# Release Benchmarking\n",
"\n",
"With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n",
- "This notebook run all the various algorithms to compuite the performance gain. \n",
+ "This notebook, starting with release 0.15, run all the various algorithms to compuite the performance gain. \n",
"\n",
"### Algorithms\n",
"| Algorithm | Graph | DiGraph |\n",
@@ -125,10 +125,10 @@
"source": [
"# Test File\n",
"data = {\n",
- " 'preferentialAttachment' : './data/preferentialAttachment.mtx'\n",
- "# 'dblp' : './data/dblp.mtx',\n",
- "# 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n",
- "# 'as-Skitter' : './data/as-Skitter.mtx'\n",
+ " 'preferentialAttachment' : './data/preferentialAttachment.mtx',\n",
+ " 'dblp' : './data/dblp-2010.mtx',\n",
+ " 'coPapersCiteseer' : './data/coPapersCiteseer.mtx',\n",
+ " 'as-Skitter' : './data/as-Skitter.mtx'\n",
"}"
]
},
@@ -536,7 +536,7 @@
" # Louvain\n",
" print(\"\\tLouvain\")\n",
" tx = nx_louvain(pdf)\n",
- " tc = cu_lovain(gdf)\n",
+ " tc = cu_louvain(gdf)\n",
"\n",
" time_algo_nx[i].append(tx)\n",
" time_algo_cu[i].append(tc)\n",
@@ -565,7 +565,8 @@
"source": [
"#Print results\n",
"for i in range(num_datasets):\n",
- " perf[i]"
+ " print(f\"{names[i]}\")\n",
+ " print(f\"{perf[i]}\")"
]
},
{
@@ -588,6 +589,19 @@
"metadata": {},
"outputs": [],
"source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "___\n",
+ "Copyright (c) 2020, NVIDIA CORPORATION.\n",
+ "\n",
+ "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0\n",
+ "\n",
+ "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n",
+ "___"
+ ]
}
],
"metadata": {
From 2b24c1eebec99a2a1f94e63e2a1dca0b61dcee63 Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Thu, 20 Aug 2020 09:16:46 -0400
Subject: [PATCH 5/7] ChangeLog for PR
---
CHANGELOG.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fdc160667f4..3be84a6e784 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,7 +15,8 @@
- PR #1010 MG BFS (dask)
- PR #1018 MG personalized pagerank
- PR #1047 Updated select tests to use new dataset list that includes asymmetric directed graph
-
+- PR #1093 New benchmarking notebook
+
## Improvements
- PR #898 Add Edge Betweenness Centrality, and endpoints to BC
- PR #913 Eliminate `rmm.device_array` usage
From c1be57546352792ffddfe1a5f5da72e3f0e23042 Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Thu, 20 Aug 2020 10:37:11 -0400
Subject: [PATCH 6/7] fix issues found in PR
---
notebooks/cugraph_benchmarks/release.ipynb | 54 +++++-----------------
1 file changed, 11 insertions(+), 43 deletions(-)
diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb
index bb1a373b672..c5360ff2617 100644
--- a/notebooks/cugraph_benchmarks/release.ipynb
+++ b/notebooks/cugraph_benchmarks/release.ipynb
@@ -137,7 +137,7 @@
"metadata": {},
"source": [
"### Read data\n",
- "The data is read in once once and used for both cuGraph and NetworkX."
+ "The data is read in once and used for both cuGraph and NetworkX."
]
},
{
@@ -162,7 +162,10 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Create Graph functions"
+ "## Create Graph functions\n",
+ "There are two types of graphs created:\n",
+ "Directed Graphs - calls to create_xx_digraph\n",
+ "Undirected Graphs - calls to create_xx_ugraph <- fully syemmeterized "
]
},
{
@@ -172,7 +175,7 @@
"outputs": [],
"source": [
"# NetworkX\n",
- "def create_nx_graph(_df):\n",
+ "def create_nx_digraph(_df):\n",
" _gnx = nx.from_pandas_edgelist(_df, source='src', target='dst', edge_attr=None, create_using=nx.DiGraph)\n",
" return _gnx\n",
"\n",
@@ -182,16 +185,14 @@
"\n",
"\n",
"# cuGraph\n",
- "def create_cu_graph(_df):\n",
+ "def create_cu_digraph(_df):\n",
" _g = cugraph.DiGraph()\n",
" _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n",
- " _ = _g.view_adj_list()\n",
" return _g\n",
"\n",
"def create_cu_ugraph(_df):\n",
" _g = cugraph.Graph()\n",
" _g.from_cudf_edgelist(_df, source='src', destination='dst', renumber=False)\n",
- " _ = _g.view_adj_list()\n",
" return _g"
]
},
@@ -266,7 +267,7 @@
"source": [
"def nx_pagerank(_df):\n",
" t1 = time.time()\n",
- " _G = create_nx_graph(_df)\n",
+ " _G = create_nx_digraph(_df)\n",
" _ = nx.pagerank(_G)\n",
" t2 = time.time() - t1\n",
" return t2\n",
@@ -294,7 +295,7 @@
"source": [
"def nx_wcc(_df):\n",
" t1 = time.time()\n",
- " _G = create_nx_graph(_df)\n",
+ " _G = create_nx_digraph(_df)\n",
" _ = nx.weakly_connected_components(_G)\n",
" t2 = time.time() - t1\n",
" return t2\n",
@@ -401,13 +402,6 @@
" return t2"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -432,6 +426,7 @@
"outputs": [],
"source": [
"# do a simple pass just to get all the libraries initiallized\n",
+ "# This cell might not be needed\n",
"v = './data/preferentialAttachment.mtx'\n",
"gdf = read_data(v)\n",
"print(f\"\\tGDF Size {len(gdf)}\")\n",
@@ -441,18 +436,12 @@
"print(f\"\\tcugraph Size {g.number_of_edges()}\")\n",
"print(f\"\\tcugraph Order {g.number_of_vertices()}\")\n",
"\n",
+ "# clean up what we just created\n",
"del gdf\n",
"del g\n",
"gc.collect()"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
{
"cell_type": "code",
"execution_count": null,
@@ -569,27 +558,6 @@
" print(f\"{perf[i]}\")"
]
},
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
{
"cell_type": "markdown",
"metadata": {},
From f5f49e2e234a5ecf02ba6e992f32e20eebfed856 Mon Sep 17 00:00:00 2001
From: BradReesWork
Date: Thu, 20 Aug 2020 10:52:17 -0400
Subject: [PATCH 7/7] more PR fixes
---
notebooks/cugraph_benchmarks/release.ipynb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/notebooks/cugraph_benchmarks/release.ipynb b/notebooks/cugraph_benchmarks/release.ipynb
index c5360ff2617..ff5ed5abf9f 100644
--- a/notebooks/cugraph_benchmarks/release.ipynb
+++ b/notebooks/cugraph_benchmarks/release.ipynb
@@ -7,7 +7,7 @@
"# Release Benchmarking\n",
"\n",
"With every release, RAPIDS publishes a release slide deck that includes the current performance state of cuGraph. \n",
- "This notebook, starting with release 0.15, run all the various algorithms to compuite the performance gain. \n",
+ "This notebook, starting with release 0.15, runs all the various algorithms to computes the performance gain. \n",
"\n",
"### Algorithms\n",
"| Algorithm | Graph | DiGraph |\n",