Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 为什么Torch在使用1.5mb网络进行预测时使用约700mb的GPU内存_Lua_Out Of Memory_Torch - Fatal编程技术网

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

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的内存消耗,这就解释

我对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的运行情况,在内存耗尽的第一个映像上调用
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))
所以我有两个主要问题:

  • torch中有哪些用于调试内存使用的工具
  • 内存膨胀的可能原因是什么

  • 它必须不仅仅是网络和加载到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中的参数数量或模型大小)并不一定意味着内存占用率低。很可能所有这些内存都用于以单精度或双精度存储激活映射