Lua 为什么Torch在使用1.5mb网络进行预测时使用约700mb的GPU内存
我对Torch/CUDA非常陌生,我正在尝试从测试小型二进制网络(~1.5mb),但我一直遇到“内存不足”的问题 我使用的是一个相对较弱的GPU(NVIDIA Quadro K600),在16.04 Ubuntu和CUDA 10.0以及CudNN 5.1版上有大约900Mb的图形内存。所以我并不真正关心性能,但我认为我至少能够运行一个小型网络进行预测,一次一个图像(特别是一个据说是针对那些“资源有限”的人的图像) 我设法在headless模式下运行代码,并检查了大约700Mb的内存消耗,这就解释了为什么当我运行一台占用大约250Mb GPU内存的X-server时,它会立即失败 我还添加了一些日志来查看main.lua的运行情况,在内存耗尽的第一个映像上调用Lua 为什么Torch在使用1.5mb网络进行预测时使用约700mb的GPU内存,lua,out-of-memory,torch,Lua,Out Of Memory,Torch,我对Torch/CUDA非常陌生,我正在尝试从测试小型二进制网络(~1.5mb),但我一直遇到“内存不足”的问题 我使用的是一个相对较弱的GPU(NVIDIA Quadro K600),在16.04 Ubuntu和CUDA 10.0以及CudNN 5.1版上有大约900Mb的图形内存。所以我并不真正关心性能,但我认为我至少能够运行一个小型网络进行预测,一次一个图像(特别是一个据说是针对那些“资源有限”的人的图像) 我设法在headless模式下运行代码,并检查了大约700Mb的内存消耗,这就解释
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
函数有关,但我对torch或lua的了解还不够深入。其他答案表明,实际上不支持显示变量占用了多少内存。通常消耗大部分内存的是激活图(以及训练时的梯度)。我不熟悉这个特定的模型和实现,但我要说的是,您使用的是一个“假”二进制网络;所谓伪,我的意思是他们仍然使用浮点数来表示二进制值,因为大多数用户将在不完全支持真实二进制操作的GPU上使用他们的代码。作者甚至在第5节中写道:
性能。理论上,通过使用位异或替换所有浮点乘法,并使用SWA(单
指令,一个寄存器中的多个数据[5],[6],寄存器的数目
与传统方法相比,操作次数最多可减少32倍
基于乘法的卷积。然而,在我们的测试中,我们观察到
加速至
3.5x,与cuBLAS相比,矩阵乘法的结果与[6]中报告的结果一致。我们注意到,我们
没有在CPU上进行实验。然而,鉴于我们
使用与[5]中相同的方法进行二值化,类似的改进
就速度而言,预计为58x左右:如
重新估值的网络需要0.67秒才能在网络上进行前向传递
i7-3820使用单核,接近x58的加速将允许
系统实时运行。在内存压缩方面,通过
消除影响最小(或根本没有影响)的偏差
通过将每32个权重分组并存储在一个
变量,我们可以实现39倍的压缩率进行比较
与火炬的单精度相对应
在这种情况下,小模型(MiB中的参数数量或模型大小)并不一定意味着内存占用率低。很可能所有这些内存都用于以单精度或双精度存储激活映射