我是Torch / CUDA的新手,我正在尝试从https://github.com/1adrianb/binary-face-alignment测试小型二进制网络(~1.5mb),但我一直遇到“内存不足”的问题。
我使用相对较弱的GPU(NVIDIA Quadro K600),在16.04 Ubuntu上使用CUDA 10.0和CudNN 5.1版,具有~900Mb的图形内存。所以我并不真正关心性能,但我认为我至少能够运行一个小型网络进行预测,一次只能运行一个图像(尤其是一个据称针对那些“资源有限”的图像)。
我设法在无头模式下运行代码并检查内存消耗大约为700Mb,这可以解释为什么当我运行X服务器时需要大约250Mb的GPU内存时它会立即失败。
我还添加了一些日志,看看我得到的main.lua有多远,而且是第一张图像用完内存时调用output:copy(model:forward(img))
。
作为参考,这是崩溃前的main.lua代码:
require 'torch'
require 'nn'
require 'cudnn'
require 'paths'
require 'bnn'
require 'optim'
require 'gnuplot'
require 'image'
require 'xlua'
local utils = require 'utils'
local opts = require('opts')(arg)
print("Starting heap tracking")
torch.setheaptracking(true)
torch.setdefaulttensortype('torch.FloatTensor')
torch.setnumthreads(1)
-- torch.
local model
if opts.dataset == 'AFLWPIFA' then
print('Not available for the moment. Support will be added soon')
os.exit()
model = torch.load('models/facealignment_binary_pifa.t7')
else
print("Loading model")
model = torch.load('models/facealignment_binary_aflw.t7')
end
model:evaluate()
local fileLists = utils.getFileList(opts)
local predictions = {}
local noPoints = 68
if opts.dataset == 'AFLWPIFA' then noPoints = 34; end
local output = torch.CudaTensor(1,noPoints,64,64)
for i = 1, #fileLists do
local img = image.load(fileLists[i].image)
local originalSize = img:size()
img = utils.crop(img, fileLists[i].center, fileLists[i].scale, 256)
img = img:cuda():view(1,3,256,256)
output:copy(model:forward(img))
所以我有两个主要问题:
它必须不仅仅是网络和加载到GPU中的图像。我最好的猜测是它与LoadFileLists
函数有关,但我根本不知道足够的火炬或lua从那里走得更远。其他答案表明,实际上不支持显示变量占用的内存量。
通常消耗大部分记忆的是激活图(和训练时的渐变)。我不熟悉这个特定的模型和实现,但我会说你使用的是“假的”二进制网络;假的我的意思是他们仍然使用浮点数来表示二进制值,因为大多数用户将在不完全支持实际二进制操作的GPU上使用他们的代码。作者甚至在第5节写道:
性能。理论上,通过按位XOR替换所有浮点乘法并利用SWAR(单指令,寄存器中的多个数据)[5],[6],与之相比,操作次数可减少至32x基于乘法的卷积。然而,在我们的测试中,我们观察到与cuBLAS相比,对于矩阵乘法,加速比高达3.5倍,结果与[6]中报道的结果一致。我们注意到我们没有对CPU进行实验。然而,考虑到我们使用与[5]中相同的二值化方法这一事实,在速度方面也有类似的改进,大约为58x,因为实际评估的网络需要0.67秒才能进行正向传递。使用单核的i7-3820,接近x58的加速将允许系统实时运行。在内存压缩方面,通过消除对性能影响最小(或根本没有影响)的偏差,以及通过将每32个权重分组并存储在一个变量中,与单个变量相比,我们可以实现39倍的压缩率火炬的精密对应物。
在这种情况下,一个小模型(w.r.t.参数数量或MiB中的模型大小)并不一定意味着低内存占用。很可能所有这些内存都用于以单精度或双精度存储激活映射。