首页 > 学院 > 开发设计 > 正文

如何使用白菜价GPU运行基于MatConvNet的CNN程序

2019-11-06 09:00:00
字体:
来源:转载
供稿:网友

      MatConvNet是一个基于MATLAB的工具箱。针对计算机视觉相关的应用,它实现了卷积神经网络(CNN)的各种基本功能。相对于Caffe或Tensor Flow等基于C/C++底层实现的CNN函数库来说,它具有便于学习、易于修改以及适合跨平台编程等特点,适合CNN的初学者来学习。

      然而,因为某种原因,它对NVIDIA系列早期型号的显卡支持并不好。以现在Amazon上白菜价都能买到的GeForce GT 610为例,在打开GPU支持进行编译后,可能会出现如下的编译错误:

nvcc fatal   : Unsupported gpu architecture 'compute_21' 

      经过网上查资料了解,这其实是因为MatConvNet的GPU编译代码中的一个Bug所导致。对于早期的显卡型号,它仅支持十的整数倍的GPU体系代码。在上面的例子中,如果将'compute_21'置换成‘compute_20’,便可以正常的编译了。为此,我们需要将vl_compilenn.m文件中的一个函数进行如下的修改:

% --------------------------------------------------------------------function cudaArch = get_cuda_arch(opts)% --------------------------------------------------------------------opts.verbose && fPRintf('%s:/tCUDA: determining GPU compute capability (use the ''CudaArch'' option to override)/n', mfilename);try    gpu_device = gpuDevice();    arch_code = strrep(gpu_device.ComputeCapability, '.', '');    % To fix the bug    arch_code_temp = str2double(arch_code);    arch_code_temp = floor(arch_code_temp/10)*10;    arch_code = num2str(arch_code_temp);    %    cudaArch = ...        sprintf('-gencode=arch=compute_%s,code=///"sm_%s,compute_%s///" ', ...        arch_code, arch_code, arch_code) ;catch    opts.verbose && fprintf(['%s:/tCUDA: cannot determine the capabilities of the installed GPU; ' ...        'falling back to default/n'], mfilename);    cudaArch = opts.defCudaArch;end

      如此一来,与GPU相关的代码就能正常编译了。不过需要注意的是,在编译时不要打开cuDNN的支持,否则在运行时,会因为编译和运行时GPU体系代码不一致,而导致程序异常结束。

      所以,如果身边有闲置的机器但又苦于没有高端的GPU时,可以考虑购置一些低端的显卡。然后,用此方法编译、运行一些对GPU速度、内存需求不高的程序,以提高机器的利用率。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表