CNTK/configure

1358 строки
37 KiB
Plaintext
Исходник Обычный вид История

#!/bin/bash
2016-06-14 18:39:24 +03:00
#
# Copyright (c) Microsoft. All rights reserved.
#
# Licensed under the MIT license. See LICENSE.md file in the project root
# for full license information.
# ==============================================================================
#
configure=$0
build_top=$PWD
cuda_path=
cuda_check=include/cuda.h
enable_cuda=
enable_python=
enable_java=
2018-06-06 18:38:29 +03:00
enable_csharp=
# cntk build version
# Modify both of the following during major release
2018-04-13 23:16:55 +03:00
default_build_version="2.5.1"
default_build_public="no"
build_version=$default_build_version
build_public=$default_build_public
# MKLML Version
mklml_version=mklml_lnx_2018.0.3.20180406
2016-06-14 18:39:24 +03:00
have_mkl=no
mkl_path=
mkl_check=include/mkl_version.h
# Experimental OpenBLAS support.
have_openblas=no
openblas_path=
openblas_check=include/openblas_config.h
# Boost library
boost_path=
boost_check=include/boost/test/unit_test.hpp
2016-10-25 01:33:31 +03:00
# Protocol buffers library
protobuf_path=
protobuf_check=lib/libprotobuf.a
# MPI library
mpi_path=
mpi_check=include/mpi.h
# Halide library
halide_path=
halide_check=include/Halide.h
# Cuda-aware MPI
# OPENMPI can auto-detect but not MVAPICH2
cuda_gdr=no
default_cuda_gdr=$cuda_gdr
have_kaldi=no
kaldi_path=
2016-06-14 18:39:24 +03:00
kaldi_check=src/kaldi.mk
have_buildtype=no
buildtype=
default_buildtype=release
have_gdk_include=no
gdk_include_path=
gdk_include_check=nvml.h
have_gdk_nvml_lib=no
gdk_nvml_lib_path=
gdk_nvml_lib_check=libnvidia-ml.so
2015-10-13 03:54:13 +03:00
have_cub=no
cub_path=
cub_check=cub/cub.cuh
have_cudnn=no
cudnn_path=
cudnn_check=cuda/include/cudnn.h
2015-10-14 03:24:33 +03:00
have_opencv=no
opencv_path=
opencv_check=include/opencv2/opencv.hpp
2016-02-20 04:41:40 +03:00
have_libzip=no
libzip_path=
libzip_check=include/zip.h
have_swig=no
swig_path=
swig_check=bin/swig
swig_required_version=3.0.10
py_check=bin/python
py_versions=
declare -A py_paths
jdk_check=include/jni.h
CNTK support for CUDA 9 CNTK now supports CUDA 9/cuDNN 7. This requires an update to build environment to Ubuntu 16/GCC 5 for Linux, and Visual Studio 2017/VCTools 14.11 for Windows. With CUDA 9, CNTK also added a preview for 16-bit floating point (a.k.a FP16) computation. Please check out the example of FP16 in ResNet50 at /Examples/Image/Classification/ResNet/Python/TrainResNet_ImageNet_Distributed.py Notes on FP16 preview: * FP16 implementation on CPU is not optimized, and it's not supposed to be used in CPU inference directly. User needs to convert the model to 32-bit floating point before running on CPU. * Loss/Criterion for FP16 training needs to be 32bit for accumulation without overflow, using cast function. Please check the example above. * Readers do not have FP16 output unless using numpy to feed data, cast from FP32 to FP16 is needed. Please check the example above. * FP16 gradient aggregation is currently only implemented on GPU using NCCL2. Distributed training with FP16 with MPI is not supported. * FP16 math is a subset of current FP32 implementation. Some model may get Feature Not Implemented exception using FP16. * FP16 is currently not supported in BrainScript. Please use Python for FP16. To setup build and runtime environment on Windows: * Install [Visual Studio 2017](https://www.visualstudio.com/downloads/) with following workloads and components. From command line (use Community version installer as example): vs_community.exe --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.Universal --add Microsoft.Component.PythonTools --add Microsoft.VisualStudio.Component.VC.Tools.14.11 * Install [NVidia CUDA 9](https://developer.nvidia.com/cuda-90-download-archive?target_os=Windows&target_arch=x86_64) * From PowerShell, run: /Tools/devInstall/Windows/DevInstall.ps1 * Start VCTools 14.11 command line, run: cmd /k "%VS2017INSTALLDIR%\VC\Auxiliary\Build\vcvarsall.bat" x64 --vcvars_ver=14.11 * Open /CNTK.sln from the VCTools 14.11 command line. Note that starting CNTK.sln other than VCTools 14.11 command line, would causes CUDA 9 [build error](https://developercommunity.visualstudio.com/content/problem/163758/vs-2017-155-doesnt-support-cuda-9.html). To setup build and runtime environment on Linux using docker, please build Unbuntu 16.04 docker image using Dockerfiles /Tools/docker. For other Linux systems, please refer to the Dockerfiles to setup dependent libraries for CNTK.
2018-01-23 03:58:56 +03:00
default_jdk="jvm/java-8-openjdk-amd64"
mathlib=
2016-10-12 10:45:46 +03:00
have_mpi=yes
default_use_mpi=$have_mpi
2018-03-09 22:48:53 +03:00
# NCCL communication library
have_nccl=$have_mpi
nccl_path=
nccl_check=include/nccl.h
default_use_code_coverage=no
enable_code_coverage=$default_use_code_coverage
default_use_asgd=yes
enable_asgd=$default_use_asgd
# List from best to worst choice
default_path_list="/usr /usr/local /opt /opt/local /lib /usr/lib"
# List from best to worst choice
default_mkls="mklml/$mklml_version"
default_openblas=""
default_boost="boost-1.60.0"
CNTK support for CUDA 9 CNTK now supports CUDA 9/cuDNN 7. This requires an update to build environment to Ubuntu 16/GCC 5 for Linux, and Visual Studio 2017/VCTools 14.11 for Windows. With CUDA 9, CNTK also added a preview for 16-bit floating point (a.k.a FP16) computation. Please check out the example of FP16 in ResNet50 at /Examples/Image/Classification/ResNet/Python/TrainResNet_ImageNet_Distributed.py Notes on FP16 preview: * FP16 implementation on CPU is not optimized, and it's not supposed to be used in CPU inference directly. User needs to convert the model to 32-bit floating point before running on CPU. * Loss/Criterion for FP16 training needs to be 32bit for accumulation without overflow, using cast function. Please check the example above. * Readers do not have FP16 output unless using numpy to feed data, cast from FP32 to FP16 is needed. Please check the example above. * FP16 gradient aggregation is currently only implemented on GPU using NCCL2. Distributed training with FP16 with MPI is not supported. * FP16 math is a subset of current FP32 implementation. Some model may get Feature Not Implemented exception using FP16. * FP16 is currently not supported in BrainScript. Please use Python for FP16. To setup build and runtime environment on Windows: * Install [Visual Studio 2017](https://www.visualstudio.com/downloads/) with following workloads and components. From command line (use Community version installer as example): vs_community.exe --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.Universal --add Microsoft.Component.PythonTools --add Microsoft.VisualStudio.Component.VC.Tools.14.11 * Install [NVidia CUDA 9](https://developer.nvidia.com/cuda-90-download-archive?target_os=Windows&target_arch=x86_64) * From PowerShell, run: /Tools/devInstall/Windows/DevInstall.ps1 * Start VCTools 14.11 command line, run: cmd /k "%VS2017INSTALLDIR%\VC\Auxiliary\Build\vcvarsall.bat" x64 --vcvars_ver=14.11 * Open /CNTK.sln from the VCTools 14.11 command line. Note that starting CNTK.sln other than VCTools 14.11 command line, would causes CUDA 9 [build error](https://developercommunity.visualstudio.com/content/problem/163758/vs-2017-155-doesnt-support-cuda-9.html). To setup build and runtime environment on Linux using docker, please build Unbuntu 16.04 docker image using Dockerfiles /Tools/docker. For other Linux systems, please refer to the Dockerfiles to setup dependent libraries for CNTK.
2018-01-23 03:58:56 +03:00
default_cudas="cuda-9.0"
default_nccls="nccl"
default_kaldis="kaldi-trunk kaldi-c024e8aa"
CNTK support for CUDA 9 CNTK now supports CUDA 9/cuDNN 7. This requires an update to build environment to Ubuntu 16/GCC 5 for Linux, and Visual Studio 2017/VCTools 14.11 for Windows. With CUDA 9, CNTK also added a preview for 16-bit floating point (a.k.a FP16) computation. Please check out the example of FP16 in ResNet50 at /Examples/Image/Classification/ResNet/Python/TrainResNet_ImageNet_Distributed.py Notes on FP16 preview: * FP16 implementation on CPU is not optimized, and it's not supposed to be used in CPU inference directly. User needs to convert the model to 32-bit floating point before running on CPU. * Loss/Criterion for FP16 training needs to be 32bit for accumulation without overflow, using cast function. Please check the example above. * Readers do not have FP16 output unless using numpy to feed data, cast from FP32 to FP16 is needed. Please check the example above. * FP16 gradient aggregation is currently only implemented on GPU using NCCL2. Distributed training with FP16 with MPI is not supported. * FP16 math is a subset of current FP32 implementation. Some model may get Feature Not Implemented exception using FP16. * FP16 is currently not supported in BrainScript. Please use Python for FP16. To setup build and runtime environment on Windows: * Install [Visual Studio 2017](https://www.visualstudio.com/downloads/) with following workloads and components. From command line (use Community version installer as example): vs_community.exe --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.Universal --add Microsoft.Component.PythonTools --add Microsoft.VisualStudio.Component.VC.Tools.14.11 * Install [NVidia CUDA 9](https://developer.nvidia.com/cuda-90-download-archive?target_os=Windows&target_arch=x86_64) * From PowerShell, run: /Tools/devInstall/Windows/DevInstall.ps1 * Start VCTools 14.11 command line, run: cmd /k "%VS2017INSTALLDIR%\VC\Auxiliary\Build\vcvarsall.bat" x64 --vcvars_ver=14.11 * Open /CNTK.sln from the VCTools 14.11 command line. Note that starting CNTK.sln other than VCTools 14.11 command line, would causes CUDA 9 [build error](https://developercommunity.visualstudio.com/content/problem/163758/vs-2017-155-doesnt-support-cuda-9.html). To setup build and runtime environment on Linux using docker, please build Unbuntu 16.04 docker image using Dockerfiles /Tools/docker. For other Linux systems, please refer to the Dockerfiles to setup dependent libraries for CNTK.
2018-01-23 03:58:56 +03:00
default_gdk_includes="include/nvidia/gdk cuda/include"
default_gdk_nvml_libs="src/gdk/nvml/lib cuda/lib64/stubs"
default_cubs="cub-1.7.4"
default_cudnns="cudnn-7.0"
default_opencvs="opencv-3.1.0 opencv-3.0.0"
2016-10-25 01:33:31 +03:00
default_protobuf="protobuf-3.1.0"
2016-02-20 04:41:40 +03:00
default_libzips="libzip-1.1.2"
default_swig="swig-3.0.10"
default_mpi="mpi"
default_halide="halide"
function default_paths ()
{
echo $build_top $HOME $default_path_list
}
# $1 is directory
# $2 is file that must be present
function check_dir ()
{
if test -e $1/$2
then
echo yes
else
echo no
fi
}
# $1 is the list of tails to search, ordered by preference
# $2 is some file that must exist in $1
function find_dir ()
{
# Loop over list of tails to search, including empty (just default_path + search file)
for tail in $1 ''
do
for head in $(default_paths)
do
[ -n "$tail" ] && search_path="$head/$tail" || search_path=$head
if test x$(check_dir "$search_path" $2) = xyes
then
echo $search_path
return 0
fi
done
done
}
function find_mkl ()
{
find_dir "$default_mkls" "$mkl_check"
}
function find_openblas ()
{
find_dir "$default_openblas" "$openblas_check"
}
function find_boost ()
{
find_dir "$default_boost" "$boost_check"
}
2016-10-25 01:33:31 +03:00
function find_protobuf ()
{
find_dir "$default_protobuf" "$protobuf_check"
}
function find_nccl ()
{
find_dir "$default_nccls" "$nccl_check"
}
function find_cuda ()
{
find_dir "$default_cudas" "$cuda_check"
}
function find_kaldi ()
{
find_dir "$default_kaldis" "$kaldi_check"
}
function find_gdk_include ()
{
find_dir "$default_gdk_includes" "$gdk_include_check"
}
function find_gdk_nvml_lib ()
{
find_dir "$default_gdk_nvml_libs" "$gdk_nvml_lib_check"
}
2015-10-13 03:54:13 +03:00
function find_cub ()
{
find_dir "$default_cubs" "$cub_check"
}
function find_cudnn ()
{
find_dir "$default_cudnns" "$cudnn_check"
}
2015-10-14 03:24:33 +03:00
function find_opencv ()
{
find_dir "$default_opencvs" "$opencv_check"
}
2016-02-20 04:41:40 +03:00
function find_libzip ()
{
find_dir "$default_libzips" "$libzip_check"
}
function find_mpi ()
{
find_dir "$default_mpi" "$mpi_check"
}
function find_halide ()
{
find_dir "$default_halide" "$halide_check"
}
function is_hardlinked ()
{
r=no
if test -e $1 && test -e $2
then
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
fi
echo $r
}
function check_version ()
{
local expected_version=$1
local actual_version=$2
2016-10-12 21:51:17 +03:00
[ -z "$actual_version" ] && return 1
[ "$( printf "%s\n" $actual_version $expected_version | sort -V | head -1)" = "$expected_version" ]
return $?
}
2016-06-14 18:39:24 +03:00
function default_use_cuda ()
{
if test x$(find_cuda) = x || test x$(find_gdk_include) = x || test x$(find_gdk_nvml_lib) = x || test x$(find_cudnn) = x || test x$(find_cub) = x
then
echo no
else
echo yes
fi
}
enable_cuda=$(default_use_cuda)
# TODO allow to pick up from path?
function check_swig ()
{
local swig_dir="$1"
local swig_bin="$swig_dir/$swig_check"
# Check that binary is executable and we can retrieve the version
test -x "$swig_bin" || return $?
"$swig_bin" -version 2>&1 1>/dev/null || return $?
local actual_version=$("$swig_bin" -version | grep '^SWIG Version ' | head -1 | grep -o '[0-9.]*')
if check_version "$swig_required_version" "$actual_version"
then
echo "$swig_dir"
return 0
else
return 1
fi
}
function find_swig ()
{
check_swig "$(find_dir "$default_swig" "$swig_check")"
}
function check_python ()
{
# Required version: exact match against major and minor version
local required_version="$1"
local py_dir="$2"
local py_bin="$py_dir/$py_check"
[ -x "$py_bin" ] || return 1
local py_version=$("$py_bin" -c "import sys; sys.stdout.write('{0}{1}'.format(sys.version_info.major,sys.version_info.minor))")
[ "$?" = "0" ] && [ -x "$py_bin" ] && [ "$py_version" = "$required_version" ] && {
echo $py_dir
return 0
}
return 1
}
# TODO allow to pick up from path?
function find_python ()
{
local required_version="$1"
local py_dir=$(find_dir "" "$py_check")
check_python "$required_version" "$py_dir"
}
function default_use_python ()
{
2016-10-12 21:51:17 +03:00
# Keeping it default "no" for a little while:
2017-03-11 16:35:49 +03:00
# if test x$(find_swig) = x || test x$(find_python 27)$(find_python 34)$(find_python 35)$(find_python 36) = x
2016-10-12 21:51:17 +03:00
# then
echo no
2016-10-12 21:51:17 +03:00
# else
# echo yes
# fi
}
enable_python=$(default_use_python)
function default_python_with_deps ()
{
if [[ $default_build_public == "yes" ]]; then
echo yes
else
if [[ -z "$PYTHON_WITH_DEPS" ]]; then
echo no
else
echo $PYTHON_WITH_DEPS
fi
fi
}
python_with_deps=$(default_python_with_deps)
function find_jdk ()
{
echo $(find_dir $default_jdk "$jdk_check")
}
function default_use_java ()
{
jdk_path=$(find_jdk)
if test x$jdk_path = x
then
echo no
else
echo yes
fi
}
enable_java=$(default_use_java)
2018-06-06 18:38:29 +03:00
function default_use_csharp()
{
if [[ `command -v dotnet` && `command -v swig` && `command -v cmake` ]]
then
echo yes
else
2018-06-06 18:38:29 +03:00
echo no
fi
2018-06-06 18:38:29 +03:00
}
enable_csharp=$(default_use_csharp)
2016-06-14 18:39:24 +03:00
function show_default ()
{
if test x$1 = x
then
echo "(no default)"
else
echo "(default $1)"
fi
}
function show_help ()
{
echo "Usage: configure [options]"
echo "Options:"
echo " -h|--help this help"
2018-06-06 18:38:29 +03:00
echo " --with-buildtype=(debug|release) $(show_default $default_buildtype)"
echo " --with-build-top=directory build directory $(show_default $build_top)"
echo " --add directory add directory to library search path"
2018-06-06 18:38:29 +03:00
echo " --asgd[=(yes|no)] use ASGD powered by Multiverso $(show_default ${default_use_asgd})"
echo " --cuda[=(yes|no)] use cuda GPU $(show_default $(default_use_cuda))"
echo " --python[=(yes|no)] with Python bindings $(show_default $(default_use_python))"
echo " --java[=(yes|no)] with Java bindings $(show_default $(default_use_java))"
echo " --with-jdk[=directory] $(show_default $(find_jdk))"
2018-06-06 18:38:29 +03:00
echo " --csharp[=(yes|no)] with C# bindings $(show_default $(default_use_csharp))"
2016-11-04 18:38:55 +03:00
echo " --mpi[=(yes|no)] use MPI communication $(show_default ${default_use_mpi})"
echo " --gdr[=(yes|no)] use GPUDirect RDMA $(show_default ${default_cuda_gdr})"
echo " --with-cuda[=directory] $(show_default $(find_cuda))"
2015-10-13 03:54:13 +03:00
echo " --with-cub[=directory] $(show_default $(find_cub))"
echo " --with-gdk-include[=directory] $(show_default $(find_gdk_include))"
echo " --with-gdk-nvml-lib[=directory] $(show_default $(find_gdk_nvml_lib))"
echo " --with-cudnn[=directory] $(show_default $(find_cudnn))"
echo " --with-nccl[=directory] $(show_default $(find_nccl))"
echo " --with-mkl[=directory] $(show_default $(find_mkl))"
2016-06-14 18:39:24 +03:00
echo " --with-mkl-sequential[=directory] $(show_default $(find_mkl))"
echo " --with-openblas[=directory] (experimental) $(show_default $(find_openblas))"
echo " --with-kaldi[=directory] $(show_default $(find_kaldi))"
2015-10-14 03:24:33 +03:00
echo " --with-opencv[=directory] $(show_default $(find_opencv))"
2016-02-20 04:41:40 +03:00
echo " --with-libzip[=directory] $(show_default $(find_libzip))"
echo " --with-code-coverage[=(yes|no)] $(show_default ${default_use_code_coverage})"
echo " --with-boost[=directory] $(show_default $(find_boost))"
2016-10-25 01:33:31 +03:00
echo " --with-protobuf[=directory] $(show_default $(find_protobuf))"
2018-01-27 01:55:22 +03:00
echo " --with-py-versions=(space-separated list of 27, 35, 36)"
2016-12-19 15:49:05 +03:00
echo " --with-py27-path[=directory] $(show_default $(find_python 27))"
echo " --with-py34-path[=directory] $(show_default $(find_python 34))"
echo " --with-py35-path[=directory] $(show_default $(find_python 35))"
2017-03-11 16:35:49 +03:00
echo " --with-py36-path[=directory] $(show_default $(find_python 36))"
echo " --with-swig[=directory] $(show_default $(find_swig))"
echo " --with-mpi[=directory] $(show_default $(find_mpi))"
echo " --with-halide[=directory] $(show_default $(find_halide))"
echo " --with-build-version=[version] $default_build_version"
echo " --with-deps[=(yes|no)] include third party libs in the wheel packages (MKL, CUDA and OpenCV) $(show_default $(default_python_with_deps))"
echo "Libraries search path:"
for head in $(default_paths)
do
echo " $head"
done
}
while [[ $# > 0 ]]
do
key="$1"
case $key in
*=?*) optarg=`expr "X$key" : '[^=]*=\(.*\)'` ;;
*=) optarg= ;;
*) optarg= ;;
esac
case $key in
-h|--help)
show_help
exit 1
;;
--with-build-top*)
if test x$optarg != x
then
build_top=$optarg
mkdir -p $build_top
fi
;;
--add*)
if test x$optarg = x
then
shift ; optarg=$1
fi
default_path_list="$optarg $default_path_list"
;;
--with-code-coverage*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_code_coverage=$optarg
else
echo "Invalid value for --with-code-coverage $optarg"
show_help
exit
fi
;;
2016-11-01 09:39:14 +03:00
--asgd*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_asgd=$optarg
else
echo "Invalid value for --asgd $optarg"
show_help
exit
fi
;;
--cuda*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_cuda=$optarg
else
echo "Invalid value for --cuda $optarg"
show_help
exit
fi
;;
--python*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_python=$optarg
else
echo "Invalid value for --python $optarg"
show_help
exit
fi
;;
--with-py-versions*)
2016-10-12 21:51:17 +03:00
enable_python=yes
if test "x$optarg" = "x"
then
echo "Mandatory parameter for --with-py-versions missing. Use '--python no' to disable Python support completely."
show_help
exit 1
else
for ver in $optarg
do
case $ver in
2017-03-11 16:35:49 +03:00
27 | 34 | 35 | 36)
;;
*)
echo "Invalid value for --with-py-versions $optarg: invalid version $ver"
show_help
2016-11-04 18:38:55 +03:00
exit
esac
done
# TODO filter duplicates?
py_versions="$optarg"
fi
;;
2017-03-11 16:35:49 +03:00
--with-py27-path*|--with-py34-path*|--with-py35-path*|--with-py36-path*)
enable_python=yes
py_version=${key:9:2}
if test x$optarg = x
then
py_paths[$py_version]=$(find_python $py_version)
if test x${py_paths[$py_version]} = x
then
echo "Cannot find Python $py_version directory."
echo "Please specify a value for $key"
exit 1
fi
else
if check_python $py_version "$optarg"
then
py_paths[$py_version]=$optarg
else
echo "Invalid Python $py_version directory $optarg"
exit 1
fi
fi
;;
--with-swig*)
have_swig=yes
if test x$optarg = x
then
swig_path=$(find_swig)
if test x$swig_path = x
then
echo "Cannot find SWIG directory."
echo "Please specify a value for --with-swig"
exit 1
fi
else
if check_swig "$optarg"
then
swig_path=$optarg
else
echo "Invalid SWIG directory $optarg"
exit 1
fi
fi
;;
--java*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_java=$optarg
else
echo "Invalid value for --java $optarg"
show_help
exit
fi
;;
--with-jdk*)
enable_java=yes
if test x$optarg = x
then
jdk_path=$(find_jdk)
if test x$jdk_path = x
then
echo "Cannot find JDK directory."
echo "Please specify a value for --with-jdk"
exit 1
fi
else
if test $(check_dir $optarg $jdk_check) = yes
then
jdk_path=$optarg
else
echo "Invalid JDK directory $optarg"
exit 1
fi
fi
;;
2018-06-06 18:38:29 +03:00
--csharp*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_csharp=$optarg
else
echo "Invalid value for --csharp $optarg"
show_help
exit
fi
;;
2016-10-12 10:45:46 +03:00
--mpi*)
if test x$optarg = xyes || test x$optarg = xno
then
have_mpi=$optarg
2018-03-09 22:48:53 +03:00
have_nccl=$have_mpi
if test $have_nccl = no
then
nccl_path=
fi
2016-10-12 10:45:46 +03:00
else
echo "Invalid value for --mpi $optarg"
show_help
exit
fi
;;
--gdr*)
if test x$optarg = xyes || test x$optarg = xno
then
cuda_gdr=$optarg
else
echo "Invalid value for --gdr $optarg"
show_help
exit
fi
;;
--with-cuda*)
enable_cuda=yes
if test x$optarg = x
then
cuda_path=$(find_cuda)
if test x$cuda_path = x
then
echo "Cannot find cuda directory."
echo "Please specify a value for --with-cuda"
exit 1
fi
else
if test $(check_dir $optarg $cuda_check) = yes
then
cuda_path=$optarg
else
echo "Invalid cuda directory $optarg"
exit 1
fi
fi
;;
2015-10-13 03:54:13 +03:00
--with-cub*)
have_cub=yes
if test x$optarg = x
then
cub_path=$(find_cub)
if test x$cub_path = x
then
echo "Cannot find NVIDIA CUB directory."
echo "Please specify a value for --with-cub"
2015-10-13 22:02:35 +03:00
echo "NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local"
2015-10-13 03:54:13 +03:00
exit 1
fi
else
if test $(check_dir $optarg $cub_check) = yes
then
cub_path=$optarg
else
echo "Invalid CUB directory $optarg"
exit 1
fi
fi
;;
--with-gdk-include*)
have_gdk_include=yes
if test x$optarg = x
then
gdk_include_path=$(find_gdk_include)
if test x$gdk_include_path = x
then
echo "Cannot find GDK include directory."
echo "Please specify a value for --with-gdk-include"
exit 1
fi
else
if test $(check_dir $optarg $gdk_include_check) = yes
then
gdk_include_path=$optarg
else
echo "Invalid GDK include directory $optarg"
exit 1
fi
fi
;;
--with-gdk-nvml-lib*)
have_gdk_nvml_lib=yes
if test x$optarg = x
then
gdk_nvml_lib_path=$(find_gdk_nvml_lib)
if test x$gdk_nvml_lib_path = x
then
echo "Cannot find GDK NVML library directory."
echo "Please specify a value for --with-gdk-nvml-lib"
exit 1
fi
else
if test $(check_dir $optarg $gdk_nvml_lib_check) = yes
then
gdk_nvml_lib_path=$optarg
else
echo "Invalid GDK NVML library directory $optarg"
exit 1
fi
fi
;;
--with-cudnn*)
have_cudnn=yes
if test x$optarg = x
then
cudnn_path=$(find_cudnn)
if test x$cudnn_path = x
then
echo "Cannot find NVIDIA cuDNN directory."
echo "Please specify a value for --with-cudnn"
exit 1
fi
else
if test $(check_dir $optarg $cudnn_check) = yes
then
cudnn_path=$optarg
else
echo "Invalid cuDNN directory $optarg"
exit 1
fi
fi
;;
--with-nccl*)
2018-03-09 22:48:53 +03:00
have_nccl=$have_mpi
if test $have_nccl = yes
then
2018-03-09 22:48:53 +03:00
if test x$optarg = x
then
2018-03-09 22:48:53 +03:00
nccl_path=$(find_nccl)
if test x$nccl_path = x
then
echo "Cannot find NCCL directory."
echo "Please specify a value for --with-nccl"
echo "NCCL can be downloaded from https://github.com/NVIDIA/nccl"
exit 1
fi
else
2018-03-09 22:48:53 +03:00
if test $(check_dir $optarg $nccl_check) = yes
then
nccl_path=$optarg
else
echo "Invalid NCCL directory $optarg"
exit 1
fi
fi
2018-03-09 22:48:53 +03:00
else
echo "--with-nccl cannot be used with --mpi=no"
exit 1
fi
;;
--with-mkl*)
have_mkl=yes
mathlib=mkl
if test x$optarg = x
then
mkl_path=$(find_mkl)
if test x$mkl_path = x
then
echo "Cannot find MKLML directory (version $mklml_version)"
echo "Please specify a value for --with-mkl"
exit 1
fi
else
if test $(check_dir $optarg $mkl_check) = yes
then
mkl_path=$optarg
else
echo "Invalid MKLML directory $optarg"
exit 1
fi
fi
;;
--with-openblas*)
have_openblas=yes
mathlib=openblas
if test x$optarg = x
then
openblas_path=$(find_openblas)
if test x$openblas_path = x
then
echo "Cannot find openblas directory"
echo "Please specify a value for --with-openblas"
exit 1
fi
else
if test $(check_dir $optarg $openblas_check) = yes
then
openblas_path=$optarg
else
echo "Invalid openblas directory $optarg"
exit 1
fi
fi
;;
--with-boost*)
if test x$optarg = x
then
boost_path=$(find_boost)
if test x$boost_path = x
2016-11-04 18:38:55 +03:00
then
echo "Cannot find Boost directory"
echo "Please specify a value for --with-boost"
exit 1
fi
else
if test $(check_dir $optarg $boost_check) = yes
2016-11-04 18:38:55 +03:00
then
boost_path=$optarg
else
echo "Invalid Boost directory $optarg"
exit 1
fi
fi
;;
2016-10-25 01:33:31 +03:00
--with-protobuf*)
if test x$optarg = x
then
protobuf_path=$(find_protobuf)
if test x$protobuf_path = x
then
echo "Cannot find Protocol Buffers directory"
echo "Please specify a value for --with-protobuf"
exit 1
fi
else
if test $(check_dir $optarg $protobuf_check) = yes
then
protobuf_path=$optarg
else
echo "Invalid Protocol Buffers directory $optarg"
exit 1
2016-11-04 18:38:55 +03:00
fi
2016-10-25 01:33:31 +03:00
fi
;;
--with-buildtype*)
have_buildtype=yes
case $optarg in
debug|release)
buildtype=$optarg
;;
*)
echo Invalid buildtype $optarg
echo Must be debug or release
exit 1
esac
;;
--with-kaldi*)
have_kaldi=yes
if test x$optarg = x
then
kaldi_path=$(find_kaldi)
if test x$kaldi_path = x
then
echo "Cannot find kaldi directory"
echo "Please specify a value for --with-kaldi"
exit 1
fi
else
if test $(check_dir $optarg $kaldi_check)
then
kaldi_path=$optarg
else
echo "Invalid kaldi directory $optarg"
exit 1
fi
fi
;;
2015-10-14 03:24:33 +03:00
--with-opencv*)
have_opencv=yes
if test x$optarg = x
then
opencv_path=$(find_opencv)
if test x$opencv_path = x
then
echo "Cannot find OpenCV directory."
echo "Please specify a value for --with-opencv"
echo "OpenCV can be downloaded from http://opencv.org/downloads.html, install instructions http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation"
exit 1
fi
else
if test $(check_dir $optarg $opencv_check) = yes
then
opencv_path=$optarg
else
echo "Invalid OpenCV directory $optarg"
exit 1
fi
fi
;;
2016-02-20 04:41:40 +03:00
--with-libzip*)
have_libzip=yes
if test x$optarg = x
then
libzip_path=$(find_libzip)
if test x$libzip_path = x
then
echo "Cannot find libzip directory."
echo "Please specify a value for --with-libzip"
2016-02-25 21:48:13 +03:00
echo "libzip (v.1.1.2 or higher) can be downloaded from http://www.nih.at/libzip/"
2016-02-20 04:41:40 +03:00
exit 1
fi
else
if test $(check_dir $optarg $libzip_check) = yes
2016-02-20 04:41:40 +03:00
then
libzip_path=$optarg
else
echo "Invalid libzip directory $optarg"
exit 1
fi
fi
;;
--with-mpi*)
if test x$optarg = x
then
mpi_path=$(find_mpi)
if test x$mpi_path = x
then
echo "Cannot find mpi directory."
exit 1
fi
else
if test $(check_dir $optarg $mpi_check) = yes
then
mpi_path=$optarg
else
echo "Invalid mpi directory $optarg"
exit 1
fi
fi
;;
--with-halide*)
if test x$optarg = x
then
halide_path=$(find_halide)
if test x$halide_path = x
then
echo "Cannot find halide directory."
exit 1
fi
else
if test $(check_dir $optarg $halide_check) = yes
then
halide_path=$optarg
else
echo "Invalid halide directory $optarg"
exit 1
fi
fi
;;
--with-build-version*)
if test "x$optarg" != "x"
then
build_version=$optarg
build_public="yes"
fi
;;
--with-deps*)
if test x$optarg = xyes || test x$optarg = xno
then
if test x$optarg = xyes
then
python_with_deps=$optarg
fi
else
echo "Invalid value for --with-deps $optarg"
show_help
exit
fi
;;
*)
echo Invalid option $key
show_help
exit 1
esac
shift
done
if test x$buildtype = x
then
buildtype=$default_buildtype
echo Defaulting to --with-buildtype=release
fi
2016-08-16 16:08:08 +03:00
# If no math library was specified, search for mkl
if test x$have_mkl = xno && test x$have_openblas = xno
then
2016-11-04 18:38:55 +03:00
mkl_path=$(find_mkl)
if test x$mkl_path = x
then
echo "Cannot find a CPU math library."
echo "Please specify --with-mkl, --with-openblas with a path."
2016-11-04 18:38:55 +03:00
exit 1
else
mathlib=mkl
fi
fi
# If no cuda library specified, search for one
if test x$enable_cuda = xyes && test x$cuda_path = x
then
cuda_path=$(find_cuda)
if test x$cuda_path = x ; then
echo Cannot locate a cuda directory
echo GPU will be disabled
enable_cuda=no
else
echo Found cuda at $cuda_path
fi
fi
if test $enable_cuda = yes && test x$gdk_include_path = x
then
gdk_include_path=$(find_gdk_include)
if test x$gdk_include_path = x ; then
echo Cannot locate a GDK include directory
echo GPU will be disabled
enable_cuda=no
else
echo Found GDK include at $gdk_include_path
fi
fi
if test $enable_cuda = yes && test x$gdk_nvml_lib_path = x
then
gdk_nvml_lib_path=$(find_gdk_nvml_lib)
if test x$gdk_nvml_lib_path = x ; then
echo Cannot locate a GDK NVML library directory
echo GPU will be disabled
enable_cuda=no
else
echo Found GDK NVML library at $gdk_nvml_lib_path
fi
fi
2015-10-13 03:54:13 +03:00
if test $enable_cuda = yes && test x$cub_path = x
then
cub_path=$(find_cub)
if test x$cub_path = x ; then
echo Cannot locate NVIDIA CUB directory
echo GPU will be disabled
2015-10-13 22:02:35 +03:00
echo NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local
2015-10-13 03:54:13 +03:00
enable_cuda=no
else
echo Found CUB at $cub_path
fi
fi
if test $enable_cuda = yes && test x$cudnn_path = x
then
cudnn_path=$(find_cudnn)
if test x$cudnn_path = x ; then
echo Cannot locate NVIDIA cuDNN directory
echo CNTK will use default convolution engine.
else
echo Found cuDNN at $cudnn_path
fi
fi
2018-06-06 18:38:29 +03:00
if ( test $enable_java = yes || test $enable_python = yes || test $enable_csharp = yes ) && test x$swig_path = x
then
swig_path=$(find_swig)
if test x$swig_path = x
then
2018-06-06 18:38:29 +03:00
echo 'Cannot locate SWIG (>= 3.0.10), which is required for Python/Java/C# support.'
echo Please see https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#optional-swig
echo for installation instructions.
exit 1
fi
fi
if test $enable_python = yes
then
# TODO disabled for now. Default Python versions may miss dependencies we do not
# check for here yet, only support explicitly specified paths.
2016-10-12 21:51:17 +03:00
# Fill unfilled default paths
#[ -z "${py_paths[27]}" ] && find_python 27 && py_paths[27]=$(find_python 27)
#[ -z "${py_paths[34]}" ] && find_python 34 && py_paths[34]=$(find_python 34)
#[ -z "${py_paths[35]}" ] && find_python 35 && py_paths[35]=$(find_python 35)
# Unless there's a specified order or restriction, take all configured Python versions (old to new)
[ -z "$py_versions" ] && py_versions=${!py_paths[@]}
py_versions="$py_versions "
# Make sure each requested version is configured, remove other parts
2017-03-11 16:35:49 +03:00
for ver in 27 34 35 36
do
case $py_versions in
*$ver\ *)
# Build for version is requested, check if configured
if [ -z "${py_paths[$ver]}" ]
then
echo Build for Python version $ver was requested, but is not configured.
exit 1
fi
;;
*)
# Build for version is not requested, unconfigure
unset -v py_paths[$ver]
;;
esac
done
fi
2018-03-09 22:48:53 +03:00
if test $enable_cuda = yes && test $have_nccl = yes && test x$nccl_path = x
then
nccl_path=$(find_nccl)
if test x$nccl_path != x; then
echo Found NCCL at $nccl_path
fi
fi
if test x$opencv_path = x
then
opencv_path=$(find_opencv)
if test x$opencv_path = x ; then
2017-04-19 18:39:11 +03:00
echo 'Cannot locate OpenCV (>= 3.0.0) directory'
echo ImageReader will NOT be built.
else
echo Found OpenCV at $opencv_path
fi
fi
2016-02-20 04:41:40 +03:00
if test x$libzip_path = x
then
libzip_path=$(find_libzip)
if test x$libzip_path = x ; then
echo Cannot locate libzip files
echo ImageReader will be built without zip container support.
else
echo Found libzip at $libzip_path
fi
fi
if test x$kaldi_path = x
then
kaldi_path=$(find_kaldi)
if test x$kaldi_path = x ; then
echo Cannot locate Kaldi files
echo Kaldi2Reader will NOT be built.
else
echo Found Kaldi at $kaldi_path
fi
fi
if test x$boost_path = x
then
boost_path=$(find_boost)
if test x$boost_path = x
then
2016-12-21 14:13:13 +03:00
echo Cannot locate Boost libraries. See
echo https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#boost-library
2016-12-21 14:13:13 +03:00
echo for installation instructions.
exit 1
else
echo Found Boost at $boost_path
fi
fi
2016-10-25 01:33:31 +03:00
if test x$protobuf_path = x
then
protobuf_path=$(find_protobuf)
if test x$protobuf_path = x
then
echo Cannot locate Protocol Buffers library. See
echo https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#protobuf
2016-10-25 01:33:31 +03:00
echo for installation instructions.
exit 1
else
echo Found Protocol Buffers at $protobuf_path
fi
fi
2018-01-27 04:17:58 +03:00
if test x$halide_path = x
then
halide_path=$(find_halide)
if test x${halide_path} = x
then
echo Cannot locate optional Halide library.
else
echo Found Halide at $halide_path
fi
fi
2018-03-09 22:48:53 +03:00
if test x$mpi_path = x && test $have_mpi = yes
then
mpi_path=$(find_mpi)
if test x${mpi_path} = x
then
echo Cannot locate MPI library. See
echo https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#open-mpi
echo for installation instructions.
exit 1
else
echo Found MPI at $mpi_path
fi
fi
config=$build_top/Config.make
echo Generating $config
echo "#Configuration file for cntk" > $config
echo BUILDTYPE=$buildtype >> $config
echo BUILD_VERSION=$build_version >> $config
echo BUILD_PUBLIC=$build_public >> $config
echo MATHLIB=$mathlib >> $config
case $mathlib in
mkl)
echo MKL_PATH=$mkl_path >> $config
2016-06-14 18:39:24 +03:00
echo MKL_THREADING=$mkl_threading >> $config
;;
openblas)
echo OPENBLAS_PATH=$openblas_path >> $config
;;
esac
2016-10-12 10:45:46 +03:00
if test $have_mpi = yes ; then
echo HAS_MPI=1 >> $config
else
echo HAS_MPI=0 >> $config
fi
if test $cuda_gdr = yes ; then
echo CUDA_GDR=1 >> $config
else
echo CUDA_GDR=0 >> $config
fi
if test $enable_cuda = yes ; then
echo CUDA_PATH=$cuda_path >> $config
echo GDK_INCLUDE_PATH=$gdk_include_path >> $config
echo GDK_NVML_LIB_PATH=$gdk_nvml_lib_path >> $config
2015-10-13 03:54:13 +03:00
echo CUB_PATH=$cub_path >> $config
echo CUDNN_PATH=$cudnn_path >> $config
2016-11-13 09:13:13 +03:00
[ -z "$nccl_path" ] || echo NCCL_PATH=$nccl_path >> $config
fi
2018-06-06 18:38:29 +03:00
if test $enable_python = yes || test $enable_java = yes || test $enable_csharp = yes; then
echo SWIG_PATH=$swig_path/bin >> $config
fi
if test $enable_python = yes ; then
echo PYTHON_SUPPORT=true >> $config
# N.B. PYTHON_VERSIONS at least needs to be parseable by bash (cf. Tools/generate_build_info)
echo PYTHON_VERSIONS= >> $config
for ver in $py_versions
do
echo PYTHON_VERSIONS+=$ver >> $config
echo PYTHON${ver}_PATH=${py_paths[$ver]}/$py_check >> $config
done
fi
if test $enable_java = yes ; then
if test x${jdk_path} = x ; then
jdk_path=$(find_jdk)
fi
if test x${jdk_path} = x
then
echo Cannot locate JDK.
exit 1
else
echo Found JDK at $jdk_path
echo JAVA_SUPPORT=true >> $config
echo JDK_PATH=$jdk_path >> $config
fi
fi
2018-06-06 18:38:29 +03:00
if test $enable_csharp = yes ; then
echo CSHARP_SUPPORT=true >> $config
fi
if test x$kaldi_path != x ; then
echo KALDI_PATH=$kaldi_path >> $config
fi
2015-10-14 03:24:33 +03:00
if test x$opencv_path != x ; then
echo OPENCV_PATH=$opencv_path >> $config
fi
2016-02-20 04:41:40 +03:00
if test x$libzip_path != x ; then
echo LIBZIP_PATH=$libzip_path >> $config
fi
if test $enable_code_coverage = yes ; then
echo CNTK_CODE_COVERAGE=true >> $config
fi
if test x$boost_path != x; then
echo BOOST_PATH=$boost_path >> $config
fi
2016-10-25 01:33:31 +03:00
if test x$protobuf_path != x; then
echo PROTOBUF_PATH=$protobuf_path >> $config
fi
if test x$mpi_path != x; then
echo MPI_PATH=$mpi_path >> $config
fi
if test x$halide_path != x; then
echo HALIDE_PATH=$halide_path >> $config
fi
if test $enable_asgd = yes ; then
echo CNTK_ENABLE_ASGD=true >> $config
fi
if test $python_with_deps = yes ; then
echo PYTHON_WITH_DEPS=1 >> $config
fi
# If we are not in the configure directory, generate a trampoline Makefile
makefile=$build_top/Makefile
if test $(is_hardlinked "$configure" "$build_top/configure") = no
then
echo Generating $makefile
realconf=`readlink -f $configure`
dir=`dirname $realconf`
echo "#Generate Makefile" > $makefile
echo dir=$dir >> $makefile
echo BUILD_TOP=$build_top >> $makefile
echo >> $makefile
echo all clean : >> $makefile
printf '\t$(MAKE) -C $(dir) BUILD_TOP=$(BUILD_TOP) $@\n' >> $makefile
fi
2016-06-14 18:39:24 +03:00
echo run
echo '>make -j $(nproc) all'
echo to build
# vim:set expandtab tabstop=4 shiftwidth=4: