Cuda+Chainer训练Artistic style模型GPU加速配置

Cuda+Chainer训练Artistic style模型GPU加速配置

好久没有更新博客了,主要还是自己太懒。写一下最近在做的事情吧。

  • 背景
  • 再背景
  • 解决方式
  • 效果
  • 小结

背景

最近在从事基于神经网络的图片风格化的尝试,例如给定一张绘画作品R和输入图片I,将输出具有R风格的图片O,即使你的图片也具有艺术风格。具体效果呢如下图:
输入图:
Cuda+Chainer训练Artistic style模型GPU加速配置_第1张图片
参考图:
Cuda+Chainer训练Artistic style模型GPU加速配置_第2张图片
输出图:
Cuda+Chainer训练Artistic style模型GPU加速配置_第3张图片
这个事情已经有成熟的app叫Prisma的做了,现在希望复现其效果并且用于实时视频处理。参考的论文呢列举几个吧,Gatys的开山之作,以及Justin Johnson的加速版本实现。
对于论文实现方案细节近期会再详细写一篇,大体思路呢是两部分:
- 1、感知loss判决
这里针对每种不同Style都会训练一个模型来提取绘画作品P的特征,特征提取直接参照了2014ImgeNet上VGG16的模型,在VGG16的基础上与微软COCO数据集进行训练,获得当前Style的纹理和色彩特征提出模型,得到一个比较general的基于不同Style的特征提取模型。
- 2、图像变换处理
大框架是一个前向反馈的网络,在有了上一步的特征提取模型,再与我当前输入图片I进行特征提取对比,并计算输出图O的loss,用这个loss值来训练图像变换网络中的参数,修正我的输出O来最小化loss。
现在是想说明实践过程中遇到的一个问题,由于这个风格变换课题也比较早,所以git上的代码也比较充沛,我的初步单图复现就是基于yusuketomoto的代码。这里用的是另外的深度学习框架叫Chainer,基于python的,与Caffe主要的区别在于Caffe是define and run,chainer宣称的是define by run更加灵活。


再背景

上一节所述的代码里有训练好的两个style的模型,可以直接用于图像变换,用到命令

python generate.py -m -o

运行在I7-5930的CPU上处理一张1440x1080的图片还是需要70s+的太慢,处理一张640x480的图片也得7.7s+。何况如果要训练一副你想要的Style还得重新训练模型,模型训练的过程中尤其针对COCO这么大的数据集,只用CPU可是很要命的。比如当我只用cpu训练,输入命令

python train.py -s sample_images/mountain.jpg -d dataset/train2014 -g -1

之后,对82783张图片开始慢慢地训练。。。。大约训练125张图用了435s。。折算下来我所有图片跑一遍就得3.3天。。这训练成本能受得起?所以GPU加速势在必行,这篇主要就是讲一下GPU咋配置的。


解决方式

python train.py -s sample_images/mountain.jpg -d dataset/train2014 -g 0

直接修改命令中参数-g为0,即可开启gpu模式,会提示cudnn not enabled,然后训练就卡住了。
error
原因是我的Chainer安的时候没有配置好Cuda和Cudnn。

关于Cuda和cudnn的安装,不介绍了(服务器已经安好啦。。。据说还是挺费劲的),主要说一下怎么与chainer的配置。参考官网的介绍。由于chainer是基于python的,固然会被pip这种收集到,可以简单地通过pip install来安装,或者也可以下载源码然后python setup.py。
这个问题的解决方案就是如教程所述配置好cuda的path之后重新安一遍chainer。
我的~/.bashrc文件中添加内容如下:

export CUDA_PATH=/usr/local/cuda-8.0$CUDA_PATH
export PATH=/usr/local/cuda-8.0/bin$PATH
export LD_LIBRARY_PATH=/usr/local/cuda8.0/lib64$LD_LIBRARY_PATH
export CPATH=/cudnn/include$CPATH
export LIBRARY_PATH=/cudnn/lib64$LIBRARY_PATH
export LD_LIBRARY_PATH=/cudnn/lib64$LD_LIBRARY_PATH

要记得用pip重安的时候记得加上参数--no-cache-dir避免缓存直接安装了。

$pip uninstall chainer
$pip install chainer --no-cache-dir

效果

虽然没有用到cudnn,但是只用Cuda的GPU加速效果已经拔群了,只看iteration蹭蹭往上跳,大约1000次迭代需要137s,也就是说原来3.3天的活儿,可以3.15小时整完。
模型还在训练,等训练完之后,带着酷炫效果再来汇报。
附上GPU、CPU占比
Cuda+Chainer训练Artistic style模型GPU加速配置_第4张图片
cpu占比


小结

  • 用了GPU的话cpu还是这么爆炸,不太理解。
  • 模型训练速度确实加快了很多,节约了时间。
  • 也可以尝试单机多片GPU并行处理。不知道chainer有没有这个功能。

你可能感兴趣的:(MachineLearning)