You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by ma...@apache.org on 2021/06/24 21:24:50 UTC

[incubator-mxnet] branch v1.9.x updated: [v1.9.x] Cherry-pick ArmPL changes from v1.x (#20381)

This is an automated email from the ASF dual-hosted git repository.

manuseth pushed a commit to branch v1.9.x
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git


The following commit(s) were added to refs/heads/v1.9.x by this push:
     new 5a8c414  [v1.9.x] Cherry-pick ArmPL changes from v1.x (#20381)
5a8c414 is described below

commit 5a8c414653cca5aa09dc040fba7e30326fa41858
Author: Manu Seth <22...@users.noreply.github.com>
AuthorDate: Thu Jun 24 14:22:58 2021 -0700

    [v1.9.x] Cherry-pick ArmPL changes from v1.x (#20381)
    
    * [v1.x] update armpl version (#20332)
    
    * update armpl version
    
    * enable apl
    
    * downgrade openblas to 3.13
    
    * Update Dockerfile
    
    * [v1.x] Use ArmPL as BLAS for MXNet AArch64 wheels (#20342)
    
    * use armpl as blas for mxnet
    
    * link libgfortran
    
    * fix CPATH
    
    * rectify if condition
    
    * update armpl macro
    
    * remove lapacke.h as duplicate of cblas.h
    
    * Specify Arm CD ARMPL include path (#20364)
    
    Workaround https://github.com/oneapi-src/oneDNN/issues/1100
    
    * update s3 links to public links (#20357)
    
    Co-authored-by: Zhaoqi Zhu <zh...@gmail.com>
---
 3rdparty/mshadow/mshadow/base.h                    |  8 +++
 cd/python/docker/Dockerfile                        |  2 +-
 .../Dockerfile.publish.ubuntu1804_aarch64_cpu      |  2 +-
 cmake/ChooseBlas.cmake                             |  8 +++
 cmake/Modules/FindArmPL.cmake                      | 79 ++++++++++++++++++++++
 config/distribution/linux_aarch64_cpu.cmake        |  3 +
 .../imageclassifier/scripts/get_resnet_18_data.sh  |  6 +-
 .../infer/predictor/scripts/get_resnet_18_data.sh  |  6 +-
 .../scripts/infer/get_resnet_18_data.sh            |  6 +-
 .../infer/imageclassifier/get_resnet_18_data.sh    |  6 +-
 .../infer/predictor/PredictorExampleTest.java      |  8 +--
 .../benchmark/ScalaInferenceBenchmarkSuite.scala   |  8 +--
 .../ImageClassifierExampleSuite.scala              |  8 +--
 .../infer/predictor/PredictorExampleSuite.scala    |  8 +--
 .../src/main/java/mxnet/ImageClassification.java   |  8 +--
 .../scala/sample/ImageClassificationExample.scala  |  8 +--
 src/operator/c_lapack_api.h                        | 16 +++--
 tools/staticbuild/build.sh                         |  6 +-
 tools/staticbuild/build_lib_cmake.sh               |  4 +-
 19 files changed, 153 insertions(+), 47 deletions(-)

diff --git a/3rdparty/mshadow/mshadow/base.h b/3rdparty/mshadow/mshadow/base.h
index 9f53857..a6bf0ef 100755
--- a/3rdparty/mshadow/mshadow/base.h
+++ b/3rdparty/mshadow/mshadow/base.h
@@ -106,6 +106,10 @@ typedef unsigned __int64 uint64_t;
 #ifndef MSHADOW_USE_MKL
   #define MSHADOW_USE_MKL   1
 #endif
+/*! \brief use ArmPL for BLAS */
+#ifndef MSHADOW_USE_ARMPL
+  #define MSHADOW_USE_ARMPL 0
+#endif
 
 /*!
  * \brief use CUDA support, must ensure that the cuda include path is correct,
@@ -178,6 +182,10 @@ typedef unsigned __int64 uint64_t;
 
 #if MSHADOW_USE_CBLAS
 extern "C" {
+    #if MSHADOW_USE_ARMPL
+        #define armpl_singlecomplex_t float _Complex
+        #define armpl_doublecomplex_t double _Complex
+    #endif
     #include <cblas.h>
 }
 #elif MSHADOW_USE_MKL
diff --git a/cd/python/docker/Dockerfile b/cd/python/docker/Dockerfile
index cbfd9e6..28d85cf 100644
--- a/cd/python/docker/Dockerfile
+++ b/cd/python/docker/Dockerfile
@@ -41,7 +41,7 @@ RUN if [ "$MXNET_VARIANT" = "aarch64_cpu" ] ; \
     tar -xvf arm-performance-libraries_21.0_Ubuntu-18.04_gcc-8.2.tar && \
     arm-performance-libraries_21.0_Ubuntu-18.04_gcc-8.2/arm-performance-libraries_21.0_Ubuntu-18.04.sh -a; \
     fi
-ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/arm/armpl_21.0_gcc-8.2/lib
+ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/arm/armpl_21.0_gcc-8.2/lib/
 
 ARG MXNET_COMMIT_ID
 ENV MXNET_COMMIT_ID=${MXNET_COMMIT_ID}
diff --git a/ci/docker/Dockerfile.publish.ubuntu1804_aarch64_cpu b/ci/docker/Dockerfile.publish.ubuntu1804_aarch64_cpu
index 129984c..f4da407 100644
--- a/ci/docker/Dockerfile.publish.ubuntu1804_aarch64_cpu
+++ b/ci/docker/Dockerfile.publish.ubuntu1804_aarch64_cpu
@@ -24,7 +24,7 @@ WORKDIR /work/deps
 
 COPY install/ubuntu_aarch64_publish.sh /work/
 RUN /work/ubuntu_aarch64_publish.sh
-ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/arm/armpl_21.0_gcc-8.2/lib
+ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/arm/armpl_21.0_gcc-8.2/lib/
 ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/gcc-8.5.0/lib64
 ENV PATH=${PATH}:/usr/local/gcc-8.5.0/bin
 
diff --git a/cmake/ChooseBlas.cmake b/cmake/ChooseBlas.cmake
index 3848a3c..24ba7ea 100644
--- a/cmake/ChooseBlas.cmake
+++ b/cmake/ChooseBlas.cmake
@@ -103,4 +103,12 @@ elseif(BLAS STREQUAL "apple")
   add_definitions(-DMSHADOW_USE_MKL=0)
   add_definitions(-DMSHADOW_USE_CBLAS=1)
   add_definitions(-DMXNET_USE_BLAS_APPLE=1)
+elseif(BLAS STREQUAL "armpl" OR BLAS STREQUAL "ArmPL")
+  find_package(ArmPL REQUIRED)
+  include_directories(SYSTEM ${ArmPL_INCLUDE_DIR})
+  list(APPEND mshadow_LINKER_LIBS ${ArmPL_LIBRARIES})
+  add_definitions(-DMSHADOW_USE_CBLAS=1)
+  add_definitions(-DMSHADOW_USE_MKL=0)
+  add_definitions(-DMSHADOW_USE_ARMPL=1)
+  add_definitions(-DMXNET_USE_LAPACK=1)
 endif()
diff --git a/cmake/Modules/FindArmPL.cmake b/cmake/Modules/FindArmPL.cmake
new file mode 100644
index 0000000..5ff4e44
--- /dev/null
+++ b/cmake/Modules/FindArmPL.cmake
@@ -0,0 +1,79 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Find the ARM Performance Libraries
+#
+# The following are set after configuration is done:
+#  ArmPL_FOUND
+#  ArmPL_INCLUDE_DIR
+#  ArmPL_LIBRARIES
+
+file(TO_CMAKE_PATH "$ENV{ArmPL_HOME}" ArmPL_HOME)
+
+SET(ArmPL_INCLUDE_SEARCH_PATHS
+        /opt/arm/armpl_21.0_gcc-8.2/include_lp64_mp
+        ${ArmPL_HOME}/include_lp64_mp
+)
+
+SET(ArmPL_LIB_SEARCH_PATHS
+	/opt/arm/armpl_21.0_gcc-8.2/lib
+        ${ArmPL_HOME}/lib
+)
+
+FIND_PATH(ArmPL_INCLUDE_DIR NAMES armpl.h PATHS ${ArmPL_INCLUDE_SEARCH_PATHS})
+FIND_LIBRARY(ArmPL_LIB NAMES armpl_lp64_mp PATHS ${ArmPL_LIB_SEARCH_PATHS})
+FIND_LIBRARY(MATH_LIB NAMES amath PATHS ${ArmPL_LIB_SEARCH_PATHS})
+FIND_LIBRARY(STRING_LIB NAMES astring PATHS ${ArmPL_LIB_SEARCH_PATHS})
+SET(ArmPL_LIBRARIES
+	${ArmPL_LIB}
+	${MATH_LIB}
+	${STRING_LIB}
+	/usr/local/gcc-8.5.0/lib64/libgfortran.so
+	/usr/lib/aarch64-linux-gnu/libm.so
+)
+
+SET(ArmPL_FOUND ON)
+
+#    Check include files
+IF(NOT ArmPL_INCLUDE_DIR)
+    SET(ArmPL_FOUND OFF)
+    MESSAGE(STATUS "Could not find ArmPL include. Turning ArmPL_FOUND off")
+ENDIF()
+
+#    Check libraries
+IF(NOT ArmPL_LIBRARIES)
+    SET(ArmPL_FOUND OFF)
+    MESSAGE(STATUS "Could not find ArmPL lib. Turning ArmPL_FOUND off")
+ENDIF()
+
+IF (ArmPL_FOUND)
+  IF (NOT ArmPL_FIND_QUIETLY)
+	  MESSAGE(STATUS "Found ArmPL libraries: ${ArmPL_LIBRARIES}")
+    MESSAGE(STATUS "Found ArmPL include: ${ArmPL_INCLUDE_DIR}")
+  ENDIF (NOT ArmPL_FIND_QUIETLY)
+ELSE (ArmPL_FOUND)
+  IF (ArmPL_FIND_REQUIRED)
+    MESSAGE(FATAL_ERROR "Could not find ArmPL")
+  ENDIF (ArmPL_FIND_REQUIRED)
+ENDIF (ArmPL_FOUND)
+
+MARK_AS_ADVANCED(
+    ArmPL_FOUND
+    ArmPL_INCLUDE_DIR
+    ArmPL_LIBRARIES
+)
+
diff --git a/config/distribution/linux_aarch64_cpu.cmake b/config/distribution/linux_aarch64_cpu.cmake
index f413451..26e7b2c 100644
--- a/config/distribution/linux_aarch64_cpu.cmake
+++ b/config/distribution/linux_aarch64_cpu.cmake
@@ -19,6 +19,7 @@ set(CMAKE_BUILD_TYPE "Distribution" CACHE STRING "Build type")
 set(CFLAGS "-march=armv8-a+crc+crypto -moutline-atomics" CACHE STRING "CFLAGS")
 set(CXXFLAGS "-march=armv8-a" CACHE STRING "CXXFLAGS")
 
+set(USE_BLAS ArmPL CACHE STRING "BLAS")
 set(USE_CUDA OFF CACHE BOOL "Build with CUDA support")
 set(USE_OPENCV ON CACHE BOOL "Build with OpenCV support")
 set(USE_OPENMP ON CACHE BOOL "Build with Openmp support")
@@ -40,3 +41,5 @@ set(MKLDNN_USE_ACL OFF CACHE BOOL "Integrate MKLDNN with Arm Compute Library")
 # APL can be downloaded from https://developer.arm.com/tools-and-software/server-and-hpc/downloads/arm-performance-libraries
 # Note that APL needs to be added to LD_LIBRARY_PATH
 set(MKLDNN_USE_APL ON CACHE BOOL "Integrate MKLDNN with Arm Performance Libraries")
+# Due to a MKLDNN bug we will need to manually set the ArmPL header
+set(BLAS_INCLUDE_DIR "/opt/arm/armpl_21.0_gcc-8.2/include_lp64_mp" CACHE STRING "Specifies BLAS include dir")
diff --git a/contrib/clojure-package/examples/infer/imageclassifier/scripts/get_resnet_18_data.sh b/contrib/clojure-package/examples/infer/imageclassifier/scripts/get_resnet_18_data.sh
index 1a142e8..bbb6eba 100755
--- a/contrib/clojure-package/examples/infer/imageclassifier/scripts/get_resnet_18_data.sh
+++ b/contrib/clojure-package/examples/infer/imageclassifier/scripts/get_resnet_18_data.sh
@@ -34,9 +34,9 @@ if [ ! -d "$image_path" ]; then
 fi
 
 if [ ! -f "$data_path/resnet-18-0000.params" ]; then
-    wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-symbol.json -P $data_path
-    wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-0000.params -P $data_path
-    wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/synset.txt -P $data_path
+    wget http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-symbol.json -P $data_path
+    wget http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-0000.params -P $data_path
+    wget http://data.mxnet.io/models/imagenet/synset.txt -P $data_path
 fi
 
 if [ ! -f "$image_path/kitten.jpg" ]; then
diff --git a/contrib/clojure-package/examples/infer/predictor/scripts/get_resnet_18_data.sh b/contrib/clojure-package/examples/infer/predictor/scripts/get_resnet_18_data.sh
index cf85355..423eb0b 100755
--- a/contrib/clojure-package/examples/infer/predictor/scripts/get_resnet_18_data.sh
+++ b/contrib/clojure-package/examples/infer/predictor/scripts/get_resnet_18_data.sh
@@ -34,9 +34,9 @@ if [ ! -d "$image_path" ]; then
 fi
 
 if [ ! -f "$data_path/resnet-18-0000.params" ]; then
-  wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-symbol.json -P $data_path
-  wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-0000.params -P $data_path
-  wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/synset.txt -P $data_path
+  wget http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-symbol.json -P $data_path
+  wget http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-0000.params -P $data_path
+  wget http://data.mxnet.io/models/imagenet/synset.txt -P $data_path
 fi
 
 if [ ! -f "$image_path/kitten.jpg" ]; then
diff --git a/contrib/clojure-package/scripts/infer/get_resnet_18_data.sh b/contrib/clojure-package/scripts/infer/get_resnet_18_data.sh
index 601f362..654d523 100755
--- a/contrib/clojure-package/scripts/infer/get_resnet_18_data.sh
+++ b/contrib/clojure-package/scripts/infer/get_resnet_18_data.sh
@@ -32,7 +32,7 @@ fi
 
 resnet_18_data_path="$data_path/resnet-18"
 if [ ! -f "$resnet_18_data_path/resnet-18-0000.params" ]; then
-    wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-symbol.json -P $resnet_18_data_path
-    wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-0000.params -P $resnet_18_data_path
-    wget https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/synset.txt -P $resnet_18_data_path
+    wget http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-symbol.json -P $resnet_18_data_path
+    wget http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-0000.params -P $resnet_18_data_path
+    wget http://data.mxnet.io/models/imagenet/synset.txt -P $resnet_18_data_path
 fi
diff --git a/scala-package/examples/scripts/infer/imageclassifier/get_resnet_18_data.sh b/scala-package/examples/scripts/infer/imageclassifier/get_resnet_18_data.sh
index b129932..c6967bb 100755
--- a/scala-package/examples/scripts/infer/imageclassifier/get_resnet_18_data.sh
+++ b/scala-package/examples/scripts/infer/imageclassifier/get_resnet_18_data.sh
@@ -34,8 +34,8 @@ if [ ! -d "$image_path" ]; then
 fi
 
 if [ ! -f "$data_path" ]; then
-  curl https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-symbol.json -o $data_path/resnet-18-symbol.json
-  curl https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/resnet-18-0000.params -o $data_path/resnet-18-0000.params
-  curl https://s3.us-east-2.amazonaws.com/scala-infer-models/resnet-18/synset.txt -o $data_path/synset.txt
+  curl http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-symbol.json -o $data_path/resnet-18-symbol.json
+  curl http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-0000.params -o $data_path/resnet-18-0000.params
+  curl http://data.mxnet.io/models/imagenet/synset.txt -o $data_path/synset.txt
   curl https://s3.us-east-2.amazonaws.com/mxnet-scala/scala-example-ci/resnet152/kitten.jpg -o $image_path/kitten.jpg
 fi
diff --git a/scala-package/examples/src/test/java/org/apache/mxnetexamples/javaapi/infer/predictor/PredictorExampleTest.java b/scala-package/examples/src/test/java/org/apache/mxnetexamples/javaapi/infer/predictor/PredictorExampleTest.java
index 30bc8db..337a566 100644
--- a/scala-package/examples/src/test/java/org/apache/mxnetexamples/javaapi/infer/predictor/PredictorExampleTest.java
+++ b/scala-package/examples/src/test/java/org/apache/mxnetexamples/javaapi/infer/predictor/PredictorExampleTest.java
@@ -38,13 +38,13 @@ public class PredictorExampleTest {
         String tempDirPath = System.getProperty("java.io.tmpdir");
         logger.info("tempDirPath: %s".format(tempDirPath));
 
-        String baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models";
+        String baseUrl = "http://data.mxnet.io/models/imagenet/";
 
-        Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-symbol.json",
+        Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-symbol.json",
                 tempDirPath + "/resnet18/resnet-18-symbol.json", 3);
-        Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-0000.params",
+        Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-0000.params",
                 tempDirPath + "/resnet18/resnet-18-0000.params", 3);
-        Util.downloadUrl(baseUrl + "/resnet-18/synset.txt",
+        Util.downloadUrl(baseUrl + "synset.txt",
                 tempDirPath + "/resnet18/synset.txt", 3);
         Util.downloadUrl("https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg",
                 tempDirPath + "/inputImages/resnet18/Pug-Cookie.jpg", 3);
diff --git a/scala-package/examples/src/test/scala/org/apache/mxnetexamples/benchmark/ScalaInferenceBenchmarkSuite.scala b/scala-package/examples/src/test/scala/org/apache/mxnetexamples/benchmark/ScalaInferenceBenchmarkSuite.scala
index 548f2e4..f36f64a 100644
--- a/scala-package/examples/src/test/scala/org/apache/mxnetexamples/benchmark/ScalaInferenceBenchmarkSuite.scala
+++ b/scala-package/examples/src/test/scala/org/apache/mxnetexamples/benchmark/ScalaInferenceBenchmarkSuite.scala
@@ -34,12 +34,12 @@ class ScalaInferenceBenchmarkSuite  extends FunSuite with BeforeAndAfterAll {
     logger.info("Downloading resnet-18 model")
     val tempDirPath = System.getProperty("java.io.tmpdir")
     logger.info("tempDirPath: %s".format(tempDirPath))
-    val baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models"
-    Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-symbol.json",
+    val baseUrl = "http://data.mxnet.io/models/imagenet/"
+    Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-symbol.json",
       tempDirPath + "/resnet18/resnet-18-symbol.json")
-    Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-0000.params",
+    Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-0000.params",
       tempDirPath + "/resnet18/resnet-18-0000.params")
-    Util.downloadUrl(baseUrl + "/resnet-18/synset.txt",
+    Util.downloadUrl(baseUrl + "synset.txt",
       tempDirPath + "/resnet18/synset.txt")
     Util.downloadUrl("https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg",
       tempDirPath + "/inputImages/resnet18/Pug-Cookie.jpg")
diff --git a/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/imageclassifier/ImageClassifierExampleSuite.scala b/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/imageclassifier/ImageClassifierExampleSuite.scala
index d7233a2..8ed733b 100644
--- a/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/imageclassifier/ImageClassifierExampleSuite.scala
+++ b/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/imageclassifier/ImageClassifierExampleSuite.scala
@@ -39,13 +39,13 @@ class ImageClassifierExampleSuite extends FunSuite with BeforeAndAfterAll {
     val tempDirPath = System.getProperty("java.io.tmpdir")
     logger.info("tempDirPath: %s".format(tempDirPath))
 
-    val baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models"
+    val baseUrl = "http://data.mxnet.io/models/imagenet/"
 
-    Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-symbol.json",
+    Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-symbol.json",
       tempDirPath + "/resnet18/resnet-18-symbol.json")
-    Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-0000.params",
+    Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-0000.params",
       tempDirPath + "/resnet18/resnet-18-0000.params")
-    Util.downloadUrl(baseUrl + "/resnet-18/synset.txt",
+    Util.downloadUrl(baseUrl + "synset.txt",
       tempDirPath + "/resnet18/synset.txt")
     Util.downloadUrl("https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg",
       tempDirPath + "/inputImages/resnet18/Pug-Cookie.jpg")
diff --git a/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/predictor/PredictorExampleSuite.scala b/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/predictor/PredictorExampleSuite.scala
index f04f06a..1f5deca 100644
--- a/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/predictor/PredictorExampleSuite.scala
+++ b/scala-package/examples/src/test/scala/org/apache/mxnetexamples/infer/predictor/PredictorExampleSuite.scala
@@ -36,13 +36,13 @@ class PredictorExampleSuite extends FunSuite with BeforeAndAfterAll {
     val tempDirPath = System.getProperty("java.io.tmpdir")
     logger.info("tempDirPath: %s".format(tempDirPath))
 
-    val baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models"
+    val baseUrl = "http://data.mxnet.io/models/imagenet/"
 
-    Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-symbol.json",
+    Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-symbol.json",
       tempDirPath + "/resnet18/resnet-18-symbol.json")
-    Util.downloadUrl(baseUrl + "/resnet-18/resnet-18-0000.params",
+    Util.downloadUrl(baseUrl + "resnet/18-layers/resnet-18-0000.params",
       tempDirPath + "/resnet18/resnet-18-0000.params")
-    Util.downloadUrl(baseUrl + "/resnet-18/synset.txt",
+    Util.downloadUrl(baseUrl + "synset.txt",
       tempDirPath + "/resnet18/synset.txt")
     Util.downloadUrl("https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg",
       tempDirPath + "/inputImages/resnet18/Pug-Cookie.jpg")
diff --git a/scala-package/mxnet-demo/java-demo/src/main/java/mxnet/ImageClassification.java b/scala-package/mxnet-demo/java-demo/src/main/java/mxnet/ImageClassification.java
index 8cb58da..e857897 100644
--- a/scala-package/mxnet-demo/java-demo/src/main/java/mxnet/ImageClassification.java
+++ b/scala-package/mxnet-demo/java-demo/src/main/java/mxnet/ImageClassification.java
@@ -46,12 +46,12 @@ public class ImageClassification {
 
     public static void downloadModelImage() {
         String tempDirPath = System.getProperty("java.io.tmpdir");
-        String baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models";
-        downloadUrl(baseUrl + "/resnet-18/resnet-18-symbol.json",
+        String baseUrl = "http://data.mxnet.io/models/imagenet/";
+        downloadUrl(baseUrl + "resnet/18-layers/resnet-18-symbol.json",
                 tempDirPath + "/resnet18/resnet-18-symbol.json");
-        downloadUrl(baseUrl + "/resnet-18/resnet-18-0000.params",
+        downloadUrl(baseUrl + "resnet/18-layers/resnet-18-0000.params",
                 tempDirPath + "/resnet18/resnet-18-0000.params");
-        downloadUrl(baseUrl + "/resnet-18/synset.txt",
+        downloadUrl(baseUrl + "synset.txt",
                 tempDirPath + "/resnet18/synset.txt");
         downloadUrl("https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg",
                 tempDirPath + "/inputImages/resnet18/Pug-Cookie.jpg");
diff --git a/scala-package/mxnet-demo/scala-demo/src/main/scala/sample/ImageClassificationExample.scala b/scala-package/mxnet-demo/scala-demo/src/main/scala/sample/ImageClassificationExample.scala
index bb6114d..131cf21 100644
--- a/scala-package/mxnet-demo/scala-demo/src/main/scala/sample/ImageClassificationExample.scala
+++ b/scala-package/mxnet-demo/scala-demo/src/main/scala/sample/ImageClassificationExample.scala
@@ -49,17 +49,17 @@ object ImageClassificationExample {
     val imgURL = "https://s3.amazonaws.com/model-server/inputs/Pug-Cookie.jpg"
     downloadUrl(imgURL, imgPath)
 
-    val baseUrl = "https://s3.us-east-2.amazonaws.com/scala-infer-models"
+    val baseUrl = "http://data.mxnet.io/models/imagenet/"
     var tmpPath = tempDirPath + "/resnet18/resnet-18-symbol.json"
-    var tmpUrl = baseUrl + "/resnet-18/resnet-18-symbol.json"
+    var tmpUrl = baseUrl + "resnet/18-layers/resnet-18-symbol.json"
     downloadUrl(tmpUrl, tmpPath)
 
     tmpPath = tempDirPath + "/resnet18/resnet-18-0000.params"
-    tmpUrl = baseUrl + "/resnet-18/resnet-18-0000.params"
+    tmpUrl = baseUrl + "resnet/18-layers/resnet-18-0000.params"
     downloadUrl(tmpUrl, tmpPath)
 
     tmpPath = tempDirPath + "/resnet18/synset.txt"
-    tmpUrl = baseUrl + "/resnet-18/synset.txt"
+    tmpUrl = baseUrl + "synset.txt"
     downloadUrl(tmpUrl, tmpPath)
 
     (imgPath, tempDirPath + "/resnet18/resnet-18")
diff --git a/src/operator/c_lapack_api.h b/src/operator/c_lapack_api.h
index 8b07265..698822b 100644
--- a/src/operator/c_lapack_api.h
+++ b/src/operator/c_lapack_api.h
@@ -70,8 +70,8 @@
 
 using namespace mshadow;
 
-// Will cause clash with MKL fortran layer headers
-#if MSHADOW_USE_MKL == 0
+// Will cause clash with MKL/ArmPL fortran layer headers
+#if (!MSHADOW_USE_MKL && !MSHADOW_USE_ARMPL)
 
 extern "C" {
 
@@ -199,7 +199,7 @@ extern "C" {
   MXNET_LAPACK_FSIG_GEEV(dgeev, double)
 }
 
-#endif  // MSHADOW_USE_MKL == 0
+#endif  // (!MSHADOW_USE_MKL && !MSHADOW_USE_ARMPL)
 
 
 #define CHECK_LAPACK_UPLO(a) \
@@ -228,11 +228,13 @@ inline void flip(int m, int n, DType *b, int ldb, DType *a, int lda) {
 }
 
 
-#if (MSHADOW_USE_MKL && MXNET_USE_LAPACK)
+#if (MXNET_USE_LAPACK && (MSHADOW_USE_MKL || MSHADOW_USE_ARMPL))
 
-  // We interface with the C-interface of MKL
-  // as this is the preferred way.
-  #include <mkl_lapacke.h>
+  #if (MSHADOW_USE_MKL)
+    // We interface with the C-interface of MKL
+    // as this is the preferred way.
+    #include <mkl_lapacke.h>
+  #endif
 
   #define MXNET_LAPACK_ROW_MAJOR LAPACK_ROW_MAJOR
   #define MXNET_LAPACK_COL_MAJOR LAPACK_COL_MAJOR
diff --git a/tools/staticbuild/build.sh b/tools/staticbuild/build.sh
index e5ce595..1306dce 100755
--- a/tools/staticbuild/build.sh
+++ b/tools/staticbuild/build.sh
@@ -59,7 +59,11 @@ else
     export PKG_CONFIG_PATH=$DEPS_PATH/lib/pkgconfig:$DEPS_PATH/lib64/pkgconfig:$DEPS_PATH/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
 fi
 export FC="gfortran"
-export CPATH=$DEPS_PATH/include:$CPATH
+if [[ $ARCH == 'aarch64' ]]; then
+    export CPATH=/opt/arm/armpl_21.0_gcc-8.2/include_lp64_mp:$CPATH
+else
+    export CPATH=$DEPS_PATH/include:$CPATH
+fi
 
 if [[ $PLATFORM == 'linux' && $VARIANT == cu* ]]; then
     source tools/setup_gpu_build_tools.sh $VARIANT $DEPS_PATH
diff --git a/tools/staticbuild/build_lib_cmake.sh b/tools/staticbuild/build_lib_cmake.sh
index ade6b7a..a29c393 100755
--- a/tools/staticbuild/build_lib_cmake.sh
+++ b/tools/staticbuild/build_lib_cmake.sh
@@ -39,8 +39,10 @@ cd -
 rm -rf lib; mkdir lib;
 if [[ $PLATFORM == 'linux' ]]; then
     cp -L build/libmxnet.so lib/libmxnet.so
-    cp -L staticdeps/lib/libopenblas.so lib/libopenblas.so.0
     cp -L $(ldd lib/libmxnet.so | grep libgfortran | awk '{print $3}') lib/
+    if [[ ! $ARCH == 'aarch64' ]]; then
+        cp -L staticdeps/lib/libopenblas.so lib/libopenblas.so.0
+    fi
 elif [[ $PLATFORM == 'darwin' ]]; then
     cp -L build/libmxnet.dylib lib/libmxnet.dylib
 fi