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

      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速度、内存需求不高的程序,以提高机器的利用率。

你可能感兴趣的:(计算机视觉)