Ubuntu Server 16.04 配置Keras
在整个配置过程之前,由于本文使用大量下载,安装的工作,建议使用alt+f1,f2使用多个终端进行工作,节省时间,同时由于个人在配置过程中出现了各种各样的问题,所以可能会配置多余的东西,欢迎批评指正。
首先配置python环境
sudo apt-get install python-dev python-pip
然后选择y使得继续安装,然后可以通过python测试是否安装成功。
对于Keras的首页上来说,安装顺序第一个是要安装numpy和scipy,但是这两个还需要引用一些包,首先是blas,然后是lapack和atlas,所以要先安装这几个,然后我就觉得cblas也顺便装上了,防止有人不知道,安装方式是先下载压缩包,使用命令wget,如果没有可以使用命令获取这个服务。
sudo apt-get install wget
然后就是通过wget下载文件了,形式如下:
sudo wget http://web/../name
blas的下载地址是http://www.netlib.org/blas/blas.tgz,cblas的下载地址是http://www.netlib.org/blas/blast-forum/cblas.tgz,lapack的官方包地址: http://www.netlib.org/lapack/,atlas的官方包地址:http://sourceforge.net/projects/math-atlas/,但是atlas可以简便安装,后面可以看一下。
选择一个包进行下载,就比如blas命令是:
sudo wget http://www.netlib.org/blas/blas.tgz
然后对于各个包安装方式如下:
blas:
下载文件后,对压缩包进行解压,进入目录,执行命令为:
gfortran -c -O3 *.f # 编译所有的 .f 文件,生成 .o文件
ar rv libblas.a *.o # 链接所有的 .o文件,生成 .a 文件
su cp libblas.a /usr/local/lib # 将库文件复制到系统库目录
cblas:
进入CBLAS文件夹,根据你自己的计算机平台,将目录下某个 Makefile.XXX 复制为 Makefile.in , XXX表示计算机的平台,如果是Linux,那么就将Makefile.LINUX 复制为 Makefile.in,然后使用下面的命令安装:
cp ../BLAS/libblas.a testing # 将上一步编译成功的 libblas.a 复制到 CBLAS目录下的testing子目录
make # 编译所有的目录
sudo cp lib/cblas_LINUX.a /usr/local/lib/libcblas.a # 将库文件复制到系统库目录下
lapack:
编译 lapack以及lapacke,这一步比较麻烦,首先当然是进入lapack-3.4.2文件夹,然后根据平台的特点,将INSTALL目录下对应的make.inc.XXX 复制一份到 lapack-3.4.2目录下,并命名为make.inc, 这里我复制的是 INSTALL/make.inc.gfortran,因为我这里用的是gfortran编译器。
修改lapack-3.4.2/Makefile, 因为lapack以来于blas库,所以需要做如下修改
#lib: lapacklib tmglib
lib: blaslib variants lapacklig tmglib
make # 编译所有的lapack文件
cd lapacke # 进入lapacke 文件夹,这个文件夹包含lapack的C语言接口文件
make # 编译lapacke
cp include/*.h /usr/local/include #将lapacke的头文件复制到系统头文件目录
cd .. #返回到 lapack-3.4.2 目录
cp *.a /usr/local/lib # 将生成的所有库文件复制到系统库目录
altas:
由于安装比较麻烦,我直接使用命令就可以:
sudo apt-get install libatlas-dev
然后numpy和scipy需要nose的支持,所以再安装一个nose:
sudo apt-get install python-nose
然后还有各种包:
# 安装blas,Ubuntu下对应的是libopenblas,其它操作系统可能需要安装其它版本的blas——这是个OS相关的。
sudo apt-get install libopenblas-dev
# 安装lapack,Ubuntu下对应的是liblapack-dev,和OS相关。
sudo apt-get install liblapack-dev
# 安装atlas,Ubuntu下对应的是libatlas-base-dev,和OS相关。
sudo apt-get install libatlas-base-dev
# 安装numpy,scipy
sudo apt-get install python-numpy python-scipy
测试numpy和scipy是否完成安装,可以在python中,调用并执行numpy.test()和scipy.test(),进行测试,numpy.test()一般是十几秒,scipy.test()差不多一两分钟的样子下面Theano.test()多于半个小时吧,反正我没跑完就给停了。
安装Keras需要Theano的环境,同时需要GPU的支持,使得矩阵计算可以更快速,那么就需要在Ubuntu Server上安装相关的显卡驱动,对于我的电脑版本,使用的是NVIDIA的显卡,所以直接安装相关驱动就可以了。
查看电脑显卡型号:
lspci |grep VGA
或者直接输入lspci可以查看所有的 硬件设备,在当中找到显卡的相关信息。
然后后面装Theano的时候,theano.test()经常会出现pyCUDA引用出错的问题,所以我先安装了pyCUDA的相关组件,由于pyCUDA需要GPU的工作,所以还需要安装GPU卡的驱动,但是不能使用Ubuntu的图形界面,所以首先先关闭图形界面:
sudo service lightdm stop
当然这句话是对非Server的用户而言的,因为Server是没有这个服务的,同时需要屏蔽Nouveau驱动,否则容易在装完cuda的时候直接黑屏,首先修改黑名单:
sudo vi /etc/modprobe.d/blacklist.conf
然后添加以下内容:
blacklist vga16fb
blacklist rivafb
blacklist nvidiafb
blacklist rivatv
首先安装nvidia驱动:
sudo apt-get install nvidia-375
可以通过命令查看是否安装完成:
nvidia -smi
然后下载cuda的相关文件,https://developer.nvidia.com/cuda-downloads,我下载的是cuda_8.0.61_375.26_linux.run,自带GPU的驱动,所以就直接下载之后,通过命令执行安装:
chmod a+x cuda_8.0.61_375.26_linux.run
sudo ./cuda_8.0.61_375.26_linux.run
有可能在安装nvidia驱动的时候会提示关闭x server,可以通过以下语句关闭,重新安装。
sudo /etc/init.d/lightdm stop
安装cuda后需要修改sudo gedit ~/.bashrc,添加以下内容:
64位:
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
32位:
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib:$LD_LIBRARY_PATH
同时也可以通过apt-get方式获取nvidia-cuda-toolkit:
sudo apt-get install nvidia-cuda-toolkit
然后在使用theano的时候,需要numpy,scipy等库,有Anaconda的可以包含这些库,所以下载并安装Anaconda:https://www.continuum.io/downloads#linux,然后通过以下命令安装,期间询问是否添加到PATH时候,选择yes:
bash Anaconda2-4.4.0-Linux-x86_64.sh
然后让配置文件生效:
source ~/.bashrc
然后使用apt-get安装numpy和scipy时,好像还是可以安装的,不知道是不是依赖产生了问题,所以我又安装了一次,由于需要nose包,所以也先安装了nose包。
sudo apt-get python-nose python-numpy python-scipy
然后安装yaml
sudo -H pip install pyyaml
再安装Theano
sudo -H pip install Theano
通过一段cpu和gpu的查看代码,可以查看是否完成了安装:
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
vlen = 10 * 30 * 768 # 10 x #cores x # threads per core
iters = 1000
rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print(f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
print('Used the cpu')
else:
print('Used the gpu')
有可能会出现许多关于gpu无法使用的问题,我的问题是:
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: libcublas.so.8.0: cannot open shared object file: No such file or directory
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not available (error: cuda unavailable)
[Elemwise{exp,no_inplace}(<TensorType(float32, vector)>)]
Looping 1000 times took 2.026935 seconds
Result is [ 1.23178029 1.61879337 1.52278066 ..., 2.20771813 2.29967761
1.62323284]
Used the cpu
错误原因是文件找不到,解决办法:
执行命令: ldconfig /usr/local/cuda/lib64就可以解决了。