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

问题描述 投票:1回答:1

我是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))

所以我有两个主要问题:

  1. 在火炬中调试内存使用有哪些工具?
  2. 这种记忆臃肿有什么可能的原因?

它必须不仅仅是网络和加载到GPU中的图像。我最好的猜测是它与LoadFileLists函数有关,但我根本不知道足够的火炬或lua从那里走得更远。其他答案表明,实际上不支持显示变量占用的内存量。

lua out-of-memory torch
1个回答
1
投票

通常消耗大部分记忆的是激活图(和训练时的渐变)。我不熟悉这个特定的模型和实现,但我会说你使用的是“假的”二进制网络;假的我的意思是他们仍然使用浮点数来表示二进制值,因为大多数用户将在不完全支持实际二进制操作的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中的模型大小)并不一定意味着低内存占用。很可能所有这些内存都用于以单精度或双精度存储激活映射。

© www.soinside.com 2019 - 2024. All rights reserved.