From 6f35f6ee0881b6a3d2d5018260a410549bbc8d68 Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Thu, 15 Feb 2018 15:49:36 -0800 Subject: [PATCH 1/8] replace MKL2017 references with MKL-DNN --- MKL_README.md | 62 ------------------- docker_multiarch/arm.crosscompile.android.mk | 12 +--- docker_multiarch/arm.crosscompile.mk | 14 +---- docs/faq/perf.md | 5 +- .../image-classification/benchmark_score.py | 2 +- make/config.mk | 8 +-- make/osx.mk | 2 +- 7 files changed, 8 insertions(+), 97 deletions(-) delete mode 100644 MKL_README.md diff --git a/MKL_README.md b/MKL_README.md deleted file mode 100644 index 0f97416ac368..000000000000 --- a/MKL_README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Full MKL Installation - -## Build/Install MXNet with a full MKL installation: -Installing and enabling the full MKL installation enables MKL support for all operators under the linalg namespace. - - 1. Download and install the latest full MKL version following instructions on the [intel website.](https://software.intel.com/en-us/articles/intel-mkl-111-install-guide) - - 2. Set USE_BLAS=mkl in make/config.mk - - 1.1 Set ADD_LDFLAGS=-L (ex. ADD_LDFLAGS=-L/opt/intel/compilers_and_libraries_2018.0.128/linux/mkl/lib) - - 1.1 Set ADD_CFLAGS=-I (ex. ADD_CFLAGS=-L/opt/intel/compilers_and_libraries_2018.0.128/linux/mkl/include) - - 3. Run 'make -j ${nproc}' - - 4. Navigate into the python directory - - 5. Run 'sudo python setup.py install' - -# MKL2017 PLUGIN - -MKL2017 is an INTEL released library to accelerate Deep Neural Network (DNN) applications on Intel architecture. - -MKL2017_ML is a subset of MKL2017 and only contains DNN acceleration feature, MKL2017 release cycle is longer then MKL2017_ML and MKL2017_ML support latest feature - -This README shows the user how to setup and install MKL2017 library with mxnet. - -## Build/Install MXNet with MKL: - - 1. Enable USE_MKL2017=1 in make/config.mk - - 1.1 By default, MKL_2017_EXPRIEMENTAL=0. If setting MKL_2017_EXPRIEMENTAL=1, MKL buffer will be created and transferred between layers to achiever much higher performance. - - 1.2 By default, MKLML_ROOT=/usr/local, MKL2017_ML will be used - - 1.2.1 when excute make, Makefile will execute "prepare_mkl.sh" to download the MKL2017_ML library under - - 1.2.2 manually steps for download MKL2017_ML problem - - 1.2.2.1 wget https://github.com/dmlc/web-data/raw/master/mxnet/mklml-release/mklml_lnx_.tgz - - 1.2.2.2 tar zxvf mklml_lnx_.tgz - - 1.2.2.3 cp -rf mklml_lnx_/* / - - 1.2.3 Set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MKLML_ROOT/lib - - 1.3 If setting USE_BLAS=mkl - - 1.3.1 mshadow can also utilize mkl blas function in mklml package - - 1.4 MKL version compatibility - - 1.3.2.1 If you already have MKL installed and MKLROOT being set in your system, by default, it will not attempt to download the latest mklml package unless you unset MKLROOT. - - 2. Run 'make -jX' - - 3. Navigate into the python directory - - 4. Run 'sudo python setup.py install' - - diff --git a/docker_multiarch/arm.crosscompile.android.mk b/docker_multiarch/arm.crosscompile.android.mk index 36b8e9bed793..e989d28dda4a 100644 --- a/docker_multiarch/arm.crosscompile.android.mk +++ b/docker_multiarch/arm.crosscompile.android.mk @@ -90,13 +90,6 @@ USE_OPENMP = 1 # For USE_BLAS!=mkl only MKLML_ROOT=/usr/local -# whether use MKL2017 library -USE_MKL2017 = 0 - -# whether use MKL2017 experimental feature for high performance -# Prerequisite USE_MKL2017=1 -USE_MKL2017_EXPERIMENTAL = 0 - # whether use NNPACK library USE_NNPACK = 0 @@ -115,13 +108,10 @@ USE_LAPACK_PATH = USE_INTEL_PATH = NONE # If use MKL only for BLAS, choose static link automatically to allow python wrapper -ifeq ($(USE_MKL2017), 0) +USE_STATIC_MKL = NONE ifeq ($(USE_BLAS), mkl) USE_STATIC_MKL = 1 endif -else -USE_STATIC_MKL = NONE -endif #---------------------------- # distributed computing diff --git a/docker_multiarch/arm.crosscompile.mk b/docker_multiarch/arm.crosscompile.mk index da0552eb2fbb..bfca7e25e63f 100644 --- a/docker_multiarch/arm.crosscompile.mk +++ b/docker_multiarch/arm.crosscompile.mk @@ -90,13 +90,6 @@ USE_OPENMP = 1 # For USE_BLAS!=mkl only MKLML_ROOT=/usr/local -# whether use MKL2017 library -USE_MKL2017 = 0 - -# whether use MKL2017 experimental feature for high performance -# Prerequisite USE_MKL2017=1 -USE_MKL2017_EXPERIMENTAL = 0 - # whether use NNPACK library USE_NNPACK = 0 @@ -115,13 +108,10 @@ USE_LAPACK_PATH = USE_INTEL_PATH = NONE # If use MKL only for BLAS, choose static link automatically to allow python wrapper -ifeq ($(USE_MKL2017), 0) +USE_STATIC_MKL = NONE ifeq ($(USE_BLAS), mkl) USE_STATIC_MKL = 1 endif -else -USE_STATIC_MKL = NONE -endif #---------------------------- # distributed computing @@ -176,4 +166,4 @@ USE_CPP_PACKAGE = 0 # whether to use sframe integration. This requires build sframe # git@github.com:dato-code/SFrame.git # SFRAME_PATH = $(HOME)/SFrame -# MXNET_PLUGINS += plugin/sframe/plugin.mk \ No newline at end of file +# MXNET_PLUGINS += plugin/sframe/plugin.mk diff --git a/docs/faq/perf.md b/docs/faq/perf.md index 519959810f3f..e021f1e9a21c 100644 --- a/docs/faq/perf.md +++ b/docs/faq/perf.md @@ -18,10 +18,7 @@ Performance is mainly affected by the following 4 factors: ## Intel CPU For using Intel Xeon CPUs for training and inference, we suggest enabling -both `USE_MKL2017 = 1` and `USE_MKL2017_EXPERIMENTAL = 1` in -`config.mk`. Check -[MKL_README.md](https://github.com/dmlc/mxnet/blob/master/MKL_README.md) for -details. +`USE_MKLDNN = 1` in`config.mk`. We also find that setting the following two environment variables can help: - `export KMP_AFFINITY=granularity=fine,compact,1,0` if there are two physical CPUs diff --git a/example/image-classification/benchmark_score.py b/example/image-classification/benchmark_score.py index b6d1d642c861..82903b632388 100644 --- a/example/image-classification/benchmark_score.py +++ b/example/image-classification/benchmark_score.py @@ -70,7 +70,7 @@ def score(network, dev, batch_size, num_batches): if __name__ == '__main__': networks = ['alexnet', 'vgg-16', 'inception-bn', 'inception-v3', 'resnet-50', 'resnet-152'] devs = [mx.gpu(0)] if len(get_gpus()) > 0 else [] - # Enable USE_MKL2017_EXPERIMENTAL for better CPU performance + # Enable USE_MKLDNN for better CPU performance devs.append(mx.cpu()) batch_sizes = [1, 2, 4, 8, 16, 32] diff --git a/make/config.mk b/make/config.mk index 1591d2ad60af..4f45e7675745 100644 --- a/make/config.mk +++ b/make/config.mk @@ -103,12 +103,8 @@ USE_OPENMP = 1 # For USE_BLAS!=mkl only MKLML_ROOT=/usr/local -# whether use MKL2017 library -USE_MKL2017 = 0 - -# whether use MKL2017 experimental feature for high performance -# Prerequisite USE_MKL2017=1 -USE_MKL2017_EXPERIMENTAL = 0 +# whether use MKL-DNN library +USE_MKLDNN = 0 # whether use NNPACK library USE_NNPACK = 0 diff --git a/make/osx.mk b/make/osx.mk index 624677966e1a..47f395bccf97 100644 --- a/make/osx.mk +++ b/make/osx.mk @@ -88,7 +88,7 @@ USE_BLAS = apple USE_LAPACK = 1 # by default, disable lapack when using MKL -# switch on when there is a full installation of MKL available (not just MKL2017/MKL_ML) +# switch on when there is a full installation of MKL available (not just MKL_ML) ifeq ($(USE_BLAS), mkl) USE_LAPACK = 0 endif From 40d0a6c28ff82a861e1d064eddfb6bd38b2930d7 Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Fri, 16 Feb 2018 09:54:20 -0800 Subject: [PATCH 2/8] remove MKLML_ROOT --- docker_multiarch/arm.crosscompile.android.mk | 8 -------- docker_multiarch/arm.crosscompile.mk | 8 -------- make/config.mk | 8 -------- 3 files changed, 24 deletions(-) diff --git a/docker_multiarch/arm.crosscompile.android.mk b/docker_multiarch/arm.crosscompile.android.mk index e989d28dda4a..0302c5cf25ab 100644 --- a/docker_multiarch/arm.crosscompile.android.mk +++ b/docker_multiarch/arm.crosscompile.android.mk @@ -82,14 +82,6 @@ USE_OPENCV = 0 # use openmp for parallelization USE_OPENMP = 1 -# MKL ML Library for Intel CPU/Xeon Phi -# Please refer to MKL_README.md for details - -# MKL ML Library folder, need to be root for /usr/local -# Change to User Home directory for standard user -# For USE_BLAS!=mkl only -MKLML_ROOT=/usr/local - # whether use NNPACK library USE_NNPACK = 0 diff --git a/docker_multiarch/arm.crosscompile.mk b/docker_multiarch/arm.crosscompile.mk index bfca7e25e63f..2bca9e396d79 100644 --- a/docker_multiarch/arm.crosscompile.mk +++ b/docker_multiarch/arm.crosscompile.mk @@ -82,14 +82,6 @@ USE_OPENCV = 0 # use openmp for parallelization USE_OPENMP = 1 -# MKL ML Library for Intel CPU/Xeon Phi -# Please refer to MKL_README.md for details - -# MKL ML Library folder, need to be root for /usr/local -# Change to User Home directory for standard user -# For USE_BLAS!=mkl only -MKLML_ROOT=/usr/local - # whether use NNPACK library USE_NNPACK = 0 diff --git a/make/config.mk b/make/config.mk index 4f45e7675745..fa429f31f298 100644 --- a/make/config.mk +++ b/make/config.mk @@ -95,14 +95,6 @@ USE_LIBJPEG_TURBO_PATH = NONE # use openmp for parallelization USE_OPENMP = 1 -# MKL ML Library for Intel CPU/Xeon Phi -# Please refer to MKL_README.md for details - -# MKL ML Library folder, need to be root for /usr/local -# Change to User Home directory for standard user -# For USE_BLAS!=mkl only -MKLML_ROOT=/usr/local - # whether use MKL-DNN library USE_MKLDNN = 0 From e6defbb6a618a5bc6bcc17c5ee087b3bcde6170c Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Fri, 16 Feb 2018 14:57:27 -0800 Subject: [PATCH 3/8] MKL_README.md for Full MKL --- MKL_README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 MKL_README.md diff --git a/MKL_README.md b/MKL_README.md new file mode 100644 index 000000000000..5374adb8e42a --- /dev/null +++ b/MKL_README.md @@ -0,0 +1,19 @@ +# Full MKL Installation + +## Build/Install MXNet with a full MKL installation: +Installing and enabling the full MKL installation enables MKL support for all operators under the linalg namespace. + + 1. Download and install the latest full MKL version following instructions on the [intel website.](https://software.intel.com/en-us/articles/intel-mkl-111-install-guide) + + 2. Set USE_BLAS=mkl in make/config.mk + + 1.1 Set ADD_LDFLAGS=-L (ex. ADD_LDFLAGS=-L/opt/intel/compilers_and_libraries_2018.0.128/linux/mkl/lib) + + 1.1 Set ADD_CFLAGS=-I (ex. ADD_CFLAGS=-L/opt/intel/compilers_and_libraries_2018.0.128/linux/mkl/include) + + 3. Run 'make -j ${nproc}' + + 4. Navigate into the python directory + + 5. Run 'sudo python setup.py install' + From 61c4a6e23bdeab2430d15baa0dfa80ed8bd4caf0 Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Fri, 16 Feb 2018 19:22:56 -0800 Subject: [PATCH 4/8] update test_mkldnn --- .../cpu/{test_mklml.py => test_mkldnn.py} | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) rename tests/python/cpu/{test_mklml.py => test_mkldnn.py} (81%) diff --git a/tests/python/cpu/test_mklml.py b/tests/python/cpu/test_mkldnn.py similarity index 81% rename from tests/python/cpu/test_mklml.py rename to tests/python/cpu/test_mkldnn.py index decd5b1c9850..16b30039737c 100644 --- a/tests/python/cpu/test_mklml.py +++ b/tests/python/cpu/test_mkldnn.py @@ -16,24 +16,24 @@ # under the License. """ -MKLML related test cases +MKL-DNN related test cases """ import logging import os from sys import platform -def test_mklml_install(): +def test_mkldnn_install(): """ This test will verify that MXNet is built/installed correctly when - compiled with Intel MKLML library. The method will try to import - the mxnet module and see if the mklml library is mapped to this + compiled with Intel MKL-DNN library. The method will try to import + the mxnet module and see if the mkldnn library is mapped to this process's address space. """ logging.basicConfig(level=logging.INFO) if not platform.startswith('linux'): - logging.info("Bypass mklml install test for non-Linux OS") + logging.info("Bypass mkldnn install test for non-Linux OS") return try: @@ -45,14 +45,14 @@ def test_mklml_install(): pid = os.getpid() rc = os.system("cat /proc/" + str(pid) + \ - "/maps | grep libmklml_ > /dev/null") + "/maps | grep libmkldnn > /dev/null") if rc == 0: - logging.info("MXNet is built/installed correctly with MKLML") + logging.info("MXNet is built/installed correctly with MKL-DNN") else: - assert 0, "MXNet is built/installed incorrectly with MKLML, please " \ + assert 0, "MXNet is built/installed incorrectly with MKL-DNN, please " \ "double check your build/install steps or environment " \ "variable settings" if __name__ == '__main__': - test_mklml_install() + test_mkldnn_install() From 4e28b68ce197c3c6409a2f8c8175cde180ef596f Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Thu, 22 Feb 2018 20:42:08 -0800 Subject: [PATCH 5/8] update Jenkinsfile --- Jenkinsfile | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 17d546c87f45..1741d858840c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,6 +24,7 @@ mx_lib = 'lib/libmxnet.so, lib/libmxnet.a, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // mxnet cmake libraries, in cmake builds we do not produce a libnvvm static library by default. mx_cmake_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so' +mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, lib/libiomp5.so, lib/libmklml_gnu.so, lib/libmkldnn.so, lib/libmkldnn.so.0, lib/libmklml_intel.so' mx_mkldnn_lib = 'lib/libmxnet.so, lib/libmxnet.a, lib/libiomp5.so, lib/libmklml_gnu.so, lib/libmkldnn.so, lib/libmkldnn.so.0, lib/libmklml_intel.so, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // command to start a docker container docker_run = 'tests/ci_build/ci_build.sh' @@ -260,6 +261,23 @@ try { } } }, + 'GPU: CMake MKLDNN': { + node('mxnetlinux-cpu') { + ws('workspace/build-cmake-mkldnn-gpu') { + init_git() + def defines = """ \ + -DUSE_CUDA=1 \ + -DUSE_CUDNN=1 \ + -DUSE_MKLML_MKL=1 \ + -DUSE_MKLDNN=1 \ + -DCMAKE_BUILD_TYPE=Release \ + """ + def flag = "-v" + cmake("build_cuda", defines, flag) + pack_lib('cmake_mkldnn_gpu', mx_cmake_mkldnn_lib) + } + } + }, 'GPU: CMake': { node('mxnetlinux-cpu') { ws('workspace/build-cmake-gpu') { From 8a634c877f734554d9901fcc583637ef46f5c788 Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Thu, 22 Feb 2018 21:34:05 -0800 Subject: [PATCH 6/8] update jenkins --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1741d858840c..5aed32897b31 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,7 +24,7 @@ mx_lib = 'lib/libmxnet.so, lib/libmxnet.a, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // mxnet cmake libraries, in cmake builds we do not produce a libnvvm static library by default. mx_cmake_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so' -mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, lib/libiomp5.so, lib/libmklml_gnu.so, lib/libmkldnn.so, lib/libmkldnn.so.0, lib/libmklml_intel.so' +mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, /usr/local/lib/libiomp5.so, /usr/local/lib/libmklml_gnu.so, build/3rdparty/mkldnn/install/lib/libmkldnn.so, build/3rdparty/mkldnn/install/lib/libmkldnn.so.0, /usr/local/lib/libmklml_intel.so' mx_mkldnn_lib = 'lib/libmxnet.so, lib/libmxnet.a, lib/libiomp5.so, lib/libmklml_gnu.so, lib/libmkldnn.so, lib/libmkldnn.so.0, lib/libmklml_intel.so, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // command to start a docker container docker_run = 'tests/ci_build/ci_build.sh' From e3aa01eb539b30cdeaef722046e4039d213ec6a5 Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Fri, 23 Feb 2018 08:41:16 -0800 Subject: [PATCH 7/8] trigger Jenkins with new changes --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5aed32897b31..0e684b4a60b8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,7 +24,7 @@ mx_lib = 'lib/libmxnet.so, lib/libmxnet.a, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // mxnet cmake libraries, in cmake builds we do not produce a libnvvm static library by default. mx_cmake_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so' -mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, /usr/local/lib/libiomp5.so, /usr/local/lib/libmklml_gnu.so, build/3rdparty/mkldnn/install/lib/libmkldnn.so, build/3rdparty/mkldnn/install/lib/libmkldnn.so.0, /usr/local/lib/libmklml_intel.so' +mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so, 3rdparty/mkldnn/src/libmkldnn.so, 3rdparty/mkldnn/src/libmkldnn.so.0' mx_mkldnn_lib = 'lib/libmxnet.so, lib/libmxnet.a, lib/libiomp5.so, lib/libmklml_gnu.so, lib/libmkldnn.so, lib/libmkldnn.so.0, lib/libmklml_intel.so, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // command to start a docker container docker_run = 'tests/ci_build/ci_build.sh' From ddbd999f13fa18ac2f989d75b82e300ea5bed6e5 Mon Sep 17 00:00:00 2001 From: Ashok Emani Date: Fri, 23 Feb 2018 09:08:28 -0800 Subject: [PATCH 8/8] trigger Jenkins with new changes --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0e684b4a60b8..a20d9db545cb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,7 +24,7 @@ mx_lib = 'lib/libmxnet.so, lib/libmxnet.a, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // mxnet cmake libraries, in cmake builds we do not produce a libnvvm static library by default. mx_cmake_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so' -mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so, 3rdparty/mkldnn/src/libmkldnn.so, 3rdparty/mkldnn/src/libmkldnn.so.0' +mx_cmake_mkldnn_lib = 'build/libmxnet.so, build/libmxnet.a, build/dmlc-core/libdmlc.a, build/tests/mxnet_unit_tests, build/3rdparty/openmp/runtime/src/libomp.so, build/3rdparty/mkldnn/src/libmkldnn.so, build/3rdparty/mkldnn/src/libmkldnn.so.0' mx_mkldnn_lib = 'lib/libmxnet.so, lib/libmxnet.a, lib/libiomp5.so, lib/libmklml_gnu.so, lib/libmkldnn.so, lib/libmkldnn.so.0, lib/libmklml_intel.so, dmlc-core/libdmlc.a, nnvm/lib/libnnvm.a' // command to start a docker container docker_run = 'tests/ci_build/ci_build.sh'