深度学习neural-style环境搭建
背景:最近在紧锣密鼓的搞毕设,毕设项目是《基于微信公众号的DNN图片数据处理服务》。现在首要任务是让这个服务的示例代码在服务器跑起来。
目标:跑通 neural-style 代码!
Neural art 的这个工作主要是基于卷积神经网络(CNN)来展开的。而 CNN 主要是通过卷积提取图片的抽象特征,然后再利用这些特征对图片进行分类、识别等其他工作。这里我们使用 torch 框架来跑。torch 是什么呢,简单来说它就是一个深度学习框架,由 facebook 出品并开源了大量 Torch 的深度学习模块和扩展,同时值得注意的是 Torch 采用的编程语言是Lua,所以前提是你已经搞定了 lua 环境。
neural-style 你可以命令行配置来选择用 CPU 还是用 GPU来跑。当然,这种数据量庞大的图形计算肯定是用 GPU 更佳,只是 GPU 的环境搭建比较麻烦= =。就“比较”而已?惊了,你以为我折腾了一个星期都在做啥。
先理清一下我们需要安装的东西。先是 CUDA,这个东西是 NVIDIA 推出的运算平台。简单来说就是让你的显卡跑起来的一个软件。然后是 torch。CUDA 是通用的,任何程序框架都能用。而要让 torch 使用 CUDA 的话,需要 cutorch 和 cunn 的支持。再者就是 cuDNN,这个是用于深度神经网络的 GPU 加速库。于是,我们的安装顺序应该是** CUDA > torch > cutorch > cunn > cudnn**.
CUDA 安装
略= =(服务器已经装了 CUDA 8.0,而且也不是我装的,就不班门弄斧了,要注意的是版本,这个跟后面的cuDNN版本必须对应。)
CUDA 安装验证
nvidia-smi
,如下显示显卡信息说明安装成功。这里简单讲一下这些信息。可以看到这台服务器有两块显卡,每一块都有 12206MiB 的显存(是的!两路泰坦!)。第一块使用了 226MiB,第二块使用了 1MiB。特别注意已使用的显存,因为我们的这个服务是十分吃显存的。图中 22% 上面的 0 和 1 代表显卡序号。这个在命令行的-gpu 0/1
会用到。下面的 Processes 就是使用了显存的服务进程。

torch 安装
从这一刻开始,我们开启蛋疼之旅!!!
先把 github 的 torch 代码拉下来:
git clone https://github.com/torch/distro.git ~/torch --recursive
torch 整个项目代码里面有很多其他的依赖库,用 “--recursive” 就是递归拉取。这使得我们这个 git clone 其实是拉了很多个代码库下来。这个要花挺长时间,而且网络问题经常中断,报了一些类似 error: RPC failed; result=52, HTTP code = 0 fatal: The remote end hung up unexpectedly
的错误。这个有墙的原因,你懂的。于是我就想先在电脑上把代码拉下来,压缩,ftp上传服务器,解压。这是不可行的,因为 window 的压缩再 Linux 的解压会因为操作系统的差异而破坏代码的结构(比如一些换行空格)。于是借助 shadowsocks :
ALL_PROXY=socks5://127.0.0.1:1080 git clone https://github.com/torch/distro.git ~/torch --recursive
网速是快了一些,但还是会经常中断,中断就得重来!装tm滴菠萝拉米黑。大概试了十来次终于 clone 下来!!!眼角莫名的湿润。
接着 官网 教程:

安装的最后会提示是否吧torch加入bashrc中,有”….(yes|no)”提示,输入yes,即可。当然,看一下以免又出什么幺蛾子:
cat ~/.bashrc
应该会看到这一行:
./home/xxx/torch/install/bin/torch-activate
(注:如果以前安装过的,记得把原先的路径注释掉)
更新环境变量:
source ~/.bashrc
安装 torch 的一些依赖库:
curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
(注:这个同样网络问题(墙= =),一些库会安装失败被跳过,多试几次吧,如果有 shadowsocks 的话用下面的命令,端口(1080)根据你的 shadowsocks 的端口而定)
curl -s --socks5 127.0.0.1:1080 https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
torch 安装验证
装了 torch 之后就可以用 cpu 跑跑看了。
下载 neural-style 代码:
git clone https://github.com/jcjohnson/neural-style
下载模块(这一步花挺长时间):
sh models/download_models.sh
跑起来哦怕是:
th neural_style.lua -gpu -1 -print_iter 1
出现如下说明安装成功:

看到了吗** 1/1000 **,恩,这就是进度条,用 CPU 跑完1000大概50分钟= =。惊了!所以说要用 GPU。永远相信,一切的折腾都是为了皮坎子怪。
cutorch 与 cunn 安装
来,打起精神来。
这两个的安装大体相同:
luarocks install cutorch 1.0-0
luarocks isntall cunn 1.0-0
不要掉了后面的** 1.0-0 ** 版本号,否则会报错:

cutorch 与 cunn 安装验证
th -e "require 'cutorch'; require 'cunn'; print(cutorch)"

cuDNN 安装
cuDNN 就是一些链接库。把 cuDNN 的头文件和相应的链接库放入 cuda 路径的相应位置就行了。显然头文件是放入include文件夹中,而链接库是放入lib64文件夹中。
下载安装包,注意你的 CUDA 版本,比如我的是 8.0:

解压:
tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz
搬动目录:
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
安装 torch 的 cudnn 支持:
luarocks install cudnn
跑一下哦怕是:
th neural_style.lua -gpu 0 -backend cudnn
(注:如果 luarocks install cudnn
报了同安装 cutorch 的错误的话用以下的安装方法)
从 github 下载 cudnn 代码:
git clone https://github.com/soumith/cudnn.torch
cd cudnn.torch
luarocks make
这时候可能会报错 init.lua:71: attempt to call field 'hasFastHalfInstructions' (a nil value)
。作者在 issue 里面说“updating cutorch will fix this.”但是讲道理,(先luarocks remove cutorch
)luarocks install cutorch
不带版本号就应该是安装最新版本了吧,但这样又会报错,谜一样的解决方案。看了 issue 下面的回复,用 R5 版本似乎可以解决问题:
git clone https://github.com/soumith/cudnn.torch -b R5
而这时候又报错 out of memory
。呀哟。后来nvidia-smi
发现:

两路大泰坦的显存居然快爆了!!!kill 12678
后终于成功!!!而且发现没有,每次50的跳进度,贼快,毕竟泰坦!

结语
这次环境的安装吃了不少苦头,能遇到的错误基本都遇到了,怕是花了最长时间的一次环境搭建,翻遍了百度和 github 的各个 issue,几近放弃,还好坚持了下来。也是因为这不是初次搭建环境,新旧软件的版本交叉问题太折磨人。再者服务器还跑了其他服务带来了很多意想不到的错误。总算搞定!溜了溜了。