Este repositório contém o código para o artigo "O surpreendente poder computacional dos RNNs de pilha não determinística" (Dusell e Chiang, 2023). Ele inclui todo o código necessário para reproduzir os experimentos e números usados no papel, bem como uma definição de imagem do Docker que pode ser usada para replicar o ambiente de software em que foi desenvolvido.
Se você está procurando o código para o nosso artigo anterior "Aprendendo estruturas hierárquicas com pilhas não determinísticas diferenciáveis" (Dusell e Chiang, 2022), consulte este lançamento.
Se você está procurando o código para o nosso artigo anterior "Aprendendo idiomas sem contexto com RNNs de pilha não determinística" (Dusell e Chiang, 2020), consulte este lançamento.
Este repositório inclui implementações de Pytorch dos seguintes modelos:
data/ : Contém conjuntos de dados usados para experimentos, a saber, o conjunto de dados de modelagem de idiomas PTB.experiments/ : Contém scripts para reproduzir todos os experimentos e números apresentados no artigo.capacity/ : Scripts para as experiências de capacidade na Seção 5.non-cfls/ : Scripts para os experimentos não CFL na Seção 4.ptb/ : Scripts para os experimentos de modelagem de idiomas PTB na Seção 6.scripts/ : contém scripts auxiliares para configurar o ambiente de software, criar imagens de contêineres, executar contêineres, instalar pacotes Python, pré -processamento de dados, etc. As instruções para o uso desses scripts estão abaixo.src/ : contém código -fonte para todos os modelos, rotinas de treinamento, plotagem de scripts, etc.tests/ : Contém testes de unidade para o código em src/ . Para promover a reprodutibilidade, o código para este documento foi desenvolvido e executado dentro de um contêiner do Docker definido no arquivo Dockerfile-dev . Para executar esse código, você pode criar a imagem do Docker e executá -la usando o Docker. Ou, se você não tiver vontade de instalar o Docker, basta usar Dockerfile-dev como uma referência para configurar o ambiente de software em seu próprio sistema. Você também pode criar uma imagem de singularidade equivalente que pode ser usada em um cluster HPC, onde é provável que o Docker não esteja disponível, mas a singularidade está.
De qualquer forma, é altamente recomendável executar a maioria das experiências em uma máquina com acesso a uma GPU da NVIDIA para que eles terminem em um período de tempo razoável. A exceção a isso são as experiências para os modelos de linha de base (LSTM, pilha de superposição LSTM e pilha de estratificação LSTM) nas tarefas formais de modelagem de idiomas, pois elas terminam mais rapidamente na CPU em vez de GPU e devem ser executadas no modo CPU.
Para usar a imagem do Docker, você deve primeiro instalar o Docker. Se você pretende executar quaisquer experimentos em uma GPU, também deve garantir que o driver da NVIDIA esteja configurado corretamente e instale o kit de ferramentas do NVIDIA.
Para puxar automaticamente a imagem pública do Docker, inicie o contêiner e abra uma casca de festa dentro dela, execute
$ bash scripts/docker-shell.bash --pull
Se você preferir construir a imagem do zero, você pode correr
$ bash scripts/docker-shell.bash --build
Depois de construir a imagem uma vez, não há necessidade de fazê -lo novamente, então depois você pode simplesmente executar
$ bash scripts/docker-shell.bash
Por padrão, esse script inicia o contêiner no modo GPU, que falhará se você não estiver executando em uma máquina com uma GPU. Se você quiser apenas executar as coisas no modo CPU, você pode executar
$ bash scripts/docker-shell.bash --cpu
Você pode combinar isso com as opções --pull ou --build .
Se você usar um cluster de HPC compartilhado em sua instituição, ele pode não suportar o Docker, mas há uma chance de apoiar o singularidade, que é um tempo de execução alternativo de contêineres que é mais adequado para ambientes de computação compartilhada.
Para executar o código em um contêiner de singularidade, você deve primeiro obter a imagem do Docker e depois convertê -lo em um arquivo .sif (imagem de singularidade) em uma máquina em que você tem acesso root (por exemplo, seu computador pessoal ou estação de trabalho). Isso requer a instalação do Docker e Singularity nessa máquina. Supondo que você já tenha construído a imagem do Docker de acordo com as instruções acima, você pode usar o seguinte para criar o arquivo .sif :
$ bash scripts/build-singularity-image.bash
Isso criará o arquivo nondeterministic-stack-rnn-2023.sif . É normal que isso leve vários minutos. Depois, você pode fazer upload do arquivo .sif para o cluster HPC e usá -lo lá.
Você pode abrir uma concha no recipiente de singularidade usando
$ bash scripts/singularity-shell.bash
Isso funcionará em máquinas que possuem e não possuem uma GPU da NVIDIA, embora produza um aviso se não houver GPU.
Você pode encontrar um tutorial mais geral sobre a singularidade aqui.
Qualquer que seja o método que você use para executar o código (seja em um contêiner do docker, contêiner de singularidade ou nenhum contêiner), existem algumas etapas adicionais de configuração e pré -processamento que você precisa executar. O script a seguir cuidará disso para você (se você estiver usando um contêiner, você deve executá -lo dentro do shell do contêiner ):
$ bash scripts/setup.bash
Mais especificamente, este script:
Todos os arquivos no src/ devem ser executados usando poetry , para que tenham acesso aos pacotes Python fornecidos pelo Poether Package Manager. Isso significa que você deve prefixar todos os seus comandos com o shell poetry run ou executar poetry shell antes para inserir um shell com o virtualENV da poesia ativado o tempo todo. Você deve executar scripts Python e Bash com poesia, porque os scripts do Bash podem chamar scripts Python. Todos os scripts bash no src/ devem ser executados com src/ como o diretório de trabalho atual.
Todos os scripts em scripts/ devem ser executados com o diretório de nível superior como o diretório de trabalho atual.
Os experiments/ diretório contém scripts para reproduzir todos os experimentos e gráficos apresentados no artigo. Alguns desses scripts devem ser usados para enviar trabalhos para um cluster de computação. Eles devem ser executados fora do contêiner. Você precisará editar os experiments/submit-job.bash para adaptá-lo ao seu cluster de computação específico. Outros scripts são para plotar ou imprimir tabelas e devem ser executados dentro do contêiner.