MatConvNet是一个基于Matlab的深度学习框架,在计算部分,最底层混编了C/C++或者CUDA C,这使得其速度并不是特别慢。就使用体验来说,MatConvNet是非常优秀的,借助于Matlab,定义网络,使用现有模型以及数据可视化都非常方便。
由于MatConvNet文档和Demo都比较完备,所以这篇博客主要介绍一些GPU的配置细节。
一、MatConvNet简介
1. 官网资料
2. 运行已有模型
当年做VggNet的那帮人用最顶配的GPU集群训练了一个多月,我们要在个人电脑上训练VggNet估计要等到量子计算机出来。于是我们可以直接在官网下好别人训练好的模型,然后对自己的图像进行前向传输,获取各个层的输出值。
使用MatConvNet,这一切将非常方便。(链接到官网)
addpath('matlab'); enableGPU = true; %vl_compilenn('enableGPU', enableGPU, 'enableCudnn', true); net = load('../../models/imagenet-vgg-verydeep-19.mat'); im = imread('../../data/bw.bmp'); im = single(im); im = imresize(im, net.meta.normalization.imageSize(1:2)); %im = im - net.meta.normalization.averageImage; if enableGPU net = vl_simplenn_move(net,'gpu'); im = gpuArray(im); end res = vl_simplenn(net, im);
上面的GPU、cudnn选项关闭,可以直接使用CPU运行。
这里注意,模型文件的格式在beta17版本改变过一次,所以最好在官网下载最新版本的代码和模型文件。
二、GPU使用注意事项
1. 如果要使用GPU的话,那么你需要编译GPU版本,设置GPU编译选项
2. 如果你使用cuda8.0,同时MatConvNet版本在beta22以下,你需要修改源代码,matlab/scr/bits/impl/文件夹下的pooling_gpu.cu第165行的 atomicAdd函数 和 biliinearsamper_gpu.cu第26行的atomicAdd函数。
3. 如果使用cudnn,记得设置cudnn路径(默认在local/cudnn),然后还要记得把cudnn的cudnn64_5.dll放到mex文件夹下,或者dll所在bin目录加入环境变量下。
4. 网络模型和图像数据等变量,需要转化为gpuArray类型,对于网络模型,提供了一个函数vl_simplenn_move(net, ‘gpu’),对于返回的值,同样也需要从gpuArray类型变回single类型。