https://github.com/Microsoft/CNTK
Tip revision: e9162e18e1c51b88f5c92ac6eb6623943eae353e authored by Amit Agarwal on 08 May 2016, 01:37:50 UTC
Synchronize batch norm nodes' running means and variances across parallel workers at end of each epoch to ensure accurate restartability across epochs and add and end-to-end test for this scenario
Synchronize batch norm nodes' running means and variances across parallel workers at end of each epoch to ensure accurate restartability across epochs and add and end-to-end test for this scenario
Tip revision: e9162e1
configure
#!/bin/bash
configure=$0
build_top=$PWD
have_cuda=no
cuda_path=
cuda_check=include/cuda.h
enable_cuda=
have_acml=no
acml_path=
acml_check=include/acml.h
have_mkl=no
mkl_path=
mkl_check=mkl/include/mkl.h
# Experimental OpenBLAS support.
have_openblas=no
openblas_path=
openblas_check=include/openblas_config.h
have_kaldi=no
kaldi_path=
kaldi_check=src/kaldi.mk
have_buildtype=no
buildtype=
default_buildtype=release
have_gdk=no
gdk_path=
gdk_check=include/nvidia/gdk/nvml.h
have_cub=no
cub_path=
cub_check=cub/cub.cuh
have_cudnn=no
cudnn_path=
cudnn_check=cuda/include/cudnn.h
have_opencv=no
opencv_path=
opencv_check=include/opencv2/opencv.hpp
have_libzip=no
libzip_path=
libzip_check=include/zip.h
mathlib=
default_use_1bitsgd=no
enable_1bitsgd=$default_use_1bitsgd
default_use_code_coverage=no
enable_code_coverage=$default_use_code_coverage
# List from best to worst choice
default_path_list="/usr /usr/local /opt /opt/local /opt/intel"
# List from best to worst choice
default_acmls="acml5.3.1/ifort64_mp"
default_mkls=""
default_openblas=""
# NOTE: Will get compilation errors with cuda-6.0
default_cudas="cuda-7.5 cuda-7.0 cuda-6.5"
default_kaldis="kaldi-trunk kaldi-c024e8aa"
default_gdks=". gdk/usr"
default_cubs="cub-1.4.1"
default_cudnns="cudnn-4.0"
default_opencvs="opencv-3.0.0"
default_libzips="libzip-1.1.2"
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_acml ()
{
find_dir "$default_acmls" "$acml_check"
}
function find_mkl ()
{
find_dir "$default_mkls" "$mkl_check"
}
function find_openblas ()
{
find_dir "$default_openblas" "$openblas_check"
}
function find_cuda ()
{
find_dir "$default_cudas" "$cuda_check"
}
function find_kaldi ()
{
find_dir "$default_kaldis" "$kaldi_check"
}
function find_gdk ()
{
find_dir "$default_gdks" "$gdk_check"
}
function find_cub ()
{
find_dir "$default_cubs" "$cub_check"
}
function find_cudnn ()
{
find_dir "$default_cudnns" "$cudnn_check"
}
function find_opencv ()
{
find_dir "$default_opencvs" "$opencv_check"
}
function find_libzip ()
{
find_dir "$default_libzips" "$libzip_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 default_use_cuda ()
{
if test x$(find_cuda) = x || test x$(find_gdk) = x
then
echo no
else
echo yes
fi
}
enable_cuda=$(default_use_cuda)
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"
echo " --with-build-top=directory build directory $(show_default $build_top)"
echo " --add directory add directory to library search path"
echo " --1bitsgd[=(yes|no)] use 1Bit SGD $(show_default ${default_use_1bitsgd})"
echo " --cuda[=(yes|no)] use cuda GPU $(show_default $(default_use_cuda))"
echo " --with-cuda[=directory] $(show_default $(find_cuda))"
echo " --with-cub[=directory] $(show_default $(find_cub))"
echo " --with-gdk[=directory] $(show_default $(find_gdk))"
echo " --with-cudnn[=directory] $(show_default $(find_cudnn))"
echo " --with-acml[=directory] $(show_default $(find_acml))"
echo " --with-mkl[=directory] $(show_default $(find_mkl))"
echo " --with-openblas[=directory] (experimental) $(show_default $(find_openblas))"
echo " --with-buildtype=(debug|release) $(show_default $default_buildtype)"
echo " --with-kaldi[=directory] $(show_default $(find_kaldi))"
echo " --with-opencv[=directory] $(show_default $(find_opencv))"
echo " --with-libzip[=directory] $(show_default $(find_libzip))"
echo " --with-code-coverage[=(yes|no)] $(show_default ${default_use_code_coverage})"
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"
;;
--1bitsgd*)
if test x$optarg = xyes || test x$optarg = xno
then
enable_1bitsgd=$optarg
else
echo "Invalid value for --1bitsgd $optarg"
show_help
exit
fi
;;
--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
;;
--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
;;
--with-cuda*)
have_cuda=yes
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
;;
--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"
echo "NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local"
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*)
have_gdk=yes
if test x$optarg = x
then
gdk_path=$(find_gdk)
if test x$gdk_path = x
then
echo "Cannot find gdk directory."
echo "Please specify a value for --with-gdk"
exit 1
fi
else
if test $(check_dir $optarg $gdk_check) = yes
then
gdk_path=$optarg
else
echo "Invalid gdk 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-acml*)
have_acml=yes
mathlib=acml
if test x$optarg = x
then
acml_path=$(find_acml)
if test x$acml_path = x
then
echo "Cannot find acml directory"
echo "Please specify a value for --with-acml"
exit 1
fi
else
if test $(check_dir $optarg $acml_check) = yes
then
acml_path=$optarg
else
echo "Invalid acml directory $optarg"
exit 1
fi
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 mkl directory"
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 mkl 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-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
;;
--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
;;
--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"
echo "libzip (v.1.1.2 or higher) can be downloaded from http://www.nih.at/libzip/"
exit 1
fi
else
if test $(check_dir $optarg $$libzip_check) = yes
then
libzip_path=$optarg
else
echo "Invalid libzip directory $optarg"
exit 1
fi
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
# If no math library was specified, search for acml and then mkl
if test x$have_acml = xno && test x$have_mkl = xno && test x$have_openblas = xno
then
acml_path=$(find_acml)
if test x$acml_path = x
then
mkl_path=$(find_mkl)
if test x$mkl_path = x
then
echo "Cannot find a CPU math library."
echo "Please specify --with-acml, --with-mkl, --with-openblas with a path."
exit 1
else
mathlib=mkl
fi
else
mathlib=acml
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_path = x
then
gdk_path=$(find_gdk)
if test x$gdk_path = x ; then
echo Cannot locate a gdk directory
echo GPU will be disabled
enable_cuda=no
else
echo Found gdk at $gdk_path
fi
fi
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
echo NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local
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
if test x$opencv_path = x
then
opencv_path=$(find_opencv)
if test x$opencv_path = x ; then
echo Cannot locate OpenCV 3.0.0 directory
echo ImageReader will NOT be built.
else
echo Found OpenCV at $opencv_path
fi
fi
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
config=$build_top/Config.make
echo Generating $config
echo "#Configuration file for cntk" > $config
echo BUILDTYPE=$buildtype >> $config
echo MATHLIB=$mathlib >> $config
case $mathlib in
acml)
echo ACML_PATH=$acml_path >> $config
;;
mkl)
echo MKL_PATH=$mkl_path >> $config
;;
openblas)
echo OPENBLAS_PATH=$openblas_path >> $config
;;
esac
if test $enable_cuda = yes ; then
echo CUDA_PATH=$cuda_path >> $config
echo GDK_PATH=$gdk_path >> $config
echo CUB_PATH=$cub_path >> $config
echo CUDNN_PATH=$cudnn_path >> $config
fi
if test x$kaldi_path != x ; then
echo KALDI_PATH=$kaldi_path >> $config
fi
if test x$opencv_path != x ; then
echo OPENCV_PATH=$opencv_path >> $config
fi
if test x$libzip_path != x ; then
echo LIBZIP_PATH=$libzip_path >> $config
fi
if test $enable_1bitsgd = yes ; then
echo CNTK_ENABLE_1BitSGD=true >> $config
fi
if test $enable_code_coverage = yes ; then
echo CNTK_CODE_COVERAGE=true >> $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
echo run
echo '>make -j all'
echo to build