blob: 7d4b8167cb6a6912a17432ceb411b8bf18738889 [file] [log] [blame]
# 安装
## 从Conda安装
Conda是Python,CPP和其他软件包的软件包管理员。
目前,SINGA有适用于Linux和MacOSX的conda软件包(Python 2.7和Python 3.6)。
建议使用[Miniconda3](https://conda.io/miniconda.html)与SINGA一起使用。安装完miniconda后,执行以下命令之一来安装SINGA。
1. CPU版本
conda install -c nusdbsystem singa-cpu
2. 由CUDA和cuDNN支持的GPU版本
conda install -c nusdbsystem singa-gpu
等同于
conda install -c nusdbsystem singa=1.1.1=py36_cuda9.0-cudnn7.1.2
在执行上述命令之前,必须先安装CUDA 9.0。 其他CUDA版本的Singa软件包也可用。 以下说明列出了所有可用的Singa软件包。
conda search -c nusdbsystem singa
如果下面指令没有出现错误提示,说明SINGA已经安装成功。
python -c "from singa import tensor"
## 从源码安装
源文件可以被下载为[tar.gz 文件](https://dist.apache.org/repos/dist/dev/singa/),或者为一个git仓库:
$ git clone https://github.com/apache/singa.git
$ cd singa/
### 由conda创建SINGA
Conda-build是一款构建工具,可以安装anaconda云中的相关库并执行构建脚本。 生成的软件包可以上传到anaconda云中供他人下载和安装。
安装conda-build (安装miniconda后)
conda install conda-build
创建CPU版本的SINGA
export BUILD_STR=cpu
conda build tool/conda/singa/ --python3.6 (or --python2.7)
上面的指令已在Ubuntu 16.04和Mac OSX上测试过。更多信息请参考[Travis-CI页面](https://travis-ci.org/apache/singa)。
创建GPU版本的SINGA
export BUILD_STR=cudax.y-cudnna.b.c (e.g. cuda9.0-cudnn7.1.2)
export CUDNN_PATH=<path to cudnn folder>
conda build tool/conda/singa/ --python3.6 (or --python2.7)
这些基于GPU平台的指令已经在Ubuntu 16.04 (cuDNN >= 7和CUDA >= 9)上测试过。
[Nvidia的docker镜像](https://hub.docker.com/r/nvidia/cuda/)提供了cuDNN和CUDA的创建环境。
屏幕上将显示生成的包文件的位置。
请参阅[conda安装](https://conda.io/docs/commands/conda-install.html)
对从本地文件安装软件包的说明。
### 使用本地工具在Ubuntu上创建SINGA
编译和运行SINGA需要以下库。
有关在Ubuntu 16.04上安装它们的说明,
请参阅SINGA [Dockerfiles](https://github.com/apache/singa/blob/master/tool/docker/)。
* cmake (>=2.8)
* gcc (>=4.8.1) or Clang
* google protobuf (>=2.5)
* blas (tested with openblas >=0.2.10)
* swig(>=3.0.10) for compiling PySINGA
* numpy(>=1.11.0) for compiling PySINGA
1. 在singa目录下创建一个`build`文件夹并进入其中
2. 运行 `cmake [options] ..`
默认情况下除了`USE_PYTHON`,其他所有可选项都是OFF
* `USE_MODULES=ON`, 当protobuf和blas没有被安装时使用
* `USE_CUDA=ON`, 当CUDA和cuDNN可用时使用
* `USE_PYTHON=ON`, 用于编译PySINGA
* `USE_PYTHON3=ON`, 用于支持Python 3编译 (默认的是Python 2)
* `USE_OPENCL=ON`, 用于支持OpenCL编译
* `PACKAGE=ON`, 用于创建Debian包
* `ENABLE_TEST`,用于编译单元测试用例
3. 编译代码, 如: `make`
4. 进入python文件夹
5. 运行 `pip install .`或者 `pip install -e .`。第二个指令创建符号链接而不是将文件复制到python站点包文件夹中。
当USE_PYTHON=ON时,第4步和第5步用于安装PySINGA。
在通过ENABLE_TEST=ON编译好SINGA后,你可以运行单元测试
$ ./bin/test_singa
你可以看到所有测试用例和测试结果。
如果SINGA通过所有测试,那么你已经成功安装了SINGA。
### 在Windows上编译SINGA
基于Python支持的Windows上的安装说明可以在[这里](install_win.html)找到。
### 更多编译选择
#### USE_MODULES
如果protobuf和openblas没有安装,在编译SINGA时需要如下处理:
$ In SINGA ROOT folder
$ mkdir build
$ cd build
$ cmake -DUSE_MODULES=ON ..
$ make
cmake会下载OpenBlas和Protobuf(2.6.1)并同SINGA一起编译。
你可以使用`cmake ..`来配置编译操作指令。 如果一些依赖库没有被安装在默认路径下,你需要导出相应的环境变量:
export CMAKE_INCLUDE_PATH=<path to the header file folder>
export CMAKE_LIBRARY_PATH=<path to the lib file folder>
#### USE_PYTHON
类似于编译CPP代码, PySINGA可以被这么编译:
$ cmake -DUSE_PYTHON=ON ..
$ make
$ cd python
$ pip install .
#### USE_CUDA
用户被推荐安装CUDA和[cuDNN](https://developer.nvidia.com/cudnn)以在GPU上运行SINGA时获得更好的性能。
SINGA已经在CUDA 9和cuDNN 7上测试过。 如果cuDNN在非系统目录下解压,如/home/bob/local/cudnn/, 下面的指令需要被执行以让cmake和运行时能找到它:
$ export CMAKE_INCLUDE_PATH=/home/bob/local/cudnn/include:$CMAKE_INCLUDE_PATH
$ export CMAKE_LIBRARY_PATH=/home/bob/local/cudnn/lib64:$CMAKE_LIBRARY_PATH
$ export LD_LIBRARY_PATH=/home/bob/local/cudnn/lib64:$LD_LIBRARY_PATH
cmake对CUDA和cuDNN的操作选项应该被开启:
# 依赖库已经被安装
$ cmake -DUSE_CUDA=ON ..
$ make
#### USE_OPENCL
SINGA用opencl-header和viennacl(1.7.1版本或更新)以获得OpenCL支持。 它们可由以下指令安装:
# 在Ubuntu 16.04上
$ sudo apt-get install opencl-headers, libviennacl-dev
# 在Fedora上
$ sudo yum install opencl-headers, viennacl
另外,你将需要OpenCL Installable Client Driver (ICD)以在你的平台上运行OpenCL。
* 对于AMD和Nvidia GPU, 驱动包还需要包含正确的OpenCL ICD。
* 对于英特尔CPUs和/或GPUs, 可以从[英特尔官网](https://software.intel.com/en-us/articles/opencl-drivers)上获取到。 注意, 官网上提供的驱动仅支持近期的CPUs和GPUs。
* 对于更老的英特尔CPUs,你可以选用`beignet-opencl-icd`包。
注意,在CPU上运行OpenCL目前是不推荐的,因为很慢。 内存传输是以秒的级别(CPU上为1000 ms,而GPU上为1毫秒)。
更多关于OpenCL环境配置的信息可以从[这里](https://wiki.tiker.net/OpenCLHowTo)获得。
如果ViennaCL包版本低于1.7.1,你将需要从源码编译:
从[git仓库](https://github.com/viennacl/viennacl-dev)clone,checkout到`release-1.7.1`标签。记得把仓库的路径加到环境变量`PATH`中,并且创建库到`LD_LIBRARY_PATH`。
编译基于OpenCL支持的SINGA (测试与SINGA 1.1):
$ cmake -DUSE_OPENCL=ON ..
$ make
#### PACKAGE
此设置用于创建Debian包。 设置PACKAGE=ON并用以下命令创建包:
$ cmake -DPACKAGE=ON
$ make package
## FAQ
* Q: 在使用由wheel安装的PySINGA('import singa')时,出现错误。
A: 请查看`python -c "from singa import _singa_wrap"`详细错误提示。 这有时是由依赖库造成的,比如,有多个版本的protobuf,cudnn缺失,numpy版本不匹配。 下面的步骤详述了不同的案例:
1. 检查cudnn,cuda和gcc版本,推荐使用cudnn5,cuda7.5和gcc4.8/4.9。 如果gcc是5.0版本, 需要降低版本。 如果cudnn确实或者与wheel版本不匹配,你可以将正确的cudnn版本下载到~/local/cudnn/ 并且
$ echo "export LD_LIBRARY_PATH=/home/<yourname>/local/cudnn/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
2. 如果是protobuf的问题,需要下载最新的[编译过protobuf和openblas的whl文件](https://issues.apache.org/jira/browse/SINGA-255)。 或者,你可以从源码安装protobuf到指定文件夹,比如:~/local/;解压tar文件,然后执行
$ ./configure --prefix=/home/<yourname>local
$ make && make install
$ echo "export LD_LIBRARY_PATH=/home/<yourname>/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc
$ source ~/.bashrc
3. 如果找不到其他python库,你可以用pip或conda创建python虚拟环境。
4. 如果不是以上原因造成的,进入`_singa_wrap.so`所在文件夹,执行
$ python
>> import importlib
>> importlib.import_module('_singa_wrap')
检查错误信息。 比如,如果numpy版本不匹配,错误信息将会是
RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
接着,你需要提升numpy版本。
* Q: 运行`cmake ..`报错,找不到依赖库。
A: 如果你没有安装相应库,就去安装它们。如果你把这些库安装在非系统默认的路径下,如/usr/local,你可以将正确路径导出到环境变量中:
$ export CMAKE_INCLUDE_PATH=<path to your header file folder>
$ export CMAKE_LIBRARY_PATH=<path to your lib file folder>
* Q: `make`报错,如连接阶段
A: 如果你的库文件在非系统默认路径下,你需要导出相应的变量
$ export LIBRARY_PATH=<path to your lib file folder>
$ export LD_LIBRARY_PATH=<path to your lib file folder>
* Q: 头文件错误,比如:'cblas.h no such file or directory exists'
A: 你需要把cblas.h的路径加入到CPLUS_INCLUDE_PATH,如
$ export CPLUS_INCLUDE_PATH=/opt/OpenBLAS/include:$CPLUS_INCLUDE_PATH
* Q:编译SINGA时,我发现了错误`SSE2 instruction set not enabled`
A:你可以尝试如下命令
$ make CFLAGS='-msse2' CXXFLAGS='-msse2'
* Q:当我试图导入.py文件时,我得到错误提示`ImportError: cannot import name enum_type_wrapper`。
A: 你需要安装绑定到python的protobuf,可以由如下命令安装
$ sudo apt-get install protobuf
或者从源码安装
$ cd /PROTOBUF/SOURCE/FOLDER
$ cd python
$ python setup.py build
$ python setup.py install
* Q: 当我从源码创建OpenBLAS时,被告知需要Fortran编译器。
A: 你可以用如下命令编译OpenBLAS
$ make ONLY_CBLAS=1
或者
$ sudo apt-get install libopenblas-dev
* Q: 当我创建protocol buffer时,出现错误提示`GLIBC++_3.4.20 not found in /usr/lib64/libstdc++.so.6`。
A: 这说明连接器找到了libstdc++.so.6,但是这个库属于一个更老版本的GCC编译器。 要编译的程序依赖于定义在新版本GCC下的libstdc++库,所以连接器必须被告知如何找到新版的可共享的libstdc++库。 最简单的处理方法是找到正确的libstdc++库,导出到LD_LIBRARY_PATH变量。 比如,如果GLIBC++_3.4.20被列在如下命令的输出中
$ strings /usr/local/lib64/libstdc++.so.6|grep GLIBC++
之后,你只需要设置环境变量
$ export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
* Q: 当我创建glog时报错,"src/logging_unittest.cc:83:20: error: 'gflags' is not a namespace-name"。
A: 这可能是你装了一个不同命名空间的gflags,比如"google",所以glog找不到'gflags'命名空间。 gflags不是创建glog必须的, 所以你可以修改configure.ac文件以忽略gflags。
1. cd to glog src directory
2. change line 125 of configure.ac to "AC_CHECK_LIB(gflags, main, ac_cv_have_libgflags=0, ac_cv_have_libgflags=0)"
3. autoreconf
之后,你可以重新创建glog。
* Q: 当使用虚拟环境时,每次我运行pip install都会重新安装numpy。 然而,在`import numpy`时,numpy可能并没有被使用。
A: 这可能是因为在使用虚拟环境时,`PYTHONPATH`被设置成了空以防止与虚拟环境中的路径发生冲突。
* Q: 当从源码编译PySINGA时,会因为缺失<numpy/objectarray.h>而出现编译错误。
A: 请安装numpy并且通过如下命令导出numpy头文件
$ export CPLUS_INCLUDE_PATH=`python -c "import numpy; print numpy.get_include()"`:$CPLUS_INCLUDE_PATH
* Q: 当在Mac OS X下运行PySINGA时,我得到了错误信息"Fatal Python error: PyThreadState_Get: no current thread Abort trap: 6"。
A: 这个错误很典型地出现在当你系统中存在多个版本的python并且你是通过pip安装
SINGA的(这个问题可以通过由conda安装SINGA来解决), 比如:一个来自于OS,一个通过Homebrew安装。 和SINGA连接的Python必须和Python解析器是同个版本。你可以通过which python来查看python解析器版本,并通过otool -L <path to _singa_wrap.so>检查和PySINGA连接的Python版本。 为了解决这个问题, 需要用正确的Python版本来编译SINGA。 特别地,如果你从源码创建的PySINGA,当唤起[cmake](http://stackoverflow.com/questions/15291500/i-have-2-versions-of-python-installed-but-cmake-is-using-older-version-how-do)时你需要指定安装路径
$ cmake -DPYTHON_LIBRARY=`python-config --prefix`/lib/libpython2.7.dylib -DPYTHON_INCLUDE_DIR=`python-config --prefix`/include/python2.7/ ..
如果从二进制文件安装PySINGA,比如debian或者wheel,那么你需要改变python解析器,如重置变量$PATH,把正确的Python路径加在最前面。