Ist dies ein praktischer Weg, 'Nicht genügend Speicher' von LuaJit mit Fackel zu lösen?

9

StanfordNLPs TreeLSTM , wenn es mit einem Dataset mit & gt; 30K Instanzen verursacht LuaJit zu Fehler mit "nicht genügend Arbeitsspeicher". Ich löse dies mithilfe von LuaJit-Datenstrukturen . Um das Dataset außerhalb von Luas Heap zu erhalten, müssen die Bäume in einem LDS.Vector platziert werden.

Da der LDS.Vector cdata enthält, bestand der erste Schritt darin, den Tree-Typ in ein cdata-Objekt umzuwandeln:

%Vor%

Es gibt auch kleine Änderungen, die in read_data.lua vorgenommen werden müssen, um den neuen cdata-CTree-Typ zu behandeln. Die Verwendung von LDS schien ein vernünftiger Ansatz zu sein, um das Speicherlimit bisher zu lösen; Das CTree erfordert jedoch ein Feld namens "Composer".

Composer ist vom Typ nn.gModule. Um mit dieser Lösung fortzufahren, müssen Sie einen Typdef des nn.gModuls als cdata erstellen, einschließlich der Erstellung eines typedef für seine Member. Bevor Sie fortfahren, scheint dies die richtige Richtung zu sein, um zu folgen? Hat jemand Erfahrung mit diesem Problem?

    
user2827214 30.07.2015, 17:59
quelle

1 Antwort

2

Wie Sie festgestellt haben, ist das Repräsentieren strukturierter Daten in einer haufenfreundlichen LuaJIT-Art im Moment ein wenig mühsam.

In der Tree-LSTM-Implementierung enthalten die Baumtabellen hauptsächlich aus Zweckmäßigkeit bei der Implementierung einen Zeiger auf eine Composer-Instanz.

Eine Umgehungslösung zur Vermeidung von typedefing nn.gModule wäre, das vorhandene Feld idx zu verwenden, um in eine Tabelle von Composer-Instanzen zu indizieren. Bei diesem Ansatz kann das Paar ( sentence_idx , node_idx ) eindeutig dazu verwendet werden, einen Composer in einer globalen zweistufigen Tabelle von Composer-Instanzen zu identifizieren. Um Speicherprobleme zu vermeiden, kann der aktuelle Bereinigungscode durch eine Zeile ersetzt werden, die den entsprechenden Index in der Tabelle auf nil setzt.

    
kst 03.08.2015 05:37
quelle

Tags und Links