Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

Static build instruction for MXNet in general #13914

Merged
merged 5 commits into from
Jan 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions ci/docker/runtime_functions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1285,6 +1285,16 @@ deploy_jl_docs() {
# ...
}

build_scala_static_mkl() {
set -ex
pushd .
scala_prepare
export MAVEN_PUBLISH_OS_TYPE=linux-x86_64-cpu
export mxnet_variant=mkl
./ci/publish/scala/build.sh
popd
}

publish_scala_build() {
set -ex
pushd .
Expand Down
13 changes: 13 additions & 0 deletions ci/jenkins/Jenkins_steps.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,19 @@ def compile_windows_gpu_mkldnn() {
}]
}

def test_static_scala_cpu() {
return ['Static build CPU 14.04 Scala' : {
node(NODE_LINUX_CPU) {
ws('workspace/ut-publish-scala-cpu') {
timeout(time: max_time, unit: 'MINUTES') {
utils.init_git()
utils.docker_run("publish.ubuntu1404_cpu", 'build_scala_static_mkl', false)
}
}
}
}]
}

def test_unix_python2_cpu() {
return ['Python2: CPU': {
node(NODE_LINUX_CPU) {
Expand Down
1 change: 1 addition & 0 deletions ci/jenkins/Jenkinsfile_unix_cpu
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ core_logic: {
custom_steps.test_unix_julia10_cpu(),
custom_steps.test_unix_onnx_cpu(),
custom_steps.test_unix_cpp_cpu(),
custom_steps.test_static_scala_cpu(),
/* Disabled due to master build failure:
* http://jenkins.mxnet-ci.amazon-ml.com/blue/organizations/jenkins/incubator-mxnet/detail/master/1221/pipeline/
* https://github.com/apache/incubator-mxnet/issues/11801
Expand Down
4 changes: 2 additions & 2 deletions ci/publish/Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ utils.assign_node_labels(utility: 'restricted-utility', linux_cpu: 'restricted-m
// CPU and GPU. OSX nodes are not currently supported by Jenkins
def nodeMap = ['cpu': NODE_LINUX_CPU, 'gpu': NODE_LINUX_GPU_P3]
def scalaOSMap = ['cpu': 'linux-x86_64-cpu', 'gpu': 'linux-x86_64-gpu']
def scalaVariantMap = ['cpu': 'cpu', 'gpu': 'cu92']
def scalaVariantMap = ['cpu': 'mkl', 'gpu': 'cu92mkl']

def wrapStep(nodeToRun, workspaceName, step) {
return {
Expand Down Expand Up @@ -84,7 +84,7 @@ for (x in labels) {
toDeploy["Scala Deploy ${label}"] = wrapStep(nodeMap['cpu'], "deploy-scala-${label}") {
withEnv(["MAVEN_PUBLISH_OS_TYPE=${scalaOSMap[label]}", "mxnet_variant=${scalaVariantMap[label]}"]) {
utils.unpack_and_init("scala_${label}", mx_scala_pub, false)
utils.docker_run("publish.ubuntu1604_cpu", 'publish_scala_deploy', false, '500m', 'MAVEN_PUBLISH_OS_TYPE MAVEN_PUBLISH_SECRET_ENDPOINT_URL MAVEN_PUBLISH_SECRET_NAME_CREDENTIALS MAVEN_PUBLISH_SECRET_NAME_GPG DOCKERHUB_SECRET_ENDPOINT_REGION mxnet_variant')
utils.docker_run("publish.ubuntu1604_${label}", 'publish_scala_deploy', false, '500m', 'MAVEN_PUBLISH_OS_TYPE MAVEN_PUBLISH_SECRET_ENDPOINT_URL MAVEN_PUBLISH_SECRET_NAME_CREDENTIALS MAVEN_PUBLISH_SECRET_NAME_GPG DOCKERHUB_SECRET_ENDPOINT_REGION mxnet_variant')
}
}
}
Expand Down
33 changes: 33 additions & 0 deletions ci/publish/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# MXNet Publish Settings

This folder contains the configuration of restricted node on Jenkins for the publish. It also contains a folder called `scala` that contains everything required for scala publish. In this `README`, we would bring a brief walkthrough of the Jenkins configuration as well as the usages of the scala deployment files.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This folder contains the configuration of restricted node on Jenkins for the publish. It also contains a folder called `scala` that contains everything required for scala publish. In this `README`, we would bring a brief walkthrough of the Jenkins configuration as well as the usages of the scala deployment files.
This folder contains the configuration for restricted nodes on Jenkins for the publishing MXNet artifacts. It also contains a folder called `scala` that contains everything required for publishing to Maven. In this `README`, we provide a brief walkthrough of the Jenkins configuration as well as the usage of the Scala deployment files. Python publishing is TBD.


## Jenkins
Currently, Jenkins contains three build stages, namely `Build Packages`, `Test Packages` and `Deploy Packages`. During the `build package` stages, all dependencies will be built and a Scala package would be created. In the second stage, the package created from the previous stage would move to this stage to specifically run the tests. In the final stage, the packages passed the test would be deployed by the instances.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Currently, Jenkins contains three build stages, namely `Build Packages`, `Test Packages` and `Deploy Packages`. During the `build package` stages, all dependencies will be built and a Scala package would be created. In the second stage, the package created from the previous stage would move to this stage to specifically run the tests. In the final stage, the packages passed the test would be deployed by the instances.
Currently, Jenkins contains three build stages, namely `Build Packages`, `Test Packages` and `Deploy Packages`. During the `build package` stages, all dependencies are built and a Scala package are created. In the second stage, the package created from the previous stage moves to this stage to specifically run the tests. In the final stage, the packages that pass the tests are deployed by the instances.


The job is scheduled to be triggered every 24 hours on a [restricted instance](http://jenkins.mxnet-ci.amazon-ml.com/blue/organizations/jenkins/restricted-publish-artifacts).

Currently, we are supporting tests in the following systems:

- Ubuntu 16.04
- Ubuntu 18.04
- Cent OS 7

All packages are currently built in `Ubuntu 14.04`. All Dockerfile used for publishing are available in `ci/docker/` with prefix `Dockerfile.publish`.

Apart from that, the script used to create the environment and publish are available under `ci/docker/install`:

- `ubuntu_publish.sh` install all required dependencies for Ubuntu 14.04 for publishing
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- `ubuntu_publish.sh` install all required dependencies for Ubuntu 14.04 for publishing
- `ubuntu_publish.sh` installs all required dependencies for Ubuntu 14.04 for publishing

- `ubuntu_base.sh` install minimum dependencies required to run the published packages
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- `ubuntu_base.sh` install minimum dependencies required to run the published packages
- `ubuntu_base.sh` installs minimum dependencies required to run the published packages


## Scala publish
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## Scala publish
## Scala Publishing

Currently Scala publish on Linux is fully supported on jenkins. The `scala/` folder contains all files needed to do the publish. Here is a breif instroduction of the files:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Currently Scala publish on Linux is fully supported on jenkins. The `scala/` folder contains all files needed to do the publish. Here is a breif instroduction of the files:
Currently Scala publish on Linux is fully supported on Jenkins. The `scala/` folder contains all files needed for publishing. Here is a brief introduction of the files:


- `build.sh` Main executable files to build the backend as well as scala package
- `buildkey.py` Main file used to extract password from the system and configure the maven
- `deploy.sh` Script to deploy the package
- `fullDeploy.sh` Used by CI to make full publish
- `test.sh` Make Scala test on CI

## Python
We plans to support Python build on Jenkins soon
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
We plans to support Python build on Jenkins soon
Python build support is TBD.

Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ DEBUG = 0
USE_PROFILER = 1

# whether to turn on signal handler (e.g. segfault logger)
USE_SIGNAL_HANDLER = 0
USE_SIGNAL_HANDLER = 1

# the additional link flags you want to add
ADD_LDFLAGS += -L$(DEPS_PATH)/lib -lpng -ltiff -lz -framework CoreFoundation -framework Security -Wl,-exported_symbols_list,$(CURDIR)/make/config/libmxnet.sym,-rpath,'$${ORIGIN}',-dead_strip
Expand Down Expand Up @@ -87,7 +87,7 @@ USE_LIBJPEG_TURBO = 1
# Please refer to MKL_README.md for details

# whether use MKL-DNN library
USE_MKLDNN = 0
USE_MKLDNN = 1

# MKL ML Library folder, need to be root for /usr/local
# Change to User Home directory for standard user
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ DEBUG = 0
USE_PROFILER = 1

# whether to turn on signal handler (e.g. segfault logger)
USE_SIGNAL_HANDLER = 0
USE_SIGNAL_HANDLER = 1

# the additional link flags you want to add
ADD_LDFLAGS += -L$(DEPS_PATH)/lib $(DEPS_PATH)/lib/libculibos.a -lpng -ltiff -ljpeg -lz -ldl -lgfortran -Wl,--version-script=$(CURDIR)/make/config/libmxnet.ver,-rpath,'$${ORIGIN}',--gc-sections
Expand Down Expand Up @@ -86,7 +86,7 @@ USE_OPERATOR_TUNING = 1
USE_LIBJPEG_TURBO = 1

# whether use MKL-DNN library
USE_MKLDNN = 0
USE_MKLDNN = 1


# MKL ML Library for Intel CPU/Xeon Phi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ DEBUG = 0
USE_PROFILER = 1

# whether to turn on signal handler (e.g. segfault logger)
USE_SIGNAL_HANDLER = 0
USE_SIGNAL_HANDLER = 1

# the additional link flags you want to add
ADD_LDFLAGS += -L$(DEPS_PATH)/lib $(DEPS_PATH)/lib/libculibos.a -lpng -ltiff -ljpeg -lz -ldl -lgfortran -Wl,--version-script=$(CURDIR)/make/config/libmxnet.ver,-rpath,'$${ORIGIN}',--gc-sections
Expand Down Expand Up @@ -86,7 +86,7 @@ USE_OPERATOR_TUNING = 1
USE_LIBJPEG_TURBO = 1

# whether use MKL-DNN library
USE_MKLDNN = 0
USE_MKLDNN = 1


# MKL ML Library for Intel CPU/Xeon Phi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ DEBUG = 0
USE_PROFILER = 1

# whether to turn on signal handler (e.g. segfault logger)
USE_SIGNAL_HANDLER = 0
USE_SIGNAL_HANDLER = 1

# the additional link flags you want to add
ADD_LDFLAGS += -L$(DEPS_PATH)/lib -lpng -ltiff -ljpeg -lz -lgfortran -ldl -Wl,--version-script=$(CURDIR)/make/config/libmxnet.ver,-rpath,'$${ORIGIN}',--gc-sections
Expand Down Expand Up @@ -83,7 +83,7 @@ USE_OPERATOR_TUNING = 1
USE_LIBJPEG_TURBO = 1

# whether use MKL-DNN library
USE_MKLDNN = 0
USE_MKLDNN = 1


# MKL ML Library for Intel CPU/Xeon Phi
Expand Down
11 changes: 11 additions & 0 deletions tools/dependencies/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,14 @@ The scripts use the following environment variables for setting behavior:
`PLATFORM`: name of the OS in lower case. Supported options are 'linux' and 'darwin'.

It also expects the following build tools in path: make, cmake, tar, unzip, autoconf, nasm

# FAQ

## Build failure regarding to gcc, g++, gfortran
Currently, we only support gcc-4.8 build. It's your own choice to use a higher version of gcc. Please make sure your gcc, g++ and gfortran always have the same version in order to eliminate build failure.

## idn2 not found
This issue appeared in the OSX build with XCode version 8.0 above (reproduced on 9.2). Please add the following build flag in `curl.sh` if your XCode version is more than 8.0:
```
--without-libidn2
```
32 changes: 32 additions & 0 deletions tools/staticbuild/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# MXNet Static build
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# MXNet Static build
# MXNet Static Build


This folder contains the core script used to build the static library. This README would bring you the information and usages of the script in here. Please be aware, all of the scripts are designed to be run under the root folder.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This folder contains the core script used to build the static library. This README would bring you the information and usages of the script in here. Please be aware, all of the scripts are designed to be run under the root folder.
This folder contains the core script used to build the static library. This README provides information on how to use the scripts in this folder. Please be aware, all of the scripts are designed to be run under the root folder.


## `build.sh`
This script is a wrapper around `build_lib.sh` aimed to simplify the usage of it. It would automatically identify the system version, number of cores and all environment variable settings. Here are the examples you can run this script:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This script is a wrapper around `build_lib.sh` aimed to simplify the usage of it. It would automatically identify the system version, number of cores and all environment variable settings. Here are the examples you can run this script:
This script is a wrapper around `build_lib.sh. It simplifies the things by automatically identifing the system version, number of cores, and all environment variable settings. Here are examples you can run with this script:


```
tools/staticbuild/build.sh cu92 maven
```
This would build the mxnet package based on CUDA9.2 and Maven (Scala) build setttings.
```
tools/staticbuild/build.sh mkl pip
```
This would build the mxnet package based on MKLDNN and and pypi configuration settings.

As the result, users would have a complete static dependencies in `/staticdeps` in the root folder as well as a static-linked `libmxnet.so` file lives in `lib`. You can build your language binding by using the `libmxnet.so`.

## `build_lib.sh`
This script would clone the most up-to-date master and build the MXNet backend with static library. In order to run that, you should have prepare the the following environment variable:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This script would clone the most up-to-date master and build the MXNet backend with static library. In order to run that, you should have prepare the the following environment variable:
This script clones the most up-to-date master and builds the MXNet backend with a static library. In order to run the static library, you must set the the following environment variables:


- `DEPS_PATH` Path to your static dependencies
- `STATIC_BUILD_TARGET` Either `pip` or `maven` as your publish platform
- `PLATFORM` linux, darwin
- `VARIANT` cpu, cu*, cu*mkl, mkl

It is not recommended to run this file alone since there are a bunch of variables need to be set.

After running this script, you would have everything you need ready in the `/lib` folder.

## `build_wheel.sh`
This script is used to build the python package as well as running a sanity test
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This script is used to build the python package as well as running a sanity test
This script builds the python package. It also runs a sanity test.

7 changes: 0 additions & 7 deletions tools/staticbuild/build_lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,6 @@ if [[ $VARIANT == *mkl ]]; then
cp 3rdparty/mkldnn/LICENSE ./MKLML_LICENSE
fi

if [[ $VARIANT == *mkl ]]; then
>&2 echo "Copying MKL license."
rm lib/libmkldnn.{so,dylib}
rm lib/libmkldnn.0.*.dylib
rm lib/libmkldnn.so.0.*
fi

>&2 echo "Now building mxnet..."
$MAKE DEPS_PATH=$DEPS_PATH

Expand Down