Este repositorio contiene el código para el documento "El sorprendente poder computacional de los rnns de pila no deterministas" (Dusell y Chiang, 2023). Incluye todo el código necesario para reproducir los experimentos y figuras utilizados en el documento, así como una definición de imagen Docker que puede usarse para replicar el entorno de software en el que se desarrolló.
Si está buscando el código para nuestro artículo anterior "Estructuras jerárquicas de aprendizaje con pilas no detecterministas diferenciables" (Dusell y Chiang, 2022), consulte esta versión.
Si está buscando el código para nuestro artículo anterior "Aprender los idiomas sin contexto con RNNS no deterministas" (Dusell y Chiang, 2020), consulte este lanzamiento.
Este repositorio incluye implementaciones de Pytorch de los siguientes modelos:
data/ : Contiene conjuntos de datos utilizados para experimentos, a saber, el conjunto de datos de modelado de lenguaje PTB.experiments/ : contiene scripts para reproducir todos los experimentos y figuras presentados en el documento.capacity/ : Scripts para los experimentos de capacidad en la Sección 5.non-cfls/ : para los experimentos no FLE en la Sección 4.ptb/ : Scripts para los experimentos de modelado de lenguaje PTB en la Sección 6.scripts/ : Contiene scripts auxiliares para configurar el entorno de software, construir imágenes de contenedores, ejecutar contenedores, instalar paquetes de Python, preprocesar datos, etc. Las instrucciones para usar estos scripts están a continuación.src/ : contiene código fuente para todos los modelos, rutinas de entrenamiento, trazar scripts, etc.tests/ : contiene pruebas unitarias para el código en src/ . Para fomentar la reproducibilidad, el código para este documento se desarrolló y se ejecutó dentro de un contenedor Docker definido en el archivo Dockerfile-dev . Para ejecutar este código, puede construir la imagen de Docker usted mismo y ejecutarla usando Docker. O, si no tiene ganas de instalar Docker, simplemente puede usar Dockerfile-dev como referencia para configurar el entorno de software en su propio sistema. También puede construir una imagen de singularidad equivalente que se puede usar en un clúster HPC, donde es probable que Docker no esté disponible, pero la singularidad lo está.
En cualquier caso, se recomienda ejecutar la mayoría de los experimentos en una máquina con acceso a una GPU NVIDIA para que terminen dentro de un tiempo razonable. La excepción a esto son los experimentos para los modelos de línea de base (LSTM, Superposition Stack LSTM y Stratification Stack LSTM) en las tareas formales de modelado de idiomas, ya que terminan más rápidamente en CPU en lugar de GPU y deben ejecutarse en modo CPU.
Para usar la imagen Docker, primero debe instalar Docker. Si tiene la intención de ejecutar algún experimento en una GPU, también debe asegurarse de que su controlador NVIDIA esté configurado correctamente e instalar el kit de herramientas NVIDIA Container.
Para extraer automáticamente la imagen pública de Docker, iniciar el contenedor y abrir un caparazón de Bash dentro de ella, ejecutarla
$ bash scripts/docker-shell.bash --pull
Si prefiere construir la imagen desde cero, puede ejecutar
$ bash scripts/docker-shell.bash --build
Después de haber construido la imagen una vez, no hay necesidad de hacerlo nuevamente, por lo que luego simplemente puede ejecutar
$ bash scripts/docker-shell.bash
Por defecto, este script inicia el contenedor en modo GPU, que fallará si no está ejecutando una máquina con una GPU. Si solo desea ejecutar cosas en modo CPU, puede ejecutar
$ bash scripts/docker-shell.bash --cpu
Puede combinar esto con las opciones --pull o --build .
Si usa un clúster HPC compartido en su institución, es posible que no admita Docker, pero existe la posibilidad de que respalde la singularidad, que es un tiempo de ejecución alternativo de contenedores que es más adecuado para entornos de computación compartidos.
Para ejecutar el código en un contenedor de singularidad, primero debe obtener la imagen de Docker y luego convertirlo en un archivo .sif (imagen de singularidad) en una máquina donde tiene acceso raíz (por ejemplo, su computadora o estación de trabajo personal). Esto requiere instalar Docker y Singularity en esa máquina. Suponiendo que ya ha creado la imagen de Docker de acuerdo con las instrucciones anteriores, puede usar lo siguiente para crear el archivo .sif :
$ bash scripts/build-singularity-image.bash
Esto creará el archivo nondeterministic-stack-rnn-2023.sif . Es normal que esto tome varios minutos. Posteriormente, puede cargar el archivo .sif en su clúster HPC y usarlo allí.
Puede abrir una carcasa en el contenedor de singularidad utilizando
$ bash scripts/singularity-shell.bash
Esto funcionará en máquinas que no tienen una GPU NVIDIA, aunque generará una advertencia si no hay GPU.
Puede encontrar un tutorial más general sobre singularidad aquí.
Cualquiera que sea el método que use para ejecutar el código (ya sea en un contenedor Docker, contenedor de singularidad o ningún contenedor), hay algunos pasos de configuración y preprocesamiento adicionales que debe ejecutar. El siguiente script se encargará de esto por usted (si está utilizando un contenedor, debe ejecutar esto dentro del caparazón del contenedor ):
$ bash scripts/setup.bash
Más específicamente, este script:
Todos los archivos en src/ deben ejecutarse usando poetry para que tengan acceso a los paquetes de Python proporcionados por el Administrador de paquetes de poesía. Esto significa que debe prefijar todos sus comandos con poetry run o ejecutar poetry shell de antemano para ingresar a un shell con VirtualEnv de poesía habilitado todo el tiempo. Debes ejecutar scripts de Python y Bash con poesía, porque los scripts bash podrían llamar a los scripts de Python. Todos los scripts bash en src/ deben ejecutarse con src/ como el directorio de trabajo actual.
Todos los scripts en scripts/ deben ejecutarse con el directorio de nivel superior como el directorio de trabajo actual.
Los experiments/ directorio contienen scripts para reproducir todos los experimentos y gráficos presentados en el documento. Algunos de estos scripts están destinados a ser utilizados para enviar trabajos a un clúster informático. Deben correr fuera del contenedor. Deberá editar los experiments/submit-job.bash para adaptarlo a su clúster informático específico. Otros scripts son para trazar o imprimir tablas y deben ejecutarse dentro del contenedor.