gomlx

module
v0.9.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 20, 2024 License: Apache-2.0

README

GoMLX, an Accelerated ML and Math Framework (PyTorch/Jax/Tensorflow-like for Go)

GoDev GitHub Go Report Card TestStatus Coverage

GoMLX Gopher

GoMLX is a fast and easy-to-use set of Machine Learning and generic math libraries and tools. It can be seen as a TensorFlow/Jax/PyTorch for Go.

It uses just-in-time compilation to CPU and GPU (hopefully soon TPUs also) and is built on top of OpenXLA, wich itself uses LLVM to JIT-compile code. It's the same engine that powers Google's Jax and TensorFlow, and it has the same speed in many cases.

Quick Start: see our tutorial, or a guided example for Kaggle Dogs Vs Cats.

It was developed to be full-featured ML platform for Go, and to easily experiment with ML ideas -- see Long-Term Goals below.

It strives to be simple to read and reason about, leading the user to a correct and transparent mental model of what is going on (no surprises) -- aligned with Go philosophy. At the cost of more typing (more verbose) at times.

It is also incredibly flexible, and easy to extend and try non-conventional things: use it to experiment with new optimizer ideas, complex regularizers, funky multi-tasking, etc.

Documentation is kept up-to-date (if it is not well documented, it is as if the code is not there) and error messages are useful and try to make it easy to solve issues.

GoMLX is still under development, and should be considered experimental.

Overview

GoMLX has many important components of an ML framework in place, from the bottom to the top of the stack. But it is still only a slice of what a major ML library/framework should provide (like TensorFlow, Jax or PyTorch).

It includes:

  • Examples: Synthetic linear model; Adult/Census model; Cifar-10 demo; Dogs & Cats classifier demo; IMDB Movie Review demo; Diffusion model for Oxford Flowers 102 dataset (generates random flowers); GNN model for OGBN-MAG.
  • Pre-Trained models to use: InceptionV3 (image model) -- more to come.
  • Docker with integrated JupyterLab and GoNB (a Go kernel)
  • Just-In-Time (JIT) compilation using OpenXLA] for CPUs and GPUs -- hopefully soon TPUs.
  • Autograd: automatic differentiation -- only gradients for now, no jacobian.
  • Context: automatic variable management for ML models.
  • ML layers library with some of the most popular machine learning "layers": dense (simple FFN layer),
    activation functions, Layer Normalization, Batch Normalization, Convolutions, Pooling, Dropout, Multi-Head-Attention (for transformer layers), PiecewiseLinear (for calibration and normalization).
  • Training library, with some pretty-printing. Including plots for Jupyter notebook, using GoNB, a Go Kernel.
    • Also, various debugging tools: collecting values for particular nodes for plotting, simply logging the value of nodes during training, stack-trace of the code where nodes are created (TODO: automatic printing stack-trace when a first NaN appears during training).
  • SGD and Adam (AdamW and Adamax) optimizers.
  • Various losses and metrics.

Installation

Releases for Linux only, but it's been succesfully compiled in MacOS. It does work well also in WSL (Windows Subsystem for Linux) in Windows or using Docker.

Pre-built Docker

The easiest to start playing with it, it's just pulling the docker image that includes GoMLX + JupyterLab + GoNB (a Go kernel for Jupyter) and Nvidia's CUDA runtime (for optional support of GPU) pre-installed -- it is ~5Gb to download.

From a directory you want to make visible in Jupyter, do:

For GPU support add the flag --gpus all to the docker run command bellow.

docker pull janpfeifer/gomlx_jupyterlab:latest
docker run -it --rm -p 8888:8888 -v "${PWD}":/home/jupyter/work janpfeifer/gomlx_jupyterlab:latest

It will display a URL starting with 127.0.0.1:8888 in the terminal (it will include a secret token needed) that you can open in your browser.

You can open and interact with the tutorial from there, it is included in the docker under the directory Projects/gomlx/examples/tutorial.

More details on the docker here.

Linux

The library depends on the following libraries to compile and run:

  • libunwind8: usually available in most Linux systems.
  • liblzma5: compression library, also usually available.
  • TC Malloc, usually packaged as libgoogle-perftools-dev: fast malloc version, and memory debugging tools. The prebuilt libray shared in the releases gomlx_xla.tar.gz also include a build of libtcmalloc.so, but leaves it in a separate sub-directory under /usr/local/lib/gomlx/ to avoid conflict. Feel free to use it if you want (by copying it to /usr/local/lib or adding the directory to $LD_LIBRARY_PATH).
  • hdf5-tools: access to .h5 file format, used by hold pre-trained weights for some some models.

Typically, this can be installed with:

sudo apt-get install libunwind8 libgoogle-perftools-dev liblzma5 hdf5-tools

Second you need the pre-compiled GoMLX+XLA C library, included in each release. The library is pretty large, ~500Mb (with GPU and TPU, it statically links most of what it needs) -- for Just-In-Time (JIT) compilation it includes the whole LLVM compiler.

Latest version in github.com/gomlx/gomlx/releases/latest/download/gomlx_xla-linux-amd64.tar.gz.

The contents are a libgomlx_xla.so file and a few .h files needed for the compilation of GoMLX. They are separated on two top level directories /lib and /include, and for now the recommended way is to just untar them in /usr/local, which is usually in the default path for inclusion and dynamic library loading. So you can do:

cd /usr/local
tar xzvf .../path/to/gomlx_xla-linux-amd64.tar.gz

This should be enough for most installations. If CGO is not finding the library, you may need to configure some environment variables (LD_LIBRARY_PATH, CGO_CPPFLAGS, CGO_LDFLAGS) to include the corresponding directories under /usr/local (most linux distributions won't need this).

After that, just import it as with any Go library.

More on building the C library, see docs/building.md.

GPU Support (NVidia)

Typically one needs the same NVidia libraries as TensorFlow/Jax. On a fresh 23.04 Ubuntu install, all it took was having the commercial NVidia drivers installed (not the Nouveau drivers), and additionally installing:

apt install nvidia-cudnn

After that, another needed step — some misconfiguration among NVidia's CuDNN library, Ubuntu package maintainer and XLA code, I'm not sure — is to create the following directory and symbolic link:

sudo mkdir /usr/lib/nvidia-cuda-toolkit/nvvm
sudo ln -s /usr/lib/nvidia-cuda-toolkit/libdevice /usr/lib/nvidia-cuda-toolkit/nvvm/

Without this you'll see errors complaining about not finding libdevice.10.bc.

MacOS

See #23: the required C++ library (libgomlx_xla.so) is reported to successfully compile in MacOS. It compiles along Google's libtcmalloc.so, and one just need to move it to a standard library directory. Unfortunately, I don't have a mac to build and include these in the releases.

Tutorial

See the tutorial here. It covers a bit of everything.

After that look at the demos in the examples/ directory.

The library itself is well documented (pls open issues if something is missing), and the code is not too hard to read (except the bindings to C/XLA, which are tricky). Godoc available in pkg.go.dev.

Finally, feel free to ask questions: time allowing (when not in work) I'm always happy to help -- I created groups.google.com/g/gomlx-discuss, or use GitHub discussions page.

Long-term Goals

  1. Building and training models in Go -- as opposed to Python (or some other language) -- with focus on:
    • Being simple to read and reason about, leading the user to a correct and transparent mental model of what is going on. Even if that means being more verbose when writing.
    • Clean, separable APIs: individual APIs should be self-contained and decoupled where possible.
    • Composability: Any component should be replaceable, so they can be customized and experimented. That means sometimes more coding (there is not one magic train object that does everything), but it makes it clear what is happening, and it's easy to replace parts with a third party versions or something custom.
    • Up-to-date documentation: if the documentation is not there or if it's badly written, it's as if the code was not there either.
    • Clear and actionable error reporting
  2. To be a productive research and educational platform to experiment with new ML ideas and learn.
    • Support mirrored training on multiple devices and various forms of distributed training (model and/or data parallelism) in particular to support for large language models and similarly large model training.
  3. To be a robust and reliable platform for production. Some sub-goals:
    • Support modern accelerator hardware like TPUs and GPUs.
    • Save models to industry tools like TensorFlow Serving.
    • Import pre-trained models from Hugging Face Hub and TensorFlow Hub where possible.
    • Compile models to binary as in C-libraries and/or WebAssembly, to be linked and consumed (inference) anywhere (any language).

Collaborating

The project is looking forward contributions for anyone interested. Many parts are not yet set in stone, so there is plenty of space for improvements and re-designs for those interested and with good experience in Go, Machine Learning and APIs in general. See the TODO file for inspiration.

No governance guidelines have been established yet.

Advanced Topics

Directories

Path Synopsis
cmd
constraint_generator
constraint_generator prints out various lists of constraints used by generics, which can then be copy&pasted into the code.
constraint_generator prints out various lists of constraints used by generics, which can then be copy&pasted into the code.
examples
adult
Package adult provides a `InMemoryDataset` implementation for UCI Adult Census dataset.
Package adult provides a `InMemoryDataset` implementation for UCI Adult Census dataset.
adult/demo
Linear generates random synthetic data, based on some linear mode + noise.
Linear generates random synthetic data, based on some linear mode + noise.
cifar
Package cifar provides a library of tools to download and manipulate Cifar-10 dataset.
Package cifar provides a library of tools to download and manipulate Cifar-10 dataset.
cifar/demo
Demo for cifar library: it implements 2 models, a FNN and a CNN.
Demo for cifar library: it implements 2 models, a FNN and a CNN.
dogsvscats/demo
demo for Dogs vs Cats library: you can run this program in 3 different ways:
demo for Dogs vs Cats library: you can run this program in 3 different ways:
imdb
Package imdb contains code to download and prepare datasets with IMDB Dataset of 50k Movie Reviews.
Package imdb contains code to download and prepare datasets with IMDB Dataset of 50k Movie Reviews.
imdb/demo
IMDB Movie Review library (imdb) demo: you can run this program in 4 different ways:
IMDB Movie Review library (imdb) demo: you can run this program in 4 different ways:
linear
Linear generates random synthetic data, based on some linear mode + noise.
Linear generates random synthetic data, based on some linear mode + noise.
notebook
Package notebook allows one to check if running within a notebook.
Package notebook allows one to check if running within a notebook.
notebook/bashkernel
Package bashkernel implements tools to output rich content to a Jupyter notebook running the bash_kernel (https://github.com/takluyver/bash_kernel).
Package bashkernel implements tools to output rich content to a Jupyter notebook running the bash_kernel (https://github.com/takluyver/bash_kernel).
notebook/gonb/margaid
Package margaid implements automatic plotting of all metrics registered in a trainer, using the Margaid library (https://github.com/erkkah/margaid/) to draw SVG, and GoNB (https://github.com/janpfeifer/gonb/) to display it in a Jupyter Notebook.
Package margaid implements automatic plotting of all metrics registered in a trainer, using the Margaid library (https://github.com/erkkah/margaid/) to draw SVG, and GoNB (https://github.com/janpfeifer/gonb/) to display it in a Jupyter Notebook.
notebook/gonb/plotly
Package plotly uses GoNB plotly support (`github.com/janpfeifer/gonb/gonbui/plotly`) to plot both on dynamic plots while training or to quickly plot the results of a previously saved plot results in a checkpoints directory.
Package plotly uses GoNB plotly support (`github.com/janpfeifer/gonb/gonbui/plotly`) to plot both on dynamic plots while training or to quickly plot the results of a previously saved plot results in a checkpoints directory.
notebook/gonb/plots
Package plots define common types and utilities to the different plot libraries.
Package plots define common types and utilities to the different plot libraries.
ogbnmag
Package ogbnmag provides `Download` method for the corresponding dataset, and some dataset tools
Package ogbnmag provides `Download` method for the corresponding dataset, and some dataset tools
ogbnmag/fnn
Package fnn implements a feed-forward neural network for the OGBN-MAG problem.
Package fnn implements a feed-forward neural network for the OGBN-MAG problem.
ogbnmag/gnn
Package gnn implements a generic GNN modeling based on [TF-GNN MtAlbis].
Package gnn implements a generic GNN modeling based on [TF-GNN MtAlbis].
oxfordflowers102
Package oxfordflowers102 provides tools to download and cache the dataset and a `train.Dataset` implementation that can be used to train models using GoMLX (http://github.com/gomlx/gomlx/).
Package oxfordflowers102 provides tools to download and cache the dataset and a `train.Dataset` implementation that can be used to train models using GoMLX (http://github.com/gomlx/gomlx/).
oxfordflowers102/diffusion
Package diffusion contains an example diffusion model, trained on Oxford Flowers 102 dataset.
Package diffusion contains an example diffusion model, trained on Oxford Flowers 102 dataset.
experimental
nest
Package nest implements the Nest generic container, used for generic inputs and outputs in GoMLX.
Package nest implements the Nest generic container, used for generic inputs and outputs in GoMLX.
Package graph is the core package for GoMLX.
Package graph is the core package for GoMLX.
graphtest
Package graphtest holds test utilities for packages that depend on the graph package.
Package graphtest holds test utilities for packages that depend on the graph package.
nanlogger
Package nanlogger collects `graph.Node` objects to monitor for `NaN` ("not-a-number") or `Inf` (infinity) values.
Package nanlogger collects `graph.Node` objects to monitor for `NaN` ("not-a-number") or `Inf` (infinity) values.
ml
context
Package context defines the Context and Variable types: Context organizes variablesMap and variablesMap manages the storage of values typically used as variablesMap.
Package context defines the Context and Variable types: Context organizes variablesMap and variablesMap manages the storage of values typically used as variablesMap.
context/checkpoints
Package checkpoints implements checkpoint management: saving and loading of checkpoints.
Package checkpoints implements checkpoint management: saving and loading of checkpoints.
context/ctxtest
Package ctxtest holds test utilities for packages that depend on context package.
Package ctxtest holds test utilities for packages that depend on context package.
context/initializers
Package initializers include several weight initializers, to be used with context.
Package initializers include several weight initializers, to be used with context.
data
Package data is a collection of tools that facilitate data loading and preprocessing.
Package data is a collection of tools that facilitate data loading and preprocessing.
data/hdf5
Package hdf5 provides a trivial API to access HDF5 file contents.
Package hdf5 provides a trivial API to access HDF5 file contents.
layers
Package layers holds a collection of common modeling layers.
Package layers holds a collection of common modeling layers.
train
Package train holds tools to help run a training loop.
Package train holds tools to help run a training loop.
train/commandline
Package commandline contains convenience UI training tools for the command line.
Package commandline contains convenience UI training tools for the command line.
train/losses
Package losses have several standard losses that implement train.LossFn interface.
Package losses have several standard losses that implement train.LossFn interface.
train/metrics
Package metrics holds a library of metrics and defines
Package metrics holds a library of metrics and defines
train/optimizers
Package optimizers implements a collection of ML optimizers, that can be used by train.Trainer, or by themselves.
Package optimizers implements a collection of ML optimizers, that can be used by train.Trainer, or by themselves.
models
inceptionv3
Package inceptionv3 provides a pre-trained InceptionV3 model, or simply it's structure.
Package inceptionv3 provides a pre-trained InceptionV3 model, or simply it's structure.
Package types is mostly a top level directory for GoMLX important types.
Package types is mostly a top level directory for GoMLX important types.
exceptions
Package exceptions provides helper functions to leverage Go's `panic`, `recover` and `defer` as an "exceptions" system.
Package exceptions provides helper functions to leverage Go's `panic`, `recover` and `defer` as an "exceptions" system.
keepalive
Package keepalive provides a simple Acquire and Release mechanism to make sure data is kept alive in between.
Package keepalive provides a simple Acquire and Release mechanism to make sure data is kept alive in between.
shapes
Package shapes defines Shape and DType and associated tools.
Package shapes defines Shape and DType and associated tools.
slices
Package slices are
Package slices are
tensor
Package tensor provides a `Tensor` interface with 2 different implementations: `Local` and `Device`, they differ on where their values are stored: in the local (host) CPU, or on an accelerator device (TPU, GPU, but could be also the CPU if no accelerators are available).
Package tensor provides a `Tensor` interface with 2 different implementations: `Local` and `Device`, they differ on where their values are stored: in the local (host) CPU, or on an accelerator device (TPU, GPU, but could be also the CPU if no accelerators are available).
tensor/image
Package image provides several functions to transform images back and forth from tensors.
Package image provides several functions to transform images back and forth from tensors.
Package xla wraps the XLA functionality, plus extra dependencies.
Package xla wraps the XLA functionality, plus extra dependencies.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL