diff --git a/docker/docker-python/Dockerfile.mxnet.python.cpu b/docker/docker-python/Dockerfile.mxnet.python.cpu index eb437f3c2334..0858e99e2d7d 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.cpu +++ b/docker/docker-python/Dockerfile.mxnet.python.cpu @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for CPU FROM ubuntu:16.04 +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet +RUN pip install mxnet==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.cpu.mkl b/docker/docker-python/Dockerfile.mxnet.python.cpu.mkl index 043932ff7c8e..dbb7d29f5037 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.cpu.mkl +++ b/docker/docker-python/Dockerfile.mxnet.python.cpu.mkl @@ -19,10 +19,11 @@ # Dockerfile to build MXNet CPU with MKL FROM ubuntu:16.04 +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-mkl +RUN pip install mxnet-mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80 b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80 index 8c83ece434a3..cb22721f48b9 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80 +++ b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80 @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for GPU FROM nvidia/cuda:8.0-cudnn5-devel +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-cu80 +RUN pip install mxnet-cu80==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80.mkl b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80.mkl index a057c1d20cb1..eda96c90d181 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80.mkl +++ b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu80.mkl @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for GPU with MKL FROM nvidia/cuda:8.0-cudnn5-devel +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-cu80mkl +RUN pip install mxnet-cu80mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90 b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90 index 1e3d9869ac63..cd36b8afdbd8 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90 +++ b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90 @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for GPU FROM nvidia/cuda:9.0-cudnn7-devel +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-cu90 +RUN pip install mxnet-cu90==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90.mkl b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90.mkl index d82abd7cf523..0b274c4e0d3f 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90.mkl +++ b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu90.mkl @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for GPU with MKL FROM nvidia/cuda:9.0-cudnn7-devel +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-cu90mkl +RUN pip install mxnet-cu90mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92 b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92 index ba5c54a2a2aa..2c43187faf79 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92 +++ b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92 @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for GPU FROM nvidia/cuda:9.2-cudnn7-devel +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-cu92 +RUN pip install mxnet-cu92==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92.mkl b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92.mkl index 96a943980b59..db204897ef60 100644 --- a/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92.mkl +++ b/docker/docker-python/Dockerfile.mxnet.python.gpu.cu92.mkl @@ -19,10 +19,11 @@ # Dockerfile to build MXNet for GPU with MKL FROM nvidia/cuda:9.2-cudnn7-devel +ARG version -RUN apt-get update -RUN apt-get install -y wget python gcc -RUN wget https://bootstrap.pypa.io/get-pip.py -RUN python get-pip.py +RUN apt-get update && \ + apt-get install -y wget python-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python get-pip.py -RUN pip install mxnet-cu92mkl +RUN pip install mxnet-cu92mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.cpu b/docker/docker-python/Dockerfile.mxnet.python3.cpu new file mode 100644 index 000000000000..8ad9950a2f21 --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.cpu @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for CPU + +FROM ubuntu:16.04 +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.cpu.mkl b/docker/docker-python/Dockerfile.mxnet.python3.cpu.mkl new file mode 100644 index 000000000000..c6312891c6ea --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.cpu.mkl @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet CPU with MKL + +FROM ubuntu:16.04 +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu80 b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu80 new file mode 100644 index 000000000000..58af6bfeb273 --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu80 @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for GPU + +FROM nvidia/cuda:8.0-cudnn5-devel +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-cu80==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu80.mkl b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu80.mkl new file mode 100644 index 000000000000..059f002c8560 --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu80.mkl @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for GPU with MKL + +FROM nvidia/cuda:8.0-cudnn5-devel +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-cu80mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu90 b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu90 new file mode 100644 index 000000000000..a860de918054 --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu90 @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for GPU + +FROM nvidia/cuda:9.0-cudnn7-devel +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-cu90==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu90.mkl b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu90.mkl new file mode 100644 index 000000000000..c0b6145b28e7 --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu90.mkl @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for GPU with MKL + +FROM nvidia/cuda:9.0-cudnn7-devel +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-cu90mkl==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu92 b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu92 new file mode 100644 index 000000000000..6d877961db9f --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu92 @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for GPU + +FROM nvidia/cuda:9.2-cudnn7-devel +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-cu92==$version diff --git a/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu92.mkl b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu92.mkl new file mode 100644 index 000000000000..b73df97e5950 --- /dev/null +++ b/docker/docker-python/Dockerfile.mxnet.python3.gpu.cu92.mkl @@ -0,0 +1,29 @@ +# -*- mode: dockerfile -*- +# 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. +# +# Dockerfile to build MXNet for GPU with MKL + +FROM nvidia/cuda:9.2-cudnn7-devel +ARG version + +RUN apt-get update && \ + apt-get install -y wget python3-dev gcc && \ + wget https://bootstrap.pypa.io/get-pip.py && \ + python3 get-pip.py + +RUN pip3 install mxnet-cu92mkl==$version diff --git a/docker/docker-python/README.md b/docker/docker-python/README.md index 6d17c50439ae..767be6d1eb33 100644 --- a/docker/docker-python/README.md +++ b/docker/docker-python/README.md @@ -19,31 +19,40 @@ # Release Python Docker Images for MXNet -The `docker-python` directory can be used to release mxnet python docker images to dockerhub after any mxnet release. -It uses the appropriate pip binaries to build different docker images as - -* cpu -* cpu_mkl -* latest (same as cpu) -* gpu_cu90 -* gpu_cu90_mkl -* gpu (same as gpu_cu90) -* gpu_cu80 -* gpu_cu80_mkl -* gpu_cu92 -* gpu_cu92_mkl - - -** Note: If you want to use a different pip binary (specific mxnet or cuda version, etc), you can edit the last line of the cpu or gpu dockerfile as required. +The `docker-python` directory can be used to release mxnet python docker images to dockerhub after any mxnet release. +It uses the appropriate pip binaries to build different docker images. Both python2 (default) and python3 images are available as - +* {version}_cpu +* {version}_cpu_mkl +* {version}_gpu_cu90 +* {version}_gpu_cu90_mkl +* {version}_gpu_cu80 +* {version}_gpu_cu80_mkl +* {version}_gpu_cu92 +* {version}_gpu_cu92_mkl +* {version}_cpu_py3 +* {version}_cpu_mkl_py3 +* {version}_gpu_cu90_py3 +* {version}_gpu_cu90_mkl_py3 +* {version}_gpu_cu80_py3 +* {version}_gpu_cu80_mkl_py3 +* {version}_gpu_cu92_py3 +* {version}_gpu_cu92_mkl_py3 -Refer: https://pypi.org/project/mxnet/ +And the following tags will be available without the version string in the image name (for Benchmarking and other use cases): +* latest (same as {version}_cpu) +* gpu (same as {version}_gpu_cu90) +* latest_cpu_mkl_py2 (same as {version}_cpu_mkl) +* latest_cpu_mkl_py3 (same as {version}_cpu_mkl_py3) +* latest_gpu_mkl_py2 (same as {version}_gpu_cu90_mkl) +* latest_gpu_mkl_py3 (same as {version}_gpu_cu90_mkl_py3) -### Usage -`./build_python_dockerfile.sh ` +Refer: https://pypi.org/project/mxnet/ -For example: -`./build_python_dockerfile.sh 1.3.0 ~/build-docker/incubator-mxnet` +### Using the Build Script +`./build_python_dockerfile.sh ` -** Note: The build script picks up the latest pip binaries. This means it uses the latest released mxnet version. The version specified as a parameter to the script is only used to tag the built image correctly. +For example: +`./build_python_dockerfile.sh 1.3.0 1.3.0.post0 ~/build-docker/incubator-mxnet` ### Tests run * [test_conv.py](https://github.com/apache/incubator-mxnet/blob/master/tests/python/train/test_conv.py) @@ -58,3 +67,10 @@ Credentials can be provided in the following ways: * **Set Environment Variables:** Set the following environment variables which the script will pick up to login to dockerhub at runtime - * $MXNET_DOCKERHUB_PASSWORD * $MXNET_DOCKERHUB_USERNAME + + +### Using the Docker Images +* The MXNet Python Docker images can be found here: https://hub.docker.com/r/mxnet/python/ + +* Docker Pull Command: `docker pull mxnet/python:` +* Get started: `docker run -it mxnet/python: bash` diff --git a/docker/docker-python/build_python_dockerfile.sh b/docker/docker-python/build_python_dockerfile.sh index 24a44c28970c..d0f24c8d6a5e 100755 --- a/docker/docker-python/build_python_dockerfile.sh +++ b/docker/docker-python/build_python_dockerfile.sh @@ -17,20 +17,19 @@ # specific language governing permissions and limitations # under the License. -set -e - # Check Params programname=$0 function usage { - echo "usage: $programname [version] [path]" + echo "usage: $programname [version] [pip_tag] [path]" echo " [version] Mxnet Version to build" + echo " [pip_tag] Pip Tag to use" echo " [path] Path to MXNet repository (to run tests)" echo " " exit 1 } -if [ $# -le 1 ] || [ $# -ge 3 ] +if [ $# -le 2 ] || [ $# -ge 4 ] then usage exit 1 @@ -39,29 +38,37 @@ fi # Two params provided echo "Building Docker Images for Apache MXNet (Incubating) v$1" mxnet_version="${1}" -test_dir="${2}" +pip_tag="${2}" +test_dir="${3}" -docker_build_image(){ - echo "Building docker image mxnet/python:${1}" - docker build -t mxnet/python:${1} -f ${2} . -} +# Remove the logs directory if it already exists else it may fail due to old logs. +LOGDIR=~/temp/docker_logs +if [ -d "${LOGDIR}" ]; then + rm -rf ${LOGDIR} +fi + +# Create ~/temp if it does not exist +mkdir -p ~/temp +mkdir ${LOGDIR} -docker_tag_image(){ - docker tag mxnet/python:${1} mxnet/python:${2} -} +# Functions docker_test_image_cpu(){ - echo "Running tests on mxnet/python:${1}" - docker run -v ${test_dir}:/mxnet mxnet/python:${1} bash -c "python /mxnet/docker/docker-python/test_mxnet.py ${mxnet_version}" - docker run -v ${test_dir}:/mxnet mxnet/python:${1} bash -c "python /mxnet/tests/python/train/test_conv.py" - docker run -v ${test_dir}:/mxnet mxnet/python:${1} bash -c "python /mxnet/example/image-classification/train_mnist.py" + image_tag="${1}" + python_version="${2}" + echo "Running tests on mxnet/python:${image_tag}" + docker run -v ${test_dir}:/mxnet mxnet/python:${image_tag} bash -c "${python_version} /mxnet/docker/docker-python/test_mxnet.py ${mxnet_version}" + docker run -v ${test_dir}:/mxnet mxnet/python:${image_tag} bash -c "${python_version} /mxnet/tests/python/train/test_conv.py" + docker run -v ${test_dir}:/mxnet mxnet/python:${image_tag} bash -c "${python_version} /mxnet/example/image-classification/train_mnist.py" } docker_test_image_gpu(){ + image_tag="${1}" + python_version="${2}" echo "Running tests on mxnet/python:${1}" - nvidia-docker run -v ${test_dir}:/mxnet mxnet/python:${1} bash -c "python /mxnet/docker/docker-python/test_mxnet.py ${mxnet_version}" - nvidia-docker run -v ${test_dir}:/mxnet mxnet/python:${1} bash -c "python /mxnet/tests/python/train/test_conv.py --gpu" - nvidia-docker run -v ${test_dir}:/mxnet mxnet/python:${1} bash -c "python /mxnet/example/image-classification/train_mnist.py --gpus 2" + nvidia-docker run -v ${test_dir}:/mxnet mxnet/python:${image_tag} bash -c "${python_version} /mxnet/docker/docker-python/test_mxnet.py ${mxnet_version}" + nvidia-docker run -v ${test_dir}:/mxnet mxnet/python:${image_tag} bash -c "${python_version} /mxnet/tests/python/train/test_conv.py --gpu" + nvidia-docker run -v ${test_dir}:/mxnet mxnet/python:${image_tag} bash -c "${python_version} /mxnet/example/image-classification/train_mnist.py --gpus 0,1,2,3" } # if both $MXNET_DOCKERHUB_PASSWORD and $MXNET_DOCKERHUB_USERNAME environment variables are set, docker will automatically login @@ -79,59 +86,132 @@ docker_account_logout(){ } docker_push_image(){ - docker push mxnet/python:${1} + image_tag="${1}" + docker push mxnet/python:${image_tag} } +docker_generate_image_cpu(){ + image_tag="${1}" + dockerfile="${2}" + python_version="${3}" + echo "Building docker image mxnet/python:${image_tag}" + docker build --build-arg version=${pip_tag} -t mxnet/python:${image_tag} -f ${dockerfile} . + docker_test_image_cpu ${image_tag} ${python_version} +} -# Build and Test dockerfiles - CPU -docker_build_image "${mxnet_version}_cpu" "Dockerfile.mxnet.python.cpu" -docker_test_image_cpu "${mxnet_version}_cpu" - -docker_build_image "${mxnet_version}_cpu_mkl" "Dockerfile.mxnet.python.cpu.mkl" -docker_test_image_cpu "${mxnet_version}_cpu_mkl" - -docker_tag_image "${mxnet_version}_cpu" "latest" -docker_test_image_cpu "latest" - - -#Build and Test dockerfiles - GPU -docker_build_image "${mxnet_version}_gpu_cu90" "Dockerfile.mxnet.python.gpu.cu90" -docker_test_image_gpu "${mxnet_version}_gpu_cu90" - -docker_build_image "${mxnet_version}_gpu_cu90_mkl" "Dockerfile.mxnet.python.gpu.cu90.mkl" -docker_test_image_gpu "${mxnet_version}_gpu_cu90_mkl" +docker_tag_image_cpu(){ + original_tag="${1}" + image_tag="${2}" + python_version="${3}" + docker tag mxnet/python:${original_tag} mxnet/python:${image_tag} + docker_test_image_cpu ${image_tag} ${python_version} +} -docker_tag_image "${mxnet_version}_gpu_cu90" "gpu" -docker_test_image_gpu "gpu" +docker_generate_image_gpu(){ + image_tag="${1}" + dockerfile="${2}" + python_version="${3}" + echo "Building docker image mxnet/python:${1}" + docker build --build-arg version=${pip_tag} -t mxnet/python:${image_tag} -f ${dockerfile} . + docker_test_image_gpu ${image_tag} ${python_version} +} -docker_build_image "${mxnet_version}_gpu_cu80" "Dockerfile.mxnet.python.gpu.cu80" -docker_test_image_gpu "${mxnet_version}_gpu_cu80" +docker_tag_image_gpu(){ + original_tag="${1}" + image_tag="${2}" + python_version="${3}" + docker tag mxnet/python:${original_tag} mxnet/python:${image_tag} + docker_test_image_gpu ${image_tag} ${python_version} +} -docker_build_image "${mxnet_version}_gpu_cu80_mkl" "Dockerfile.mxnet.python.gpu.cu80.mkl" -docker_test_image_gpu "${mxnet_version}_gpu_cu80_mkl" +check_errors(){ + egrep -i "not found|error|returned a non-zero code|fail" ${LOGDIR}/docker* + if [ $? -eq 0 ]; then + echo "ERROR: One of the build/test commands failed. Refer to the filename above to see which image tag caused it." + exit 1 + else + echo "Success: No errors found" + fi +} -docker_build_image "${mxnet_version}_gpu_cu92" "Dockerfile.mxnet.python.gpu.cu92" -docker_test_image_gpu "${mxnet_version}_gpu_cu92" +# Build and Test dockerfiles - CPU +docker_generate_image_cpu "${mxnet_version}_cpu" "Dockerfile.mxnet.python.cpu" "python" > ${LOGDIR}/docker_cpu.out 2>&1 & +docker_generate_image_cpu "${mxnet_version}_cpu_mkl" "Dockerfile.mxnet.python.cpu.mkl" "python" > ${LOGDIR}/docker_cpu_mkl.out 2>&1 & -docker_build_image "${mxnet_version}_gpu_cu92_mkl" "Dockerfile.mxnet.python.gpu.cu92.mkl" -docker_test_image_gpu "${mxnet_version}_gpu_cu92_mkl" +#Build and Test dockerfiles - GPU +docker_generate_image_gpu "${mxnet_version}_gpu_cu90" "Dockerfile.mxnet.python.gpu.cu90" "python" > ${LOGDIR}/docker_gpu_cu90.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu90_mkl" "Dockerfile.mxnet.python.gpu.cu90.mkl" "python" > ${LOGDIR}/docker_gpu_cu90_mkl.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu80" "Dockerfile.mxnet.python.gpu.cu80" "python" > ${LOGDIR}/docker_gpu_cu80.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu80_mkl" "Dockerfile.mxnet.python.gpu.cu80.mkl" "python" > ${LOGDIR}/docker_gpu_cu80_mkl.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu92" "Dockerfile.mxnet.python.gpu.cu92" "python" > ${LOGDIR}/docker_gpu_cu92.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu92_mkl" "Dockerfile.mxnet.python.gpu.cu92.mkl" "python" > ${LOGDIR}/docker_gpu_cu92_mkl.out 2>&1 + +echo "Waiting for MXNet Python2 Docker Images to Build" +wait + +# Build and Test Python3 dockerfiles - CPU +docker_generate_image_cpu "${mxnet_version}_cpu_py3" "Dockerfile.mxnet.python3.cpu" "python3" > ${LOGDIR}/docker_cpu_py3.out 2>&1 & +docker_generate_image_cpu "${mxnet_version}_cpu_mkl_py3" "Dockerfile.mxnet.python3.cpu.mkl" "python3" > ${LOGDIR}/docker_cpu_mkl_py3.out 2>&1 & + +#Build and Test Python3 dockerfiles - GPU +docker_generate_image_gpu "${mxnet_version}_gpu_cu90_py3" "Dockerfile.mxnet.python3.gpu.cu90" "python3" > ${LOGDIR}/docker_gpu_cu90_py3.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu90_mkl_py3" "Dockerfile.mxnet.python3.gpu.cu90.mkl" "python3" > ${LOGDIR}/docker_gpu_cu90_mkl_py3.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu80_py3" "Dockerfile.mxnet.python3.gpu.cu80" "python3" > ${LOGDIR}/docker_gpu_cu80_py3.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu80_mkl_py3" "Dockerfile.mxnet.python3.gpu.cu80.mkl" "python3" > ${LOGDIR}/docker_gpu_cu80_mkl_py3.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu92_py3" "Dockerfile.mxnet.python3.gpu.cu92" "python3" > ${LOGDIR}/docker_gpu_cu92_py3.out 2>&1 & +docker_generate_image_gpu "${mxnet_version}_gpu_cu92_mkl_py3" "Dockerfile.mxnet.python3.gpu.cu92.mkl" "python3" > ${LOGDIR}/docker_gpu_cu92_mkl_py3.out 2>&1 + +echo "Waiting for MXNet Python3 Docker Images to Build" +wait + +echo "Re-Tag 6 images with version-free names (for Benchmarking) - only after previous builds complete. " +docker_tag_image_cpu "${mxnet_version}_cpu" "latest" "python" > ${LOGDIR}/docker_latest.out 2>&1 & +docker_tag_image_gpu "${mxnet_version}_gpu_cu90" "gpu" "python" > ${LOGDIR}/docker_gpu.out 2>&1 & +docker_tag_image_cpu "${mxnet_version}_cpu_mkl" "latest_cpu_mkl_py2" "python" > ${LOGDIR}/docker_latest_cpu_mkl_py2.out 2>&1 & +docker_tag_image_cpu "${mxnet_version}_cpu_mkl_py3" "latest_cpu_mkl_py3" "python3" > ${LOGDIR}/docker_latest_cpu_mkl_py3.out 2>&1 & +docker_tag_image_gpu "${mxnet_version}_gpu_cu90_mkl" "latest_gpu_mkl_py2" "python" > ${LOGDIR}/docker_latest_gpu_mkl_py2.out 2>&1 & +docker_tag_image_gpu "${mxnet_version}_gpu_cu90_mkl_py3" "latest_gpu_mkl_py3" "python3" > ${LOGDIR}/docker_latest_gpu_mkl_py3.out 2>&1 +wait + +# Parse all the docker logfiles to make sure there is no error. Fail script if error is found. +check_errors # Push dockerfiles echo "All images were successfully built. Now login to dockerhub and push images" docker_account_login +# Python2 docker_push_image "${mxnet_version}_cpu" docker_push_image "${mxnet_version}_cpu_mkl" -docker_push_image "latest" docker_push_image "${mxnet_version}_gpu_cu90" docker_push_image "${mxnet_version}_gpu_cu90_mkl" -docker_push_image "gpu" docker_push_image "${mxnet_version}_gpu_cu80" docker_push_image "${mxnet_version}_gpu_cu80_mkl" docker_push_image "${mxnet_version}_gpu_cu92" docker_push_image "${mxnet_version}_gpu_cu92_mkl" +# Python3 +docker_push_image "${mxnet_version}_cpu_py3" +docker_push_image "${mxnet_version}_cpu_mkl_py3" +docker_push_image "${mxnet_version}_gpu_cu90_py3" +docker_push_image "${mxnet_version}_gpu_cu90_mkl_py3" +docker_push_image "${mxnet_version}_gpu_cu80_py3" +docker_push_image "${mxnet_version}_gpu_cu80_mkl_py3" +docker_push_image "${mxnet_version}_gpu_cu92_py3" +docker_push_image "${mxnet_version}_gpu_cu92_mkl_py3" + +docker_push_image "latest" +docker_push_image "gpu" +docker_push_image "latest_cpu_mkl_py2" +docker_push_image "latest_cpu_mkl_py3" +docker_push_image "latest_gpu_mkl_py2" +docker_push_image "latest_gpu_mkl_py3" + + docker_account_logout echo "Successfully Built, Tested and Pushed all Images to Dockerhub. Link: https://hub.docker.com/r/mxnet/python/tags/" + +#Delete the log directory since everything succeeded: +rm -rf ${LOGDIR} \ No newline at end of file