This document explains how to build MXNet from source code. Building MXNet from source is a two step process.
libmxnet.so, from C++ source filesYou need C++ build tools and a BLAS library to build the MXNet shared library. If you want to run MXNet with GPUs, you will need to install NVDIA CUDA and cuDNN first.
You may use GNU Make to build the library but cmake is required when building with MKLDNN
A C++ compiler that supports C++ 11. G++ (4.8 or later) or Clang is required.
Git for downloading the sources from Github repository.
MXNet relies on the BLAS (Basic Linear Algebra Subprograms) library for numerical computations. Those can be extended with LAPACK (Linear Algebra Package), an additional set of mathematical functions.
MXNet supports multiple mathematical backends for computations on the CPU:
Usage of these are covered in more detail in the build configurations section.
These might be optional, but they're typically desirable.
Detailed instructions are provided per operating system. You may jump to those, but it is recommended that you continue reading to understand more general build from source options.
| macOS | Ubuntu | CentOS/*unix | Windows |
| raspbian | tx2 |
git clone --recursive https://github.com/apache/incubator-mxnet mxnet cd mxnet
There is a configuration file for make, make/config.mk, that contains all the compilation options. You can edit it and then run make.
cmake is recommended for building MXNet (and is required to build with MKLDNN), however you may use make instead.
It is useful to consider your math library selection first.
The default order of choice for the libraries if found follows the path from the most (recommended) to less performant backends. The following lists show this order by library and cmake switch.
For desktop platforms (x86_64):
USE_MKLDNNUSE_MKL_IF_AVAILABLEUSE_MKLMLUSE_APPLE_ACCELERATE_IF_AVAILABLE | Mac onlyBLAS | Options: Atlas, Open, MKL, AppleNote: If USE_MKL_IF_AVAILABLE is set to False then MKLML and MKL-DNN will be disabled as well for configuration backwards compatibility.
For embedded platforms (all other and if cross compiled):
BLAS | Options: Atlas, Open, MKL, AppleYou can set the BLAS library explicitly by setting the BLAS variable to:
See the cmake/ChooseBLAS.cmake file for the options.
Intel's MKL (Math Kernel Library) is one of the most powerful math libraries https://software.intel.com/en-us/mkl
It has following flavors:
MKL is a complete math library, containing all the functionality found in ATLAS, OpenBlas and LAPACK. It is free under community support licensing (https://software.intel.com/en-us/articles/free-mkl), but needs to be downloaded and installed manually.
MKLML is a subset of MKL. It contains a smaller number of functions to reduce the size of the download and reduce the number of dynamic libraries user needs.
MKL-DNN is a separate open-source library, it can be used separately from MKL or MKLML. It is shipped as a subrepo with MXNet source code (see 3rdparty/mkldnn or the MKL-DNN project)
Since the full MKL library is almost always faster than any other BLAS library it's turned on by default, however it needs to be downloaded and installed manually before doing cmake configuration. Register and download on the Intel performance libraries website.
Note: MKL is supported only for desktop builds and the framework itself supports the following hardware:
If you have a different processor you can still try to use MKL, but performance results are unpredictable.
lib and include folders.config.mk file with following, in addition to the CUDA related options.echo "USE_NCCL=1" >> make/config.mk echo "USE_NCCP_PATH=path-to-nccl-installation-folder" >> make/config.mk cp make/config.mk .
make -j"$(nproc)"
test_nccl.py file at incubator-mxnet/tests/python/gpu/test_nccl.py@unittest.skip("Test requires NCCL library installed and enabled during build")
nosetests --verbose tests/python/gpu/test_nccl.py
Recommendation to get the best performance out of NCCL: It is recommended to set environment variable NCCL_LAUNCH_MODE to PARALLEL when using NCCL version 2.1 or newer.
USE_CPP_PACKAGE=1 when you run make or cmake.-j runs multiple jobs against multi-core CPUs. Example using all cores on Linux:make -j$(nproc)
make USE_OPENCV=0
make -j USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1
xcode (OPENMP is disabled because it is not supported by the Apple version of Clang):make -j USE_BLAS=apple USE_OPENCV=0 USE_OPENMP=0
llvm (the one provided by Apple does not support OpenMP):brew install llvm make -j USE_BLAS=apple USE_OPENMP=1
After building MXNet's shared library, you can install other language bindings. (Except for C++. You need to build this when you build MXNet from source.)
The following table provides links to each language binding by operating system:
| Linux | macOS | Windows | |
|---|---|---|---|
| Python | Linux | macOS | Windows |
| C++ | Linux | macOS | Windows |
| Clojure | Linux | macOS | n/a |
| Julia | Linux | macOS | Windows |
| Perl | Linux | macOS | Windows |
| R | Linux | macOS | Windows |
| Scala | Linux | macOS | n/a |