Ce référentiel contient le code du papier "la puissance de calcul surprenante des RNN de pile non déterministes" (Dusell et Chiang, 2023). Il comprend tout le code nécessaire pour reproduire les expériences et les chiffres utilisés dans l'article, ainsi qu'une définition d'image Docker qui peut être utilisée pour reproduire l'environnement logiciel dans lequel il a été développé.
Si vous recherchez le code de notre article précédent "Apprentissage des structures hiérarchiques avec des piles non déterministes différenciables" (Dusell et Chiang, 2022), veuillez consulter ce communiqué.
Si vous recherchez le code de notre article précédent "Apprentissage des langues sans contexte avec des RNN de pile non déterministes" (Dusell et Chiang, 2020), veuillez consulter ce communiqué.
Ce référentiel comprend des implémentations Pytorch des modèles suivants:
data/ : Contient des ensembles de données utilisés pour les expériences, à savoir l'ensemble de données de modélisation du langage PTB.experiments/ : contient des scripts pour reproduire toutes les expériences et figures présentées dans l'article.capacity/ : scripts pour les expériences de capacité dans la section 5.non-cfls/ : Scripts pour les expériences non-CFL dans la section 4.ptb/ : Scripts pour les expériences de modélisation du langage PTB dans la section 6.scripts/ : contient des scripts d'assistance pour configurer l'environnement logiciel, créer des images de conteneurs, exécuter des conteneurs, installer des packages Python, des données de prétraitement, etc. Les instructions pour l'utilisation de ces scripts sont ci-dessous.src/ : contient du code source pour tous les modèles, des routines de formation, des scripts de traçage, etc.tests/ : contient des tests unitaires pour le code sous src/ . Afin de favoriser la reproductibilité, le code de ce document a été développé et exécuté à l'intérieur d'un conteneur Docker défini dans le fichier Dockerfile-dev . Pour exécuter ce code, vous pouvez créer vous-même l'image Docker et l'exécuter à l'aide de Docker. Ou, si vous n'avez pas envie d'installer Docker, vous pouvez simplement utiliser Dockerfile-dev comme référence pour configurer l'environnement logiciel sur votre propre système. Vous pouvez également construire une image de singularité équivalente qui peut être utilisée sur un cluster HPC, où il est probable que Docker n'est pas disponible mais que la singularité l'est.
Dans tous les cas, il est fortement recommandé d'exécuter la plupart des expériences sur une machine avec accès à un GPU NVIDIA afin qu'ils terminent dans un délai raisonnable. L'exception à cela est les expériences des modèles de base (LSTM, Superposition Stack LSTM et Stratification Stack LSTM) sur les tâches formelles de modélisation du langage, car elles se terminent plus rapidement sur CPU plutôt que sur GPU et doivent être exécutées en mode CPU.
Pour utiliser l'image Docker, vous devez d'abord installer Docker. Si vous avez l'intention d'exécuter des expériences sur un GPU, vous devez également vous assurer que votre pilote NVIDIA est configuré correctement et installer la boîte à outils NVIDIA Container.
Afin de retirer automatiquement l'image du Docker public, de démarrer le conteneur et d'ouvrir une coquille bash à l'intérieur, de courir
$ bash scripts/docker-shell.bash --pull
Si vous préférez construire l'image à partir de zéro vous-même, vous pouvez courir
$ bash scripts/docker-shell.bash --build
Après avoir construit l'image une fois, il n'est pas nécessaire de le faire à nouveau, donc après vous pouvez simplement courir
$ bash scripts/docker-shell.bash
Par défaut, ce script démarre le conteneur en mode GPU, qui échouera si vous n'exécutez pas sur une machine avec un GPU. Si vous voulez seulement exécuter des choses en mode CPU, vous pouvez courir
$ bash scripts/docker-shell.bash --cpu
Vous pouvez combiner cela avec les options --pull ou --build .
Si vous utilisez un cluster HPC partagé dans votre établissement, il pourrait ne pas prendre en charge Docker, mais il y a une chance qu'il soutienne la singularité, qui est un autre runtime de conteneurs qui convient plus aux environnements informatiques partagés.
Afin d'exécuter le code dans un conteneur de singularité, vous devez d'abord obtenir l'image Docker, puis la convertir en fichier .sif (image de singularité) sur une machine où vous avez un accès racine (par exemple votre ordinateur personnel ou votre poste de travail). Cela nécessite d'installer Docker et la singularité sur cette machine. En supposant que vous avez déjà construit l'image Docker en fonction des instructions ci-dessus, vous pouvez utiliser ce qui suit pour créer le fichier .sif :
$ bash scripts/build-singularity-image.bash
Cela créera le fichier nondeterministic-stack-rnn-2023.sif . Il est normal que cela prenne plusieurs minutes. Ensuite, vous pouvez télécharger le fichier .sif sur votre cluster HPC et l'utiliser là-bas.
Vous pouvez ouvrir une coquille dans le conteneur de singularité en utilisant
$ bash scripts/singularity-shell.bash
Cela fonctionnera sur des machines qui ont et n'ont pas de GPU NVIDIA, bien qu'il affiche un avertissement s'il n'y a pas de GPU.
Vous pouvez trouver un tutoriel plus général sur la singularité ici.
Quelle que soit la méthode que vous utilisez pour exécuter le code (que ce soit dans un conteneur Docker, un conteneur de singularité ou aucun conteneur), il existe des étapes de configuration et de prétraitement supplémentaires que vous devez exécuter. Le script suivant s'en occupera pour vous (si vous utilisez un conteneur, vous devez l'exécuter à l'intérieur du shell de conteneur ):
$ bash scripts/setup.bash
Plus précisément, ce script:
Tous les fichiers sous src/ doivent être exécutés à l'aide de poetry afin qu'ils aient accès aux packages Python fournis par le Poetry Package Manager. Cela signifie que vous devez préfixer toutes vos commandes avec poetry run ou exécuter poetry shell au préalable pour entrer un shell avec VirtualEnv de Poetry activé tout le temps. Vous devez exécuter les scripts Python et Bash avec de la poésie, car les scripts bash pourraient appeler les scripts Python. Tous les scripts Bash sous src/ doivent être exécutés avec src/ comme répertoire de travail actuel.
Tous les scripts sous scripts/ doivent être exécutés avec le répertoire de niveau supérieur comme répertoire de travail actuel.
Les experiments/ répertoires contient des scripts pour reproduire toutes les expériences et les tracés présentés dans l'article. Certains de ces scripts sont destinés à être utilisés pour soumettre des emplois à un cluster informatique. Ils devraient être exécutés à l'extérieur du conteneur. Vous devrez modifier les experiments/submit-job.bash pour l'adapter à votre cluster informatique spécifique. D'autres scripts sont destinés à tracer ou à imprimer des tables et doivent être exécutés à l'intérieur du conteneur.