Home

Awesome

menoh

NodeJS binding for Menoh DNN inference library.

Features

Requirements

Supported OS

Installation

Add menoh npm module to your project dependencies (package.json):

npm install menoh -S

Installing dependencies

Mac & Linux

Simply follow the instruction described here.

For linux, you may need to add /usr/local/lib to LD_LIBRARY_PATH depending on your linux distrubtion.

export LD_LIBRARY_PATH=/usr/local/lib

Or, you could add /usr/local/lib to system library path.

Windows

menoh import library and dll

You can download pre-build DLLs from here. The import library (menoh.lib) and its header files are bundled in this module and built during its installation.

Current version uses the import library built with native menoh v1.1.1.

Copy menoh.dll found in the pre-build package to C:Windows\System32\.

MKL-DNN

Follow this instruction to install MKL-DNN lbrary and its dependencies. You may optionally download prebuild pacakge from here.

The mklml.dll (included in the pre-built package for the native menoh v1.1.1) depends on msvcr120.dll. If your system does not have it, install Visual C++ 2013 Redistibutable Package.

Run examples

Checkout the repository, cd into the root folder, then:

npm install

VGG16 examples

cd example
sh retrieve_vgg16_data.sh

Then, run the VGG16 example.

node example_vgg16.js

You should see something similar to following:

### Result for ../test/data/Light_sussex_hen.jpg
fc6 out: -29.68303871154785 -52.6440544128418 0.9215406179428101 21.43817710876465 -6.305706977844238 ...
Top 5 categories are:
[8] 0.8902806639671326 n01514859 hen
[86] 0.037541598081588745 n01807496 partridge
[7] 0.03157550096511841 n01514668 cock
[82] 0.017570357769727707 n01797886 ruffed grouse, partridge, Bonasa umbellus
[83] 0.002043411135673523 n01798484 prairie chicken, prairie grouse, prairie fowl
### Result for ../test/data/honda_nsx.jpg
fc6 out: 14.704771041870117 -10.323609352111816 -32.17032241821289 -9.661919593811035 -14.448777198791504 ...
Top 5 categories are:
[751] 0.6547003388404846 n04037443 racer, race car, racing car
[817] 0.28364330530166626 n04285008 sports car, sport car
[573] 0.02763519063591957 n03444034 go-kart
[511] 0.01738707721233368 n03100240 convertible
[814] 0.004731603432446718 n04273569 speedboat

MNIST examples

In the example folder...

$ node example_mnist.js
### Result for ../test/data/mnist/0.png
[0] 9792.962890625 Zero
### Result for ../test/data/mnist/1.png
[1] 4203.07470703125 One
### Result for ../test/data/mnist/2.png
[2] 7281.75341796875 Two
### Result for ../test/data/mnist/3.png
[3] 7360.65625 Three
### Result for ../test/data/mnist/4.png
[4] 3837.8447265625 Four
### Result for ../test/data/mnist/5.png
[5] 5259.931640625 Five
### Result for ../test/data/mnist/6.png
[6] 3743.64306640625 Six
### Result for ../test/data/mnist/7.png
[7] 4321.0859375 Seven
### Result for ../test/data/mnist/8.png
[8] 3331.339111328125 Eight
### Result for ../test/data/mnist/9.png
[9] 1424.4774169921875 Nine

Read the comments in the examples for more details.

API

const menoh = require('menoh');

Module methods

menoh.getNativeVersion() => {string}

Returns the version of underlying native menoh (core) library.

menoh.create(onnx_file_path{string}, [cb]) => {Promise}

Returns promise if cb is not provided. The promise resolves to a new instance of ModelBuilder.

ModelBuilder methods

builder.addInput(input_var_name{string}, dims{array}) => {void}

Add an input profile for the given name.

Data type is implicitly set to float32.

builder.addOutput(output_var_name{string}) => {void}

Add an output profile for the given name.

It currently takes no argument other than the name. Data type is implicitly set to float32.

builder.buildModel(config{object}) => {Model}

Returns an executable model. The config object can have two properties:

You may build more than one model from the same builder.

Model methods

model.getProfile(var_name{string}) => {object}

Returns a profile information for the given name. The returned object has following properties:

Current revision supports only one data type, "float32".

model.run(cb) => {Promise}

Run inference. It returns promise if cb is not provided. The actual inference takes place in a background worker thread. You may run a different models concurrently to take advantage of available CPU cores.

model.setInputData(input_var_name{string}, data{array})

DEPREACATED. Use model.getProfile() instead.

Sets input data for the give input name.

model.getOutput(output_var_name) => {object}

DEPREACATED. Use model.getProfile() instead.

Returns output object generated during model.run() for the given output name. The output object has following properties:

Limitations