sigma.js icon indicating copy to clipboard operation
sigma.js copied to clipboard

Create a GPU accelerated `examples/extra-large-graphs`

Open thomcom opened this issue 3 years ago • 7 comments

Hi @jacomyal ! I've been working on an NVIDIA backed sigma.js extension for a few weeks and I'm sharing it with you today. We're writing GPU accelerated, open-source libraries for data visualization, among other things, and wanted to try to integrate with sigma.js. It's lead me to have plenty of ideas for optimizing the sigma.js process/render pipeline, if you're interested. Hopefully you like my contribution! Below is the README.md for this contribution.

Extra Large Graphs Demo with @rapidsai/node GPU acceleration

RAPIDS.ai is an open source GPU-acceleration project. We're building new tools with familiar APIs and extending existing tools to that more scientists and users can take advantage of GPU performance.

This project creates a RapidsGraphologyGraph subclass of Graph, plus a modified index.ts to make GPU-stored graph vertices and edges available to your browser session. It talks to the @rapidai/demo-api-server that has been built using node-rapids.

Performance

Using a GPU for graph rendering offers substantial performance increases. In this demo, I've included screenshots of performance comparison's between using our GPU-backed RapidsGraphologyGraph and the original renderer included in the large-graphs demo.

When the complexity of the graph matches the original demo, performance is comparable:

original size of graph

When the complexity increases substantially, the GPU performance improvement is marked:

size increased by 100x

It is important to note in the larger case that the "I/O" benchmark for the original large-graphs demo includes the graph generation time, which is substantial. However, were the file stored in a 500MB .json (as in the GPU case) and parsed in-browser, execution time is similar or longer.

What Is Happening

In order to run this demo, you need the @rapidsai/demo npm package, a system with an NVIDIA GPU from around 2018 forward (Turing architecture and up), and have previously installed the [CUDA Toolkit] (https://developer.nvidia.com/cuda-toolkit).

The node-rapids workspace demo-api-server is available as a backend to any HTTP client. At this time only limited functionality is available to parse JSON files in the graphology graph dataset format, plus API requests to request Dataframes and their Columns via apache-arrow.

Two endpoints, graphology/nodes and graphology/edges specifically return pre-formatted arrays that can be used directly with the sigma.js renderer.

Additional Dependencies

  • @rapidsai/demo-api-server
  • apache-arrow

To run the demo

Due to native dependency distribution complexity, pre-packaged builds of the node-rapids modules are presently only available via our public docker images. See USAGE.md for more details.

Run @rapidsai/demo-api-server via docker:

REPO=ghcr.io/rapidsai/node
VERSIONS="22.02.00-runtime-node18.2.0-cuda11.6.2-ubuntu20.04"

# Be sure to pass either the `--runtime=nvidia` or `--gpus` flag!
docker run --rm \
    --runtime=nvidia \
    -e "DISPLAY=$DISPLAY" \
    -v "/etc/fonts:/etc/fonts:ro" \
    -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    -v "/usr/share/fonts:/usr/share/fonts:ro" \
    -v "/usr/share/icons:/usr/share/icons:ro" \
    $REPO:$VERSIONS-demo \
    npx @rapidsai/demo-api-server

We expect to have full npm support soon.

Next generate a graph of your liking, or provide another:

cd $SIGMAJSHOME/examples/extra-large-graphs
node generate-graph.js 10000 20000 3 graphology.json
cp graphology.json $DOCKERROOT/node/modules/demo/api-server/public

Finally run the extra-large-graphs demo in the normal fashion:

cd $SIGMAJSROOT/examples
npm start --example=extra-large-graphs

Dataset

Run the graph generator at https://github.com/thomcom/sigma.js/blob/add-gpu-graph-to-example/examples/extra-large-graphs/generate-graph.js to create a very large graph using the command:

node graph-generator.js 1000000 2000000 3 graphology.json

Any dataset that matches the schema of graphology.json is supported.

This closes #1258

thomcom avatar Jun 03 '22 18:06 thomcom

Spending some time cleaning up "my end" of this at github.com/rapidsai/node before I clean this one up. I hope to be done here by end of Friday.

thomcom avatar Jun 14 '22 19:06 thomcom

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Aug 08 '22 18:08 stale[bot]

Pinging this one, any interest?

thomcom avatar Aug 09 '22 19:08 thomcom

Hey @tonyz0x0 or @lf- what do you think?

thomcom avatar Aug 30 '22 17:08 thomcom

Hello @thomcom, this looks interesting but I don't have any NVIDIA gpu to test your PR on unfortunately.

What I understand from this is there is basically two things to make this work? 1. A gpu-backed implementation of graphology's interface (at least the subset necessary to sigma, by cleverly repurposing forEach methods etc.) and 2. programs that are the same as ours but that don't need byte array processing since the backing buffers are already encapsulated into the make-believe graphology instance.

This is quite clever and seems to work nicely indeed. The fact is it can very well work from userland also so the question on our side is probably to decide whether we want to merge your example (which cannot work without proper hardware, as I understand?) or if we can just point to your code somewhere in our docs, no?

What do you think @jacomyal ?

Yomguithereal avatar Oct 20 '22 09:10 Yomguithereal

Hey @Yomguithereal, thanks for your consideration! Your analysis is essentially correct. The GPU is able to read graphology data files and pack them into the serialized backing buffers that sigma.js displays.

It is true that you can't run the demo without the proper hardware - but that raises another interesting question. The GPU in this situation is accessed through a web server. I'll talk to some people internally and see if we can put the server that this demo depends on somewhere public for you to play with or at least see the demo work!

We love sigma.js here and would love to get this connected with your work one way or another. :)

thomcom avatar Oct 21 '22 20:10 thomcom

Thanks for the answer @thomcom, I think we'll link to your resources then when we find time to release the next version of the lib (which should be sooner than later now :) ).

Yomguithereal avatar Oct 24 '22 11:10 Yomguithereal