用源码进行本地构建

如果开发者和工程师想使用Deeplearning4j 的最新版本,或者希望用派生项目构建自己的版本,那么请参考本页的指南来构建和安装Deeplearning4j。首选的安装目标是本地计算机上的Maven代码库。若不使用主支,可按具体需求修改下列步骤(即更换GIT分支并修改build-dl4j-stack.sh脚本)。

本地构建需要整个Deeplearning4j 堆栈,包括:

Deeplearning4j 能在大多数平台(Windows、OS X、Linux)上运行,同时也有多种不同的“风格”,可以适应包括CPU(OpenBLAS, MKL, ATLAS)和GPU(CUDA)在内的各种计算架构。DL4J堆栈也支持x86和PowerPC架构。


系统要求

在构建和安装DL4J堆栈之前,请确保本地计算机已具备必要的软件,且环境变量已设置完毕。各平台和操作系统版本对应的步骤可能有所不同。所需软件包括:

  • git
  • cmake(3.2或更高版本)
  • OpenMP
  • gcc(4.9或更高版本)
  • maven(3.3或更高版本)

不同架构对应的软件包括:

CPU架构:

  • 英特尔MKL
  • OpenBLAS
  • ATLAS

GPU架构:

  • CUDA

IDE特定要求:

  • IntelliJ Lombok插件

DL4J测试依赖:

  • dl4j测试资源

安装必备工具

Linux

Ubuntu

若您使用Ubuntu风格的Linux,而且是以非root用户的身份运行系统,那么请按以下步骤安装必备软件:


sudo apt-get purge maven maven2 maven3
sudo add-apt-repository ppa:natecarlson/maven3
sudo apt-get update
sudo apt-get install maven build-essentials cmake libgomp1

OSX

可以用Homebrew来安装必备软件。如果本地计算机上已安装Homebrew,请按以下步骤安装必要的工具。

在使用Homebrew之前,首先需要确保已安装最新版本的Xcode(用作主编译器):


xcode-select --install

最后安装必备工具:


brew update
brew install maven gcc5

注意:你不能使用cl。你也不能使用新版本的gcc。如果您有较新的gcc版本,请使用此链接切换版本


Windows

libnd4j的编译依赖一些Unix实用工具,因此需要安装Msys2才能对其进行编译。

按照Msys2的说明完成安装后,还需要安装一些附加的开发包。启动msys2 shell,用以下命令安装开发环境:


pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-extra-cmake-modules make pkg-config grep sed gzip tar mingw64/mingw-w64-x86_64-openblas

这将安装需要在msys2 shell中使用的依赖项目。

同时还需要设置PATH环境变量,加入C:\msys64\mingw64\bin(或自定义的msys2安装路径)。如果打开了IntelliJ或其他IDE,则必须将其重启,上述变化方会对经由IDE启动的应用程序生效。若不重启IDE,可能会出现“找不到依赖库”的错误。


安装必备架构

必备工具安装完毕后,即可为您的平台安装必备架构。


英特尔MKL

在目前所有可用于CPU的架构中,英特尔MKL的速度最快,但在安装之前需要先完成一些“预备”工作。

  • 英特尔的网站上申请许可证
  • 完成英特尔要求的几个步骤后,将会收到下载链
  • 下载后,按照安装指南安装英特尔MKL 

OpenBLAS

Linux

Ubuntu

Ubuntu用户可以用如下方式安装OpenBLAS:


sudo apt-get install libopenblas-dev

同时还需要确保 PATH 已设置为 /opt/OpenBLAS/lib(或其他自定义的OpenBLAS主目录)。为了能在Apache Spark中使用OpenBLAS,还需要输入以下命令:


sudo cp libopenblas.so liblapack.so.3
sudo cp libopenblas.so libblas.so.3

CentOS

以root用户的身份在终端(或ssh会话)中输入下列命令:


yum groupinstall 'Development Tools'

随后应当能看到终端进行许多安装活动。若要了解安装状态,比如需要确认gcc是否安装成功,可输入如下命令:


gcc --version

更完整的说明请参见此页


OS X

您可以用Home Science在OS X上安装OpenBLAS:


brew install homebrew/science/openblas

Windows

OpenBLAS有适用于msys2的安装包,可以用pacman命令进行安装。


ATLAS

Linux

Ubuntu

用apt安装包在Ubuntu上安装ATLAS:


sudo apt-get install libatlas-base-dev libatlas-dev

CentOS

在CentOS上安装ATLAS的方法:


sudo yum install atlas-devel

OS X

在OS X上安装ATLAS的过程较为复杂,需要的时间比较长,但大多数计算机应该都能用以下的命令完成安装。


wget --content-disposition https://sourceforge.net/projects/math-atlas/files/latest/download?source=files
tar jxf atlas*.tar.bz2
mkdir atlas (为ATLAS创建目录)
mv ATLAS atlas/src-3.10.1
cd atlas/src-3.10.1
wget http://www.netlib.org/lapack/lapack-3.5.0.tgz (如果ATALS下载包中包括此文件,就无需本条命令)
mkdir intel(创建build目录)
cd intel
cpufreq-selector -g performance (本条命令需要root权限,建议加入,但并非必要)
../configure --prefix=/ATLAS的安装目录路径/ --shared --with-netlib-lapack-tarfile=../lapack-3.5.0.tgz
make
make check
make ptcheck
make time
make install

CUDA

Linux 与 OS X

安装CUDA等GPU架构的详细指南请参见此页


Windows

构建CUDA后端需要满足一些额外的条件:

在构建CUDA后端之前,必须调用vcvars64.bat来设置一些环境变量。 但首先需要将系统环境变量SET_FULL_PATH设为true,让vcvars64.bat设置的所有变量能够传递到mingw shell

  1. 在常规命令行窗口cmd.exe中运行C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\vcvars64.bat
  2. 在其中运行c:\msys64\mingw64_shell.bat
  3. 切换至libnd4j文件夹
  4. ./buildnativeoperations.sh -c cuda

此命令将会构建 CUDA nd4j.dll


IDE要求


如果您正在通过IDE(如IntelliJ)构建Deeplearning4j,那么您将需要安装某些插件,以确保您的IDE正确地渲染代码突出显示。您将需要为Lombok安装一个插件:

如果您想在ScalNet,Scala API或某些模块(如DL4J UI)上工作,则需要确保您的IDE已安装Scala支持并可用。


测试依赖关系

Deeplearning4j使用单独的存储库,其中包含测试所需的所有资源。这是为了确保中央DL4J存储库的轻量化,并避免GIT历史上的BLOB。如果您希望在DL4J堆栈中运行测试:

  1. 在本地机器上拷贝https://github.com/deeplearning4j/dl4j-test-resources
  2. cd dl4j-test-resources; mvn install

安装DL4J堆栈

Linux 与 OS X

检查环境变量

在运行构建DL4J堆栈的代码之前,必须确保一些特定的环境变量已设置妥当。不同架构下的具体操作方法如下。


LIBND4J_HOME

您需要知道运行DL4J构建代码的准确路径(建议使用空目录),否则构建将会失败。确定路径后,在其末尾添加/libnd4j,导出到本地环境。示例如下:


export LIBND4J_HOME=/home/user/directory/libnd4j

使用MKL的CPU架构

与MKL的链接可以在构建时进行,也可以在运行时同最初链接到OpenBLAS等其他BLAS实现的二进制文件进行链接。若要用MKL进行构建,只需对Linux的LD_LIBRARY_PATH环境变量(或者Windows的PATH)添加包含libmkl_rt.so的路径(或者Windows中包含mkl_rt.dll的路径),例如/path/to/intel64/lib/,随后按同样的方法构建。在Linux系统中,为确保使用的OpenMP版本正确,可能还需要设置下列环境变量:


export MKL_THREADING_LAYER=GNU
export LD_PRELOAD=/lib64/libgomp.so.1

如果无法重新构建libnd4j,也可以把运行时的加载对象从OpenBLAS改为MKL库,但这种办法更复杂一些。请按下列附加步骤操作:

  • 确保/lib64/libopenblas.so.0/lib64/libblas.so.3等文件不可用(或者在Windows的PATH中处于靠后位置),否则它们一开始就会被libnd4j用绝对路径加载。

  • /path/to/intel64/lib/中,为libmkl_rt.so(Windows系统为mkl_rt.dll)创建一个符号链接或副本,用libnd4j计划加载的文件名命名,例如:

    
    ln -s libmkl_rt.so libopenblas.so.0
    ln -s libmkl_rt.so libblas.so.3
    

    
    copy mkl_rt.dll libopenblas.dll
    copy mkl_rt.dll libblas3.dll
    
  • 最后,将/path/to/intel64/lib/添加至LD_LIBRARY_PATH环境变量(或Windows的PATH变量的靠前位置),然后照常运行Java应用程序。


构建脚本

Github社区中有一套用bash编写的build-dl4j-stack.sh脚本,可以克隆DL4J 堆栈:libndj4, ND4J, DataVec 和 deeplearning4j,构建所有代码库并将其安装到本地的Maven中。这一脚本在Linux和OS X平台上都可以运行。请仔细阅读下列说明。

CPU架构请使用以下构建脚本:


./build-dl4j-stack.sh

如果采用的是GPU后端,请改用:


./build-dl4j-stack.sh -c cuda

你可以使用cc标志加速你的CUDA构建,当中的解释可以在libndj4 README中找到

Scala用户可以传入二进制版本号,确保与Spark相兼容:


./build-dl4j-stack.sh -c cuda --scalav 2.11

上述构建脚本会将所有的选项和标志传递给libnd4j的./buildnativeoperations.sh脚本。用于这些脚本的所有标志都可以通过build-dl4j-stack.sh进行传递。


手动构建

您也可以选择手动构建DL4J堆栈的各个组件。每个软件的基本步骤包括:

  1. Git克隆
  2. 构建
  3. 安装

整个流程所需的命令如下文所示,唯一的例外是,libnd4j的./buildnativeoperations.sh所接受的参数取决于您选用的后端类型。以下步骤必须按给出的顺序依次运行,否则会出现错误。适用于GPU的命令附在注释内,为GPU后端进行构建时,应当将适用于CPU的命令替换为注释中的命令。


# 清除现有的代码库,确保干净的构建环境
rm -rf libnd4j
rm -rf nd4j
rm -rf datavec
rm -rf deeplearning4j

# 编译libnd4j
git clone https://github.com/deeplearning4j/libnd4j.git
cd libnd4j
./buildnativeoperations.sh
# 如果使用GPU
# ./buildnativeoperations.sh -c cuda -cc 请在这里插入您的设备
# 例如,如果你有 GTX 1070 device, 请使用 -cc 61
export LIBND4J_HOME=`pwd`
cd ..

# 构建nd4j并安装至本地的maven
git clone https://github.com/deeplearning4j/nd4j.git
cd nd4j
mvn clean install -DskipTests -Dmaven.javadoc.skip=true -pl '!:nd4j-cuda-7.5,!:nd4j-cuda-7.5-platform,!:nd4j-tests'
## 适用于较新的0.6.1版本的上述命令
mvn clean install -DskipTests -Dmaven.javadoc.skip=true -pl '!:nd4j-cuda-8.0,!:nd4j-cuda-8.0-platform,!:nd4j-tests'

# 如果使用GPU
# mvn clean install -DskipTests -Dmaven.javadoc.skip=true -pl '!:nd4j-tests'
cd ..

# 构建并安装datavec
git clone https://github.com/deeplearning4j/datavec.git
cd datavec
if [ "$SCALAV" == "" ]; then
  bash buildmultiplescalaversions.sh clean install -DskipTests -Dmaven.javadoc.skip=true
else
  mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dscala.binary.version=$SCALAV -Dscala.version=$SCALA
fi
cd ..

# 构建并安装deeplearning4j
git clone https://github.com/deeplearning4j/deeplearning4j.git
cd deeplearning4j
mvn clean install -DskipTests -Dmaven.javadoc.skip=true
# 或者为多个Scala版本进行交叉编译
# ./buildmultiplescalaversions.sh clean install -DskipTests -Dmaven.javadoc.skip=true
## 如果跳过了CUDA,可能需要将
## -pl '!:deeplearning4j-cuda-8.0'
## 添加至mvn clean install命令,避免构建脚本寻找cuda库
cd ..

使用本地依赖项目

DL4J堆栈安装到本地的Maven代码库之后,就可以将其加入构建工具的依赖项目了。请参阅Deeplearning4j 的完全安装指南,以正确的方式将版本替换为目前主POM上的SNAPSHOT版本。

需要注意的是,某些构建工具,比如Gradle和SBT,无法正确调用特定平台的二进制文件。可以按此处的指南来设置您选用的构建工具。


技术支持与协助

如果您在本地构建过程中遇到任何问题,Deeplearning4j 的早期用户交流群专门针对构建问题和其他根源问题提供协助。