Esta é uma maneira prática de resolver 'Não há memória suficiente' de LuaJit com Tocha

9

TreeLSTM do StanfordNLP , quando usado com um conjunto de dados com > Instâncias de 30K, fazem com que LuaJit com erro com "Memória insuficiente". Estou resolvendo isso usando Estruturas de Dados do LuaJit . Para obter o conjunto de dados fora do heap de lua, as árvores precisam ser colocadas em um LDS.Vector.

Como o LDS.Vector contém cdata, o primeiro passo foi transformar o tipo Tree em um objeto 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;
]])

Há também pequenas alterações que precisam ser feitas em read_data.lua para lidar com o novo tipo de cdata CTree. Usar o LDS parecia uma abordagem razoável para resolver o limite de memória até o momento; no entanto, o CTree requer um campo chamado 'compositor'.

O Composer é do tipo nn.gModule. Continuar com essa solução envolveria a criação de um typedef do nn.gModule como cdata, incluindo a criação de um typedef para seus membros. Antes de continuar, esta parece ser a direção correta a seguir? Alguém tem experiência com esse problema?

    
por user2827214 30.07.2015 в 19:59
fonte

1 resposta

2

Como você descobriu, representar dados estruturados em uma forma amigável ao heap do LuaJIT é um pouco trabalhoso no momento.

Na implementação Tree-LSTM, cada uma das tabelas em árvore contém um ponteiro para uma instância do compositor, principalmente para conveniência na implementação.

Uma solução alternativa para evitar o typedef-ing nn.gModule seria usar o campo idx existente para indexar em uma tabela de instâncias do compositor. Nessa abordagem, o par ( sentence_idx , node_idx ) pode ser usado exclusivamente para identificar um compositor em uma tabela global de dois níveis de instâncias do compositor. Para evitar problemas de memória, o código de limpeza atual pode ser substituído por uma linha que define o índice correspondente na tabela como nil .

    
por kst 03.08.2015 / 07:37
fonte