Compiler for Neural Network hardware accelerators
Switch branches/tags
Nothing to show
Clone or download
jfix71 [cleanup | NFC] Remove many unnecessary uses of getNthInput()
*Description*: These are bad practice and should only be used when really necessary.

*Testing*: ninja check
Latest commit a421f0b Nov 15, 2018
Permalink
Failed to load latest commit information.
.ci [travis] Add lenet_mnist bundle to Debug build Oct 17, 2018
.circleci [opencl] Enable tests. Nov 15, 2018
.travis migrate DEBUG & ASAN to use circle ci Oct 18, 2018
cmake/modules [NFC] Add the license in the cmake and script files. Oct 19, 2018
docs [utils] Add driver for determining imagenet topk accuracy Nov 15, 2018
examples [build] Do not build bundles by default. It takes 40min on CI. Nov 14, 2018
include/glow Support int32 index for Gather (#2030) Nov 15, 2018
lib [GraphOptimizer] Only fuse Rescales into input if input has one user Nov 15, 2018
tests [cleanup | NFC] Remove many unnecessary uses of getNthInput() Nov 16, 2018
thirdparty [onnx] Update onnx submodule. Nov 15, 2018
tools Support int32 index for Gather (#2030) Nov 15, 2018
utils [utils] Add driver for determining imagenet topk accuracy Nov 15, 2018
.clang-format [trivial] Remove trailing whitespace Oct 12, 2018
.clang-tidy Fix .clang-tidy and add rule to ignore pointer->boolean cast Jan 1, 2018
.gitignore Add a new HyphenTest unit test. May 18, 2018
.gitmodules [Support] Add a new type to represent half precision values Sep 20, 2018
.travis.yml migrate DEBUG & ASAN to use circle ci Oct 18, 2018
CMakeLists.txt [opencl] Remove all ref to disabling opencl tests. Nov 15, 2018
CODE_OF_CONDUCT.md [docs] Update the link to code of conduct. Nov 8, 2018
CONTRIBUTING.md [CONTRIBUTING] Add myself as a maintainer Jul 28, 2018
LICENSE [license] Add Apache 2 license Apr 25, 2018
PULL_REQUEST.md [docs] Add PR template and clarify requirements to the PR description. Aug 27, 2018
PULL_REQUEST_TEMPLATE.md [docs] Add PR template and clarify requirements to the PR description. Aug 27, 2018
README.md [Readme] add a link to the roadmap page. Nov 15, 2018

README.md

Glow

Build Status Code Coverage

Glow is a machine learning compiler and execution engine for various hardware targets. It is designed to be used as a backend for high-level machine learning frameworks. The compiler is designed to allow state of the art compiler optimizations and code generation of neural network graphs. This library is in active development. The project plan is described in the Github issues section and in the Roadmap wiki page.

How does it work?

Glow lowers a traditional neural network dataflow graph into a two-phase strongly-typed intermediate representation (IR). The high-level IR allows the optimizer to perform domain-specific optimizations. The lower-level instruction-based address-only IR allows the compiler to perform memory-related optimizations, such as instruction scheduling, static memory allocation and copy elimination. At the lowest level, the optimizer performs machine-specific code generation to take advantage of specialized hardware features. Glow features a lowering phase which enables the compiler to support a high number of input operators as well as a large number of hardware targets by eliminating the need to implement all operators on all targets. The lowering phase is designed to reduce the input space and allow new hardware backends to focus on a small number of linear algebra primitives. The design philosophy is described in an arXiv paper.

Getting Started

System Requirements

Glow builds and runs on macOS and Linux. The software depends on a modern C++ compiler that supports C++11, on CMake, LLVM, protocol buffers, and libpng.

Get Glow!

git clone git@github.com:pytorch/glow.git  # or: git clone https://github.com/pytorch/glow.git
cd glow

Submodules

Glow depends on a few submodules: googletest, onnx, and a library for FP16 conversions.

To get them, from the glow directory, run:

git submodule update --init --recursive

macOS

Install the required dependencies using Homebrew:

brew install cmake graphviz libpng ninja protobuf wget
brew install --with-toolchain llvm@6

Note that LLVM is installed to a non-default location (/usr/local/opt/llvm) to avoid conflicts with the system's LLVM.

Ubuntu

On Ubuntu you would need to install a few dependencies. The following command should install the required dependencies.

sudo apt-get install graphviz clang cmake wget ninja-build llvm-5.0 \
    libprotobuf-dev protobuf-compiler libpng-dev

In order to support ONNX net serialization format, Glow requires protobuf >= 2.6.1, but the above command may install older version on older Ubuntu (e.g. 14.04). If this is the case, we suggest to look at utils/install_protobuf.sh to install newer version from source.

Note, that OpenCL support is not trivial on Linux. We suggest to build without OpenCL for the first time.

Configure and build

To build the compiler, create a build directory and run cmake on the source directory. It's a good idea to build two configurations (Release and Debug) because some programs take a really long time to run in Debug mode. It's also a good idea to build the project outside of the source directory.

mkdir build_Debug
cd build_Debug
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ../glow
ninja all

It's possible to configure and build the compiler with any CMake generator, like GNU Makefiles, Ninja and Xcode build.

Building with dependencies (LLVM)

By default, Glow will use a system provided LLVM. Note that Glow requires LLVM 5.0 or later. If you have LLVM installed in a non-default location (for example, if you installed it using Homebrew on macOS), you need to tell CMake where to find llvm using -DCMAKE_PREFIX_PATH. For example:

cmake -G Ninja ../glow \
    -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_PREFIX_PATH=/usr/local/opt/llvm

If LLVM is not available on your system you'll need to build it manually. Run the script '/utils/build_llvm.sh to clone, build and install LLVM in a local directory. You will need to configure Glow with the flag -DCMAKE_PREFIX_PATH to tell the build system where to find LLVM (e.g. the location of llvm_install/ if using build_llvm.sh).

For more platform-specific build instructions and advanced options, such as building with Address-Sanitizers refer to this guide: Building the Compiler.

Testing and Running

Unit tests

The project has a few unit tests in the tests/unittests subdirectory. To run all of them, simply run ninja test.

C++ API examples

A few test programs that use Glow's C++ API are found under the examples/ subdirectory. The mnist, cifar10, fr2en and ptb programs train and run digit recognition, image classification and language modeling benchmarks, respectively.

To run these programs, build Glow in Release mode, then run the following commands to download the cifar10, mnist and ptb databases.

python ../glow/utils/download_test_db.py --all

Now run the examples. Note that the databases should be in the current working directory.

./bin/mnist
./bin/cifar10
./bin/fr2en
./bin/ptb
./bin/char-rnn

If everything goes well you should see:

  • mnist: pictures from the mnist digits database
  • cifar10: image classifications that steadily improve
  • fr2en: an interactive French-to-English translator
  • ptb: decreasing perplexity on the dataset as the network trains
  • char-rnn: generates random text based on some document

Note that the default build mode is Debug, which means that the compiler itself is easy to debug because the binary contains debug info, lots of assertions, and the optimizations are disabled. It also means that the compiler and runtime are very slow, and the execution time can be hundreds of times slower than that of release builds. If you wish to benchmark the compiler, run long benchmarks, or release the product then you should compile the compiler in Release mode. Check the main CMake file for more details.

More details on testing and running Glow can be found in: Testing the Glow Compiler.

Ahead-of-time Compilation

Glow can be used to compile neural networks into object files containing native code. We provide resnet50 (both quantized and non-quantized versions) as an example of this capability in examples/bundles/resnet50. See Creating Standalone Executable Bundles for more detail.

Contributing

To get started, please refer to the following guides:

Communication

  • forums: discuss implementations, research, etc. http://discuss.pytorch.org. Make sure to label topic with the "glow" category.
  • GitHub issues: bug reports, feature requests, install issues, RFCs, thoughts, etc.

License

Glow is licensed under the Apache 2.0 License.