【问题标题】:Is this a practical way to resolve 'Not enough memory' from LuaJit with Torch这是用 Torch 从 LuaJit 解决“内存不足”的实用方法吗
【发布时间】:2015-10-22 05:32:37
【问题描述】:

StanfordNLP's TreeLSTM,当与具有 > 30K 实例的数据集一起使用时,会导致 LuaJit 出现“内存不足”错误。我正在使用LuaJit Data Structures 解决这个问题。为了从 lua 的堆中获取数据集,需要将树放置在 LDS.Vector 中。

由于LDS.Vector保存了cdata,第一步就是将Tree类型变成cdata对象:

local ffi = require('ffi')

ffi.cdef([[
typedef struct CTree {
   struct CTree* parent;
   int num_children;
   struct CTree* children [25];
   int idx;
   int gold_label;
   int leaf_idx;
} CTree;
]])

还需要在 read_data.lua 中进行一些小的更改来处理新的 cdata CTree 类型。到目前为止,使用 LDS 似乎是解决内存限制的合理方法。但是,CTree 需要一个名为“composer”的字段。

Composer 属于 nn.gModule 类型。要继续此解决方案,将涉及创建 nn.gModule 的 typedef 作为 cdata,包括为其成员创建 typedef。在继续之前,这似乎是正确的方向吗?有没有人有这个问题的经验?

【问题讨论】:

    标签: c lua stanford-nlp torch lstm


    【解决方案1】:

    正如您所发现的,目前以 LuaJIT 堆友好的方式表示结构化数据有点痛苦。

    在 Tree-LSTM 实现中,每个树表都包含一个指向 composer 实例的指针,主要是为了方便实现。

    避免typedef nn.gModule 的一种解决方法是使用现有的idx 字段来索引作曲家实例表。在这种方法中,可以使用对 (sentence_idx, node_idx) 在作曲家实例的全局两级表中唯一地标识作曲家。为避免内存问题,可以将当前的清理代码替换为将表中相应索引设置为nil 的行。

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 2021-06-06
      • 2020-06-27
      • 2014-03-15
      • 1970-01-01
      • 2014-03-14
      • 2018-06-18
      • 2015-09-27
      相关资源
      最近更新 更多