0.0.0 • Published 1 year ago

cuno v0.0.0

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

Cuno | Dannjs Cuda Addon

A node addon for Dannjs.

Provides cuda bindings, kernel maps and device memory managment for Dannjs computations.

The goal is to speed up Dann.prototype.backpropagate by implementing a batch system (Instead of training case by case, we would train a whole dataset batch at once). The current alias Dann.prototype.train would also take in a different set of arguments, for batch/gpu training

A Cuda kernel map would compute all model changes throughout the batch. This is to reduce Memcpy's in the device's memory, thus help reduce training times along with the cuda parallelisation.

Install

git clone https://github.com/matiasvlevi/Cuno.git

cd Cuno
git checkout dev

npm run init

Build

The build configuration may not be supported on your system, please submit binding.gyp changes to allow for a broader range of systems

Build CUDA source with node-gyp (nvcc)

npm run build

Build the Dannjs Source

cd Dann
npm run build:fix

(optional) run Dannjs unit tests

cd Dann
npm run test

Run/Test

Run Javascript tests

benchmark will create a benchmark.csv file containing performance results.

npm run benchmark
npm run test

Performance

Here is a logarithmic graph comparing matrix dot products with the Cuno Addon and with native JS

Image


Current APIs

These are the current stable bindings, not the final target bindings

Nodejs API

const Cuno = require('cuno');

const a = [
  [1, 3, 1],
  [2, 4, 6],
  [4, 1, 2],
  [3, 2, 4]
];

const b = [
  [3, 2, 1, 3],
  [5, 1, 1, 4],
  [4, 9, 1, 2]
];

let c = Cuno.dot(a, b);
console.log(c);

CPP API

Allocate & Initialize a neural network

const int LENGTH = 5
const int ARCH[LENGTH] = { 
  32 * 32 * 3,
  32 * 32,
  24 * 24,
  16 * 16,
  10
};

// Allocate Model
Cuno::DeviceDann<double> *nn = new Cuno::DeviceDann(ARCH, LENGTH);

// Memory transfer
nn->toDevice(
  // * weights, biases, layers, errors, gradients  * //
);

// Feed Forward 
double inputs[ARCH[0]] = {};
Cuno::Wrappers::ffw(nn, inputs);
0.0.0

1 year ago

1.0.0

1 year ago