O CodesearchNet Challenge foi concluído
Gostaríamos de agradecer a todos os participantes por suas submissões e esperamos que esse desafio forneça informações a profissionais e pesquisadores sobre os desafios na pesquisa de código semântico e motivou novas pesquisas. Gostaríamos de incentivar todos a continuar usando o conjunto de dados e as avaliações humanas, que agora fornecemos publicamente. Veja abaixo os detalhes, especificamente a seção de avaliação.
Nenhum novo envio ao desafio será aceito.
Índice
Se esta é a sua primeira vez que lê isso, recomendamos pular esta seção e ler as seções a seguir. Os comandos abaixo assumem que você tem Docker e Nvidia-Docker, bem como uma GPU que suporta o CUDA 9.0 ou mais. NOTA: Você só deve executar script/setup uma vez para baixar os dados.
# clone this repository
git clone https://github.com/github/CodeSearchNet.git
cd CodeSearchNet/
# download data (~3.5GB) from S3; build and run the Docker container
script/setup
# this will drop you into the shell inside a Docker container
script/console
# optional: log in to W&B to see your training metrics,
# track your experiments, and submit your models to the benchmark
wandb login
# verify your setup by training a tiny model
python train.py --testrun
# see other command line options, try a full training run with default values,
# and explore other model variants by extending this baseline script
python train.py --help
python train.py
# generate predictions for model evaluation
python predict.py -r github/CodeSearchNet/0123456 # this is the org/project_name/run_idPor fim, você pode enviar sua execução para a referência da comunidade seguindo estas instruções.
O CodEsearchNet é uma coleção de conjuntos de dados e referências que exploram o problema da recuperação de código usando a linguagem natural. Esta pesquisa é uma continuação de algumas idéias apresentadas nesta postagem do blog e é uma colaboração conjunta entre o GitHub e o Profund Program Entendering Group na Microsoft Research - Cambridge. Nosso objetivo é fornecer uma plataforma para pesquisa comunitária sobre pesquisa de código semântico através do seguinte:
Esperamos que o CodEsearchNet seja um passo para se envolver com o aprendizado de máquina mais amplo e a comunidade de PNL sobre o relacionamento entre o código -fonte e a linguagem natural. Descrevemos uma tarefa específica aqui, mas esperamos e recebemos outros usos do nosso conjunto de dados.
Mais contexto sobre a motivação para esse problema está neste relatório técnico. Por favor, cite o conjunto de dados e o desafio como
@article{husain2019codesearchnet,
title={{CodeSearchNet} challenge: Evaluating the state of semantic code search},
author={Husain, Hamel and Wu, Ho-Hsiang and Gazit, Tiferet and Allamanis, Miltiadis and Brockschmidt, Marc},
journal={arXiv preprint arXiv:1909.09436},
year={2019}
}
O conjunto de dados principal consiste em 2 milhões ( comment , code ) pares das bibliotecas de código aberto. Concretamente, um comment é um comentário de função ou método de nível superior (por exemplo, docstrings no python) e code é uma função ou método inteiro. Atualmente, o conjunto de dados contém Python, JavaScript, Ruby, Go, Java e Código PHP. Ao longo deste repositório, nos referimos aos termos Docstring e consulta de forma intercambiável. Partimos os dados em divisões de trem, validação e teste, de modo que o código do mesmo repositório só possa existir em uma partição. Atualmente, este é o único conjunto de dados no qual treinamos nosso modelo. As estatísticas de resumo sobre este conjunto de dados podem ser encontradas neste caderno
Para obter mais informações sobre como obter os dados, consulte esta seção.
A métrica que usamos para avaliação é um ganho cumulativo com desconto normalizado. Por favor, faça referência a este artigo para obter mais detalhes sobre a avaliação do modelo. O script de avaliação pode ser encontrado aqui.
Anoteremos os resultados de recuperação manualmente para os seis idiomas de 99 consultas gerais. Este conjunto de dados é usado como dados de truta solitário apenas para avaliação. Consulte este artigo para obter mais detalhes sobre o processo de anotação. Essas anotações foram usadas para calcular as pontuações na tabela de classificação. Agora que a competição foi concluída, você pode encontrar as anotações, juntamente com os comentários do ANOTATOR AQUI.
Você só deve executar as etapas de configuração uma vez para baixar os dados e preparar o ambiente.
Devido à complexidade da instalação de todas as dependências, preparamos os contêineres do Docker para executar esse código. Você pode encontrar instruções sobre como instalar o Docker nos documentos oficiais. Além disso, você deve instalar o NVIDIA-Docker para satisfazer dependências relacionadas com computa de GPU. Para aqueles que são novos no Docker, esta postagem do blog fornece uma introdução suave focada na ciência de dados.
Depois de instalar o Docker, você precisa baixar os conjuntos de dados pré-processados, que estão hospedados no S3. Você pode fazer isso executando script/setup .
script/setup
Isso criará contêineres do Docker e baixará os conjuntos de dados. Por padrão, os dados são baixados para os resources/data/ pasta dentro deste repositório, com a estrutura do diretório descrita aqui.
Os conjuntos de dados que você baixará (a maioria deles compactados) têm um tamanho combinado de apenas ~ 3,5 GB.
script/console : script/console
/src . Você pode se destacar de/anexar a este contêiner para pausar/continuar seu trabalho.Para saber mais sobre os dados, consulte Detalhes dos dados abaixo, bem como este notebook.
Se você executou as etapas de configuração acima, já terá os dados e nada mais precisa ser feito. Os dados estarão disponíveis na pasta /resources/data deste repositório, com esta estrutura de diretório.
Os dados são armazenados no formato JSONLINES. Cada linha no arquivo não compactado representa um exemplo (geralmente uma função com um comentário associado). Um exemplo bonito de uma linha é ilustrado abaixo.
original_string que é o códigocodedocstringCódigo, comentários e documentos são extraídos de maneira específica do idioma, removendo artefatos desse idioma.
{
'code': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or \n"
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or \n"
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), 'v')",
'code_tokens': ['def',
'get_vid_from_url',
'(',
'url',
')',
':',
'return',
'match1',
'(',
'url',
',',
"r'youtu\.be/([^?/]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/embed/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/v/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/watch/([^/?]+)'",
')',
'or',
'parse_query_param',
'(',
'url',
',',
"'v'",
')',
'or',
'parse_query_param',
'(',
'parse_query_param',
'(',
'url',
',',
"'u'",
')',
',',
"'v'",
')'],
'docstring': 'Extracts video ID from URL.',
'docstring_tokens': ['Extracts', 'video', 'ID', 'from', 'URL', '.'],
'func_name': 'YouTube.get_vid_from_url',
'language': 'python',
'original_string': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or "
'\n'
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or "
'\n'
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), "
"'v')",
'partition': 'test',
'path': 'src/you_get/extractors/youtube.py',
'repo': 'soimort/you-get',
'sha': 'b746ac01c9f39de94cac2d56f665285b0523b974',
'url': 'https://github.com/soimort/you-get/blob/b746ac01c9f39de94cac2d56f665285b0523b974/src/you_get/extractors/youtube.py#L135-L143'
}
Estatísticas de resumo, como contagens de linha e histogramas de comprimento do token, podem ser encontradas neste caderno
O shell script /script/setup baixará automaticamente esses arquivos no diretório /resources/data . Aqui estão os links para os arquivos relevantes para visibilidade:
Os links S3 seguem este padrão:
https://s3.amazonaws.com/code-search-nalt/codesearchnet/v2/ {python.java,go ,php,javascript.ruby }.zip
Por exemplo, o link para o java é:
https://s3.amazonaws.com/code-search-nalt/codesearchnet/v2/java.zip
O tamanho do conjunto de dados é de aproximadamente 20 GB. Os vários arquivos e a estrutura do diretório são explicados aqui.
Para treinar modelos neurais com um grande conjunto de dados, usamos os comentários da documentação (por exemplo, DocStrings) como proxy. Para avaliação (e a tabela de classificação), coletamos julgamentos de relevância humana de pares de consultas de linguagem natural de aparência realista e trechos de código. Agora que o desafio foi concluído, fornecemos os dados aqui como um .csv , com os seguintes campos:
URL nos dados (veja aqui).Incentivamos você a reproduzir e estender esses modelos, embora a maioria das variantes leve várias horas para treinar (e algumas levam mais de 24 horas em uma instância do AWS P3-V100).
Nossos modelos de linha de base ingerem um corpus paralelo de ( comments , code ) e aprendem a recuperar um trecho de código, dada uma consulta de linguagem natural. Especificamente, comments são comentários de função e método de nível superior (por exemplo, documentos em Python), e code é uma função ou método inteiro. Ao longo deste repositório, nos referimos aos termos Docstring e consulta de forma intercambiável.
A consulta possui um único codificador, enquanto cada linguagem de programação tem seu próprio codificador. Os codificadores disponíveis são bancos neurais, RNN, 1D-CNN, autotenção (BERT) e um híbrido de auto-distribuição 1D-CNN+.
O diagrama abaixo ilustra a arquitetura geral de nossos modelos de linha de base:

Esta etapa pressupõe que você tenha um NVIDIA-GPU adequado com CUDA V9.0 instalado. Utilizamos instâncias AWS P3-V100 (um p3.2xlarge é suficiente).
Inicie o ambiente de execução do modelo executando script/console :
script/console
Isso o levará no shell de um contêiner do Docker com todas as dependências necessárias instaladas, incluindo o código neste repositório, juntamente com os dados que você baixou anteriormente. Por padrão, você será colocado na pasta src/ deste repositório do GitHub. A partir daqui, você pode executar comandos para executar o modelo.
Configure a W&B (gratuita para projetos de código aberto) de acordo com as instruções abaixo, se você quiser compartilhar seus resultados na referência da comunidade. Isso é opcional, mas altamente recomendado.
O ponto de entrada para este modelo é src/train.py . Você pode ver várias opções executando o seguinte comando:
python train.py --help
Para testar se tudo está funcionando em um pequeno conjunto de dados, você pode executar o seguinte comando:
python train.py --testrun
Agora você está preparado para uma corrida completa de treinamento. Exemplo de comandos para iniciar as execuções de treinamento:
Treinando um modelo neural-bagunça de palavras em todos os idiomas
python train.py --model neuralbow
O comando acima assumirá valores padrão para os locais dos dados de treinamento e um destino em que você deseja salvar o modelo de saída. O local padrão para dados de treinamento é especificado em /src/data_dirs_{train,valid,test}.txt data_dirs_ {Train,Valid.Test }.txt. Esses arquivos contêm uma lista de caminhos onde existem dados para a partição correspondente. Se mais de um caminho especificado (separado por uma nova linha), os dados de todos os caminhos serão concatenados juntos. Por exemplo, este é o conteúdo de src/data_dirs_train.txt :
$ cat data_dirs_train.txt
../resources/data/python/final/jsonl/train
../resources/data/javascript/final/jsonl/train
../resources/data/java/final/jsonl/train
../resources/data/php/final/jsonl/train
../resources/data/ruby/final/jsonl/train
../resources/data/go/final/jsonl/train
Por padrão, os modelos são salvos na pasta resources/saved_models deste repositório.
Treinando um modelo 1D-CNN apenas nos dados do Python:
python train.py --model 1dcnn /trained_models ../resources/data/python/final/jsonl/train ../resources/data/python/final/jsonl/valid ../resources/data/python/final/jsonl/test
O comando acima substitui os locais padrão para salvar o modelo para trained_models e também substitui a fonte do trem, validação e conjuntos de testes.
Notas adicionais:
As opções para --model estão atualmente listadas em src/model_restore_helper.get_model_class_from_name .
Os hiperparâmetros são específicos para as respectivas classes de modelo/codificador. Um truque simples para descobri -los é iniciar uma corrida sem especificar opções de hiperparâmetro, pois isso imprimirá uma lista de todos os hiperparâmetros usados com seus valores padrão (no formato JSON).
Estamos usando uma referência da comunidade para este projeto para incentivar a colaboração e melhorar a reprodutibilidade. É hospedado por pesos e vieses (W&B), que é gratuito para projetos de código aberto. Nossas entradas no link de referência para registros detalhados de nossas métricas de treinamento e avaliação, bem como artefatos de modelo, e incentivamos outros participantes a fornecer o máximo de detalhes possível.
Convidamos a comunidade a enviar suas corridas a esse benchmark para facilitar a transparência seguindo estas instruções.
Prevemos que a comunidade projetará arquiteturas personalizadas e usará estruturas que não sejam o tensorflow. Além disso, prevemos que conjuntos de dados adicionais serão úteis. Não é nossa intenção integrar esses modelos, abordagens e conjuntos de dados neste repositório como um superconjunto de todas as idéias disponíveis. Em vez disso, pretendemos manter os modelos de linha de base e links para os dados neste repositório como um local de referência central. Estamos aceitando o PRS que atualiza a documentação, link para seus projetos com benchmarks aprimorados, corrige bugs ou faça pequenas melhorias no código. Aqui estão diretrizes mais específicas para contribuir para este repositório; Observe particularmente o nosso código de conduta. Por favor, abra um problema se não tiver certeza do melhor curso de ação.
Para inicializar W&B:
Navegue até o diretório /src neste repositório.
Se for a sua primeira vez usando a W&B em uma máquina, você precisará fazer login:
$ wandb login
Você será solicitado pela sua chave de API, que aparece na página Configurações de perfil da W&B.
As licenças para o código -fonte usadas como dados para este projeto são fornecidas com o download de dados para cada idioma em arquivos _licenses.pkl .
Este código e documentação para este projeto são divulgados sob a licença do MIT.