为什么Torch在使用1.5mb网络进行预测时会占用大约700mb的GPU内存

我对Torch/CUDA非常新,我正在尝试测试来自https://github.com/1adrianb/binary-face-alignment的小型二进制网络(~1.5mb),但我一直遇到'out of memory'问题。

我正在使用一个相对较弱的GPU (NVIDIA Quadro K600),具有16.04 Ubuntu和CUDA 10.0和CudNN版本5.1的约900MB图形内存,因此我并不真的关心性能,但我认为我至少应该能够运行小型的预测网络,每次一张图片(特别是那些“资源有限”的人所针对的)。

我设法在无界面模式下运行代码,并检查内存消耗约为700MB,这可以解释为什么它在我运行X-server(消耗约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("启动堆跟踪")
    torch.setheaptracking(true)

    torch.setdefaulttensortype('torch.FloatTensor')
    torch.setnumthreads(1)
    -- torch.

    local model
    if opts.dataset == 'AFLWPIFA' then
        print('目前不可用。支持很快就会添加')
        os.exit()
        model = torch.load('models/facealignment_binary_pifa.t7')
    else
        print("正在加载模型")
        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))

因此,我有两个主要问题:

1.有什么工具可以调试torch的内存使用? 2.这种内存膨胀的可能原因是什么?

它一定不只是网络和加载到GPU的图像。我最好的猜测是它与LoadFileLists函数有关,但我根本不了解Torch或Lua的更多知识,无法进一步发现。其他答案表明真的没有支持显示一个变量占用多少内存。

点赞
用户4228275
用户4228275

通常最占用内存的是激活图(和梯度,当训练时)。我不熟悉这个特定的模型和实现,但我想你使用的是“伪”二进制网络;所谓“伪”,指的是它们仍然使用浮点数来表示二进制值,因为大多数用户将在不完全支持真正的二进制操作的GPU上使用它们的代码。作者甚至在第5节中写道:

性能。理论上,通过将所有浮点乘法替换为位异或并利用SWAR(单指令、多数据于一个寄存器内)[5],[6],可以将操作次数减少多达32倍,相比于基于乘法的卷积。然而,在我们的测试中,与cuBLAS相比,我们观察到了多达3.5倍的加速,在矩阵乘法方面,这与[6]中报告的结果一致。我们注意到,我们没有在CPU上进行实验。但是,鉴于我们使用的二进制方法与[5]中的方法相同,可以预计将具有类似的速度提高到58倍的效果:由于实值网络需要在单核i7-3820上花费0.67秒才能进行前向传递,接近58倍的加速将使系统能够实时运行。在内存压缩方面,通过删除具有最小影响(或根本没有影响)性能的偏见,并将每32个权重分组并存储在一个变量中,我们可以实现与Torch的单精度对应物相比达到39倍的压缩率。

在这种情况下,小模型(相对于参数数量或模型大小的大小)不一定意味着内存占用小。很可能所有这些内存都用于以单精度或双精度存储激活图。

2019-04-11 20:18:40