• Stars
    star
    629
  • Rank 68,691 (Top 2 %)
  • Language
    Go
  • License
    MIT License
  • Created over 5 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

onnx-go gives the ability to import a pre-trained neural network within Go without being linked to a framework or library.

ONNX Logo Go Logo

Mentioned in Awesome Go GoDoc Go Report Card Build Status CodeCov

This is a Go Interface to Open Neural Network Exchange (ONNX).

Overview

onnx-go contains primitives to decode a onnx binary model into a computation backend, and use it like any other library in your go code. for more information about onnx, please visit onnx.ai.

The implementation of the the spec of ONNX is partial on the import, and non-existent for the export.

Vision statement

For the Go developer who needs to add a machine learning capability to his/her code, onnx-go is a package that facilitates the use of neural network models (software 2.0) and unlike any other computation library, this package does not require special skills in data-science.

Warning The API is experimental and may change.

Disclaimer

This is a new version of the API.
The tweaked version of Gorgonia have been removed. It is now compatible with the master branch of Gorgonia.
Some operators are not yet available though.

A utility has been added in order to run models from the zoo.
check the `examples` subdirectory.

Install

Install it via go get

go get github.com/owulveryck/onnx-go

onnx-go is compatible with go modules.

Example

Those examples assumes that you have a pre-trained model.onnx file available. You can download pre-trained modles from the onnx model zoo.

Very simple example

This example does nothing but decoding the graph into a simple backend. Then you can do whatever you want with the generated graph.

// Create a backend receiver
	backend := simple.NewSimpleGraph()
	// Create a model and set the execution backend
	model := onnx.NewModel(backend)

	// read the onnx model
	b, _ := ioutil.ReadFile("model.onnx")
	// Decode it into the model
	err := model.UnmarshalBinary(b)

Simple example to run a pre-trained model

This example uses Gorgonia as a backend.

import "github.com/owulveryck/onnx-go/backend/x/gorgonnx"

At the present time, Gorgonia does not implement all the operators of ONNX. Therefore, most of the model from the model zoo will not work. Things will go better little by little by adding more operators to the backend.

You can find a list of tested examples and a coverage here.

func Example_gorgonia() {
	// Create a backend receiver
	backend := gorgonnx.NewGraph()
	// Create a model and set the execution backend
	model := onnx.NewModel(backend)

	// read the onnx model
	b, _ := ioutil.ReadFile("model.onnx")
	// Decode it into the model
	err := model.UnmarshalBinary(b)
	if err != nil {
		log.Fatal(err)
	}
	// Set the first input, the number depends of the model
	model.SetInput(0, input)
	err = backend.Run()
	if err != nil {
		log.Fatal(err)
	}
	// Check error
	output, _ := model.GetOutputTensors()
	// write the first output to stdout
	fmt.Println(output[0])
}

Model zoo

In the examples subdirectory, you will find a utility to run a model from the zoo, as well as a sample utility to analyze a picture with Tiny YOLO v2

Internal

ONNX protobuf definition

The protobuf definition of onnx has is compiled into Go with the classic protoc tool. The definition can be found in the internal directory. The definition is not exposed to avoid external dependencies to this repo. Indeed, the pb code can change to use a more efficient compiler such as gogo protobuf and this change should be transparent to the user of this package.

Execution backend

In order to execute the neural network, you need a backend able to execute a computation graph (for more information on computation graphs, please read this blog post

This picture represents the mechanism:

Schema

onnx-go do not provide any executable backend, but for a reference, a simple backend that builds an information graph is provided as an example (see the simple subpackage). Gorgonia is the main target backend of ONNX-Go.

Backend implementation

a backend is basically a Weighted directed graph that can apply on Operation on its nodes. It should fulfill this interface:

type Backend interface {
	OperationCarrier
	graph.DirectedWeightedBuilder
}
type OperationCarrier interface {
	// ApplyOperation on the graph nodes
	// graph.Node is an array because it allows to handle multiple output
	// for example a split operation returns n nodes...
	ApplyOperation(Operation, ...graph.Node) error
}

An Operation is represented by its name and a map of attributes. For example the Convolution operator as described in the spec of onnx will be represented like this:

convOperator := Operation{
		Name: "Conv",
		Attributes: map[string]interface{}{
			"auto_pad":  "NOTSET",
			"dilations": []int64{1, 1},
			"group":     1,
			"pads":      []int64{1, 1},
			"strides":   []int64{1, 1},
		},
	}

Besides, operators, a node can carry a value. Values are described as tensor.Tensor To carry data, a Node of the graph should fulfill this interface:

type DataCarrier interface {
	SetTensor(t tensor.Tensor) error
	GetTensor() tensor.Tensor
}

Backend testing

onnx-go provides a some utilities to test a backend. Visit the testbackend package for more info.

Contributing

Contributions are welcome. A contribution guide will be eventually written. Meanwhile, you can raise an issue or send a PR. You can also contact me via Twitter or on the gophers' slack (I am @owulveryck on both)

This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

Author

Olivier Wulveryck

License

MIT.

More Repositories

1

goMarkableStream

A utility to stream (and record) from a Remarkable2 without hack or third party dependencies
Go
514
star
2

lstm

LSTM based on go and gorgonia
Go
60
star
3

rePocketable

Tool to fetch articles from (getPocket|the web) and turn them into epub
Go
53
star
4

wardleyToGo

Create your WardleyMaps as code/data and render it as SVG (onlinewardleymap and wtg language supported)
Go
44
star
5

cue4puml4c4

POC to turn cue into a plantuml/C4 diagram
CUE
17
star
6

gofaces

A sample project to run a tiny yolo v2 with face detection in Go
Go
12
star
7

gorchestrator

Orchestrator as a Service - A RESTful Concurrent orchestrator in GO
JavaScript
12
star
8

cortical

The browser sends events through websockets, Cortical dispatch them to processing unit, concurently
Go
11
star
9

toscalib

A go implementation of the TOSCA Standard from OASIS (YAML version)
Go
10
star
10

gohaystack

a library to play with Haystack Project in Go
Go
9
star
11

gorgonnx

Onnx To Gorgonia Unmarshaler (Test)
Go
8
star
12

toscaviewer

A graphical representation of a topology described in TOSCA
Go
7
star
13

wardleynotes

Asciidoc version of twitter threads from Simon Wardley
HTML
6
star
14

rnnttt

RNN for Tic-Tac-Toe (POC for a demo)
Go
6
star
15

rdf2graph

Sample code to play with turtle files and create a graph based representation
Go
5
star
16

cli-grpc-example

Very simple example on how to turn a golang cli tool into a grpc powered microservice
Go
5
star
17

smarcctv

What may become a smart CCTV pluged with tensorflow
Go
4
star
18

min-char-rnn

Go
4
star
19

linestogo

Tiny lib to manipulate the .line format (.rm in the reMarkable2) in Go
Go
3
star
20

khappygo

This repository contains the support of a talk about ML in production (knative, ONNX, and Go)
Go
3
star
21

present

A tweaked version of the go present tool
Go
3
star
22

graphql-test

A graphql test in go
CSS
3
star
23

blasgl

very experimental package to implement BLAS interface for WASM with WebGL
Go
2
star
24

gowmb

A (very) simple message broker over websockets in go
Go
2
star
25

owulveryck

Front page
LilyPond
1
star
26

cuedley

One more experiment with CUE to eventually express Wardley Map as Data
CUE
1
star
27

overlay-macbook-touchbar

Attempt to build ChromiumOS for a Macbook 2017 with touchbar
Shell
1
star
28

owulveryck.github.io

HTML
1
star
29

dotfiles

my configuration files
Lua
1
star
30

ironnx

Go
1
star
31

digraph

A fork of the digraph command to take a TOSCA yaml file as input
Go
1
star
32

action-owm2svg

Github Action to create SVG representation of the Wardley map in the OWM format
JavaScript
1
star