该存储库包含“非确定堆栈RNN的令人惊讶的计算能力”的代码(Dusell and Chiang,2023)。它包括复制论文中使用的实验和数字所需的所有代码,以及可用于复制开发的软件环境的Docker Image定义。
如果您正在寻找我们较早的论文的代码,“学习具有不同的非确定堆栈的层次结构”(Dusell and Chiang,2022),请参阅此版本。
如果您正在寻找我们较早的论文“使用非确定性堆栈RNN的无上下文语言”的代码(Dusell and Chiang,2020),请参阅此版本。
该存储库包括以下模型的Pytorch实现:
data/ :包含用于实验的数据集,即PTB语言建模数据集。experiments/ :包含用于复制论文中所有实验和数字的脚本。capacity/ :第5节中容量实验的脚本。non-cfls/ :脚本。ptb/ :第6节中PTB语言建模实验的脚本。scripts/ :包含用于设置软件环境,构建容器图像,运行容器,安装Python软件包,预处理数据等的辅助脚本。使用这些脚本的说明如下。src/ :包含所有模型,培训例程,绘图脚本等的源代码。tests/ :在src/下包含代码的单元测试。 为了培养可重复性,开发了本文的代码并在文件Dockerfile-dev中定义的Docker容器内部运行。要运行此代码,您可以自己构建Docker Image并使用Docker运行它。或者,如果您不想安装Docker,则只需使用Dockerfile-dev作为参考即可在您自己的系统上设置软件环境。您还可以构建一个等效的奇异图像,该图像可以在HPC群集上使用,在那里很可能docker不可用,但奇异性是。
无论如何,强烈建议在机器上运行大多数实验,并可以使用NVIDIA GPU,以便它们在合理的时间内完成。此例外是基线模型(LSTM,叠加堆栈LSTM和分层堆栈LSTM)的实验,因为它们在CPU而不是GPU上更快地完成,因此应在CPU模式下运行。
为了使用Docker映像,您必须首先安装Docker。如果您打算在GPU上运行任何实验,则还必须确保正确设置NVIDIA驱动程序并安装NVIDIA容器工具包。
为了自动拉动公共Docker映像,启动容器并打开其内部的bash壳,运行
$ bash scripts/docker-shell.bash --pull
如果您希望自己从头开始构建图像,则可以运行
$ bash scripts/docker-shell.bash --build
构建图像一次后,无需再做一次,因此您可以简单地运行
$ bash scripts/docker-shell.bash
默认情况下,此脚本以GPU模式启动容器,如果您在使用GPU的计算机上运行,该脚本将失败。如果您只想在CPU模式下运行事物,则可以运行
$ bash scripts/docker-shell.bash --cpu
您可以将其与--pull或--build选项相结合。
如果您在机构使用共享的HPC群集,它可能不支持Docker,但是它确实有可能支持奇异性,这是一种替代的容器运行时,更适合共享计算环境。
为了在奇异容器中运行代码,您必须首先获取Docker映像,然后将其转换为具有root访问的机器上的.sif (奇异映像)文件(例如您的个人计算机或工作站)。这需要在该机器上同时安装Docker和奇异性。假设您已经根据上述说明构建了Docker映像,则可以使用以下来创建.sif文件:
$ bash scripts/build-singularity-image.bash
这将创建文件nondeterministic-stack-rnn-2023.sif 。这需要几分钟的时间是正常的。之后,您可以将.sif文件上传到HPC群集并在此处使用。
您可以使用奇异容器中的外壳使用
$ bash scripts/singularity-shell.bash
这将适用于具有NVIDIA GPU的机器,尽管如果没有GPU,它将输出警告。
您可以在此处找到有关奇点的更一般的教程。
无论您使用什么方法来运行代码(无论是在码头容器,奇异容器还是没有容器中),都需要运行一些其他设置和预处理步骤。以下脚本将为您照顾这些(如果您使用的是容器,则必须在容器外壳内运行):
$ bash scripts/setup.bash
更具体地说,此脚本:
src/下的所有文件都应使用poetry运行,以便它们可以访问诗歌软件包管理器提供的Python软件包。这意味着您应该将所有命令都带有poetry run ,或者事先将poetry shell前缀以始终启用诗歌的Virtualenv进入外壳。您应该使用诗歌同时运行Python和Bash脚本,因为Bash脚本可能会呼唤Python脚本。 src/下的所有BASH脚本都应以src/作为当前工作目录运行。
scripts/下的所有脚本都应以最高级别目录作为当前工作目录运行。
experiments/目录包含用于复制论文中所有实验和图的脚本。其中一些脚本旨在将作业提交到计算集群中。它们应该在容器外面运行。您将需要编辑文件experiments/submit-job.bash将其定制为特定的计算集群。其他脚本用于绘制或打印表,应在容器内运行。