Dieses Repository enthält den Code für das Papier "Die überraschende Rechenleistung von nichtterministischen Stapel -RNNs" (Dusell und Chiang, 2023). Es enthält den gesamten Code, der erforderlich ist, um die im Papier verwendeten Experimente und Zahlen zu reproduzieren, sowie eine Docker -Bilddefinition, mit der die Softwareumgebung, in der sie entwickelt wurden, replizieren kann.
Wenn Sie nach dem Code für unser früheres Papier "Lern hierarchische Strukturen mit differenzierbaren nichtterministischen Stapeln" (Dusell und Chiang, 2022) suchen, finden Sie in dieser Version diese Version.
Wenn Sie nach dem Code für unser früheres Papier "Lernkontextfreie Sprachen mit nichtdeterministischen Stapel-RNNs" (Dusell und Chiang, 2020) suchen, finden Sie in dieser Veröffentlichung bitte.
Dieses Repository enthält Pytorch -Implementierungen der folgenden Modelle:
data/ : Enthält Datensätze, die für Experimente verwendet werden, nämlich den Datensatz für PTB -Sprachmodellierungsdatensatz.experiments/ : Enthält Skripte zur Reproduktion aller Experimente und Abbildungen, die in der Arbeit vorgestellt wurden.capacity/ : Skripte für die Kapazitätsexperimente in Abschnitt 5.non-cfls/ : Skripte für die Nicht-CFL-Experimente in Abschnitt 4.ptb/ : Skripte für die PTB -Sprachmodellierungsexperimente in Abschnitt 6.scripts/ : Enthält Helferskripte zum Einrichten der Softwareumgebung, zum Erstellen von Containerbildern, zum Ausführen von Containern, zur Installation von Python -Paketen, zur Vorverarbeitung von Daten usw. Die Anweisungen zur Verwendung dieser Skripte finden Sie unten.src/ : Enthält Quellcode für alle Modelle, Trainingsroutinen, Handlungsskripte usw.tests/ : Enthält Unit -Tests für den Code unter src/ . Um die Reproduzierbarkeit zu fördern, wurde der Code für dieses Papier entwickelt und in einem Docker-Container ausgeführt, der in der Datei Dockerfile-dev definiert wurde. Um diesen Code auszuführen, können Sie das Docker -Image selbst erstellen und mit Docker ausführen. Oder wenn Sie keine Lust haben, Docker zu installieren, können Sie Dockerfile-dev einfach als Referenz für die Einrichtung der Softwareumgebung in Ihrem eigenen System verwenden. Sie können auch ein äquivalentes Singularitätsbild erstellen, das in einem HPC -Cluster verwendet werden kann, in dem wahrscheinlich Docker nicht verfügbar ist, aber Singularität ist.
In jedem Fall wird dringend empfohlen, die meisten Experimente auf einer Maschine mit Zugriff auf eine NVIDIA -GPU durchzuführen, damit sie innerhalb einer angemessenen Zeitspanne fertig sind. Die Ausnahme hierfür sind die Experimente für die Basismodelle (LSTM, Superposition -Stack LSTM und Stratification Stack LSTM) für die formalen Sprachmodellierungsaufgaben, da sie auf der CPU eher auf CPU als auf GPU fertiggestellt werden und im CPU -Modus ausgeführt werden sollten.
Um das Docker -Bild zu verwenden, müssen Sie zuerst Docker installieren. Wenn Sie beabsichtigen, Experimente an einer GPU auszuführen, müssen Sie auch sicherstellen, dass Ihr NVIDIA -Treiber ordnungsgemäß eingerichtet ist und das NVIDIA -Container -Toolkit installiert wird.
Um das öffentliche Docker -Bild automatisch zu ziehen, den Container zu starten und eine Bash -Shell darin zu öffnen, laufen Sie
$ bash scripts/docker-shell.bash --pull
Wenn Sie es vorziehen, das Bild von Grund auf selbst zu erstellen, können Sie ausführen
$ bash scripts/docker-shell.bash --build
Nachdem Sie das Bild einmal erstellt haben, müssen Sie dies nicht wieder tun. Danach können Sie einfach einfach rennen
$ bash scripts/docker-shell.bash
Standardmäßig startet dieses Skript den Container im GPU -Modus, der fehlschlägt, wenn Sie nicht auf einem Computer mit einer GPU ausgeführt werden. Wenn Sie die Dinge nur im CPU -Modus ausführen möchten, können Sie ausführen
$ bash scripts/docker-shell.bash --cpu
Sie können dies mit den Optionen --pull oder --build kombinieren.
Wenn Sie einen gemeinsam genutzten HPC -Cluster an Ihrer Institution verwenden, unterstützt es möglicherweise nicht Docker. Es besteht jedoch die Möglichkeit, Singularität zu unterstützen. Dies ist eine alternative Container -Laufzeit, die besser für gemeinsame Computerumgebungen geeignet ist.
Um den Code in einem Singularity -Container auszuführen, müssen Sie zuerst das Docker -Image erhalten und dann in eine Maschine in eine .sif -Datei (Singularity Image) umwandeln, in der Sie Root -Zugriff (z. B. Ihren PC oder Workstation) haben. Dies erfordert die Installation von Docker und Singularität auf dieser Maschine. Angenommen, Sie haben das Docker -Image bereits gemäß den obigen Anweisungen erstellt, können Sie Folgendes verwenden, um die .sif -Datei zu erstellen:
$ bash scripts/build-singularity-image.bash
Dadurch wird die Datei nondeterministic-stack-rnn-2023.sif erstellt. Es ist normal, dass dies einige Minuten dauert. Anschließend können Sie die .sif -Datei in Ihr HPC -Cluster hochladen und dort verwenden.
Sie können eine Hülle im Singularitätsbehälter mithilfe öffnen
$ bash scripts/singularity-shell.bash
Dies funktioniert auf Maschinen, die eine NVIDIA -GPU haben und keine GPU ausgeben, wenn es keine GPU gibt.
Hier finden Sie ein allgemeineres Tutorial über Singularität.
Unabhängig von der Methode, mit der Sie den Code ausführen (ob in einem Docker -Container, Singularity Container oder ohne Container), müssen Sie zusätzliche Setup- und Vorverarbeitungsschritte ausführen, die Sie ausführen müssen. Das folgende Skript kümmert sich für Sie um diese (wenn Sie einen Container verwenden, müssen Sie dies in der Containerschale ausführen):
$ bash scripts/setup.bash
Insbesondere dieses Skript:
Alle Dateien unter src/ sollten mit poetry ausgeführt werden, damit sie Zugriff auf die Python -Pakete haben, die vom Poetry -Paket -Manager bereitgestellt werden. Dies bedeutet, dass Sie entweder alle Ihre Befehle mit poetry run oder poetry shell ausführen sollten, um eine Shell mit der ständig aktiven Virtualenv von Poesie einzugeben. Sie sollten sowohl Python- als auch Bash -Skripte mit Gedichten ausführen, da die Bash -Skripte möglicherweise zu Python -Skripten rufen. Alle Bash -Skripte unter src/ sollten mit src/ als aktuellem Arbeitsverzeichnis ausgeführt werden.
Alle Skripte unter scripts/ sollten mit dem Top-Level-Verzeichnis als aktuelles Arbeitsverzeichnis ausgeführt werden.
Die experiments/ Verzeichnisse enthält Skripte zur Reproduktion aller in der Arbeit vorgestellten Experimente und Diagramme. Einige dieser Skripte sollen verwendet werden, um Jobs an einen Computercluster zu senden. Sie sollten außerhalb des Behälters geleitet werden. Sie müssen die Dateiexperimente experiments/submit-job.bash bearbeiten, um sie auf Ihren spezifischen Computercluster anzupassen. Andere Skripte dienen zum Aufzeichnen oder Drucken von Tischen und sollten im Container ausgeführt werden.