Skip to content

About

Classical Algorithms like Linear Regression, Deep Learning Algorithms like Neural Networks, GNNs, etc. from scratch in Python and C++.

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

GNNs-From-Scratch

Graph Neural Networks and Machine Learning Algorithms implemented from scratch in CUDA

This repository showcases advanced implementations of classical Machine Learning algorithms, Neural Networks, and Graph Neural Networks built entirely from scratch using CUDA for GPU acceleration. The CUDA and C++ implementations demonstrate real-world high-performance computing applications, while Python serves as a reference implementation for understanding the underlying mathematics and logic.

Read this to learn more about this project : https://medium.com/@nehalsinghal77/learning-gnns-05dab59fccc3

Project Status : Completed.

Project Goals

  • Primary Focus: Master GPU programming with CUDA for ML acceleration
  • Performance: Achieve significant speedup over CPU implementations locally
  • Learning: Build production-ready ML algorithms from first principles
  • Implementation: Provide from-scratch implementations that can be used as a reference or integrated into projects
  • Learning: Master C++ and CUDA programming for high-performance computing
  • Learning: Understand Graph Neural Networks and their GPU implementation strategies
  • Learning: Gain expertise in GPU programming and optimization techniques

Architecture

CUDA

GPU-accelerated implementations optimized for real-world applications:

CUDA/
├── NeuralNetwork.cu        # Multi-layer neural networks with backpropagation
├── NeuralNetwork.h         # Header with activation functions (ReLU, Sigmoid, Tanh, Softmax)
├── GNN.cu                  # Graph Neural Networks with message passing
├── GNN.h                   # Graph convolution and aggregation algorithms
├── LinearRegression.cu     # Gradient descent optimization on GPU
├── LinearRegression.h      # Minimal dependencies, maximum performance
└── gnn_demo.cu               # Graph learning demonstration
├── Common/
│   ├── MatrixOps.cu         # Core matrix operations (GEMM, transposition, reductions)
│   ├── MatrixOps.h          # High-performance linear algebra kernels
│   ├── Utils.cu             # CUDA debugging, profiling, and validation utilities
│   └── Utils.h              # Helper functions for data generation and evaluation

Python (Now installable as gnns_ml package)

Educational and practical implementations that can be imported as a library:

gnns_ml/
├── __init__.py              # Package initialization and exports
├── LinearRegression.py      # Clean gradient descent implementation
├── NeuralNetwork.py         # Multi-layer perceptron with backprop
├── GraphAlgorithms.py       # Classic graph algorithms (Dijkstra, Kruskal, Boruvka)
└── GNN.py                   # Message-passing neural networks

C++

CPU implementations for performance comparison:

C++/
├── LinearRegression.cpp     # Vectorized gradient descent
├── NeuralNetwork.cpp        # Optimized C++ neural networks
├── NeuralNetwork.h         
├── GraphAlgorithms.cpp      # Efficient graph algorithms
└── GraphAlgorithms.h      

Getting Started

Installation

Python Package (Recommended)

Install the library directly from the repository:

# Clone the repository
git clone https://github.com/Nehal70/GNNs-From-Scratch.git
cd GNNs-From-Scratch

# Install the package
pip install .

# Or install in development mode
pip install -e .

Once installed, use in your projects:

from gnns_ml import GNN, NeuralNetwork, LinearRegression

# See examples/basic_usage_example.py for complete usage examples

C++/CUDA Library

For C++ or CUDA usage:

# Build the library using CMake
mkdir build && cd build
cmake ..
make

# Install the library
sudo make install

# Or just build without installing
make

Then use in your C++ projects:

#include <gnns_ml/GNN.h>  // C++ version
#include <gnns_ml/NeuralNetwork.h>

using namespace CPP_ML;

GNN gnn(4, {32, 16}, 3, "classification", 0.01f);
gnn.train(node_features, adjacency_matrix, labels);

Or for CUDA projects:

#include <gnns_ml/GNN.h>  // CUDA version
#include <gnns_ml/NeuralNetwork.h>

using namespace CUDA_ML;

GNN gnn(4, {32, 16}, 3, "classification", 0.01f);
gnn.train(node_features, adjacency_matrix, labels);

Prerequisites

# CUDA Toolkit (12.0+ recommended) - for CUDA builds
https://developer.nvidia.com/cuda-toolkit

# Build tools (for C++/CUDA builds)
sudo apt install build-essential cmake

# Python dependencies
pip install numpy pandas

Compilation (Original Makefile)

For CUDA-specific compilation:

cd CUDA
make clean && make all

# Run specific examples
make run-linear     # Linear regression demo
make run-neural     # Neural network demo  
make run-gnn        # GNN demo
make run-all        # All demos

Example Code

Python:

cd examples
py basic_usage_example.py

C++:

# Build and run C++ library example
cd build
make cpp_library_example
./bin/cpp_library_example

See examples/ directory for all usage examples.

Google Colab Setup

# Complete setup for Google Colab GPU
!git clone https://github.com/yourusername/GNNs-From-Scratch.git
%cd GNNs-From-Scratch/CUDA

# Install build tools
!apt-get update -qq && apt-get install -y build-essential -qq

# Update Makefile for Colab GPU (T4 uses sm_75)
!sed -i 's/-arch=sm_50/-arch=sm_75/g' Makefile

# Compile and run
!make clean && make all
!./gnn_demo

Key Features

Neural Networks

  • GPU Acceleration: Faster than CPU implementations
  • Multiple Activations: ReLU, Sigmoid, Tanh, Leaky ReLU, Softmax
  • Advanced Training: Backpropagation with momentum and regularization
  • Batch Processing: Efficient parallel computation across samples

Graph Neural Networks

  • Node-Based Tasks: Classification, Regression, Property Prediction
  • Message Passing: Sophisticated neighbor aggregation strategies
  • Graph Convolution: Custom kernels for graph convolutional layers
  • GPU Acceleration: 20-50x faster than CPU implementations
  • Scalable: Handle large graphs with millions of nodes
  • Memory Efficient: Optimized GPU memory management
  • Task-Specific: Different activations and loss functions per task type

Linear Regression

  • Gradient Descent: CUDA-accelerated optimization
  • Mini-batching: Parallel gradient computation
  • Real-time: Sub-millisecond prediction times

Performance Benchmarks

Note: These are estimated performance improvements based on typical optimization characteristics. Actual benchmarks may vary by hardware.

Algorithm Python (CPU) C++ (CPU) CUDA (GPU) Speedup
Neural Network Training ~15.0s ~4.5s ~0.3s ~50x
Graph Convolution (100 nodes) ~1.2s ~0.6s ~0.03s ~40x
Linear Regression (100K samples) ~0.8s ~0.35s ~0.02s ~40x
GNN Node Classification ~3.5s ~1.2s ~0.15s ~23x
Matrix Multiplication (512x512) ~0.05s ~0.02s ~0.001s ~50x

Typical Speedup Factors:

  • C++ vs Python: 2-5x (due to compiled code vs interpreted, with NumPy being highly optimized)
  • CUDA vs Python: 20-50x (depending on parallelizability and workload size)
  • CUDA vs C++: 5-15x (GPU parallelism advantage over CPU)

GNN Task Types

Node Classification

  • Purpose: Classify nodes into discrete categories
  • Example: Social media user classification (influencer, regular, bot)
  • Output: Softmax probabilities over classes
  • Loss: Cross-entropy loss
  • Use Case: Fraud detection, user profiling, content moderation

Node Regression

  • Purpose: Predict continuous values for nodes
  • Example: Recommendation system rating prediction
  • Output: Linear activation (unbounded)
  • Loss: Mean squared error
  • Use Case: Price prediction, popularity scoring, influence estimation

Property Prediction

  • Purpose: Predict binary node attributes
  • Example: Missing node property inference
  • Output: Sigmoid activation (0-1 bounded)
  • Loss: Binary cross-entropy
  • Use Case: Link prediction, anomaly detection, feature completion

Learning Path

  1. Start with Python → Revise mathematical concepts, learn GNNs
  2. Study C++ implementations → Learn CPU optimization techniques and C++
  3. Dive into CUDA → Learn GPU programming, CUDA and parallel algorithms
  4. Experiment → Modify parameters, architectures, and optimization strategies. Test on Google Collab GPUs.
  5. Benchmark → Compare performance across different implementations

Future Roadmap

FPGA Implementation via High-Level Synthesis

This project serves as a foundation for understanding how machine learning algorithms map to hardware implementations through the High-Level Synthesis (HLS) pipelines and understanding why different hardware is optimal for different models.

  • FPGA Implementation: SystemVerilog/VHDL ports for ultra-low latency inference
  • HLS Pipeline Understanding: Exploring the C++ to Verilog/VHDL translation process for FPGA deployment
  • RTL Understanding: Deep dive into how ML algorithms map to Register Transfer Level representations
  • Custom ML Accelerators: FPGA-based implementations of Machine Learning Algorithms.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Classical Algorithms like Linear Regression, Deep Learning Algorithms like Neural Networks, GNNs, etc. from scratch in Python and C++.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages