El desafío de CodeSearchnet ha sido concluido
Nos gustaría agradecer a todos los participantes por sus presentaciones y esperamos que este desafío haya proporcionado información a los profesionales e investigadores sobre los desafíos en la búsqueda de código semántico y una nueva investigación motivada. Nos gustaría alentar a todos a continuar usando el conjunto de datos y las evaluaciones humanas, que ahora proporcionamos públicamente. Por favor, consulte a continuación para más detalles, específicamente la sección de evaluación.
No se aceptarán nuevas presentaciones al desafío.
Tabla de contenido
Si esta es la primera vez que lee esto, recomendamos omitir esta sección y leer las siguientes secciones. Los siguientes comandos suponen que tiene Docker y Nvidia-Docker, así como una GPU que admite CUDA 9.0 o más. Nota: Solo debería tener que ejecutar script/setup una vez para descargar los datos.
# 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_idFinalmente, puede enviar su carrera a la comunidad de referencia siguiendo estas instrucciones.
CodeSearchNet es una colección de conjuntos de datos y puntos de referencia que exploran el problema de la recuperación de código utilizando el lenguaje natural. Esta investigación es una continuación de algunas ideas presentadas en esta publicación de blog y es una colaboración conjunta entre GitHub y el grupo de comprensión del programa profundo en Microsoft Research - Cambridge. Nuestro objetivo es proporcionar una plataforma para la investigación de la comunidad sobre la búsqueda de código semántico a través de lo siguiente:
Esperamos que CodeSearchnet sea un paso hacia la participación con el aprendizaje automático más amplio y la comunidad de PNL con respecto a la relación entre el código fuente y el lenguaje natural. Describimos una tarea específica aquí, pero esperamos y damos la bienvenida a otros usos de nuestro conjunto de datos.
Más contexto con respecto a la motivación para este problema es en este informe técnico. Por favor, cite el conjunto de datos y el desafío 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}
}
El conjunto de datos principal consta de 2 millones ( comment , code ) pares de bibliotecas de código abierto. Concretamente, un comment es una función o comentario de método de nivel superior (por ejemplo, documentos en Python), y code es una función o método completo. Actualmente, el conjunto de datos contiene el código Python, JavaScript, Ruby, GO, Java y PHP. A lo largo de este repositorio, nos referimos a los términos documentos y consultas indistintamente. Participamos los datos en entradas, validación y divisiones de pruebas de tal manera que el código del mismo repositorio solo puede existir en una partición. Actualmente este es el único conjunto de datos en el que capacitamos nuestro modelo. Las estadísticas resumidas sobre este conjunto de datos se pueden encontrar en este cuaderno
Para obtener más información sobre cómo obtener los datos, consulte esta sección.
La métrica que utilizamos para la evaluación es una ganancia acumulativa con descuento normalizada. Consulte este documento para obtener más detalles sobre la evaluación del modelo. El script de evaluación se puede encontrar aquí.
Anotamos manualmente los resultados de recuperación para los seis idiomas de 99 consultas generales. Este conjunto de datos se utiliza como datos de TRUTH solo para evaluación. Consulte este documento para obtener más detalles sobre el proceso de anotación. Estas anotaciones se utilizaron para calcular los puntajes en la clasificación. Ahora que se ha concluido la competencia, puede encontrar las anotaciones, junto con los comentarios del anotador aquí.
Solo debería tener que realizar los pasos de configuración una vez para descargar los datos y preparar el entorno.
Debido a la complejidad de la instalación de todas las dependencias, preparamos contenedores Docker para ejecutar este código. Puede encontrar instrucciones sobre cómo instalar Docker en los documentos oficiales. Además, debe instalar nvidia-docker para satisfacer las dependencias relacionadas con la computa de GPU. Para aquellos que son nuevos en Docker, esta publicación de blog proporciona una introducción suave centrada en la ciencia de datos.
Después de instalar Docker, debe descargar los conjuntos de datos preprocesados, que están alojados en S3. Puede hacerlo ejecutando script/setup .
script/setup
Esto construirá contenedores Docker y descargará los conjuntos de datos. De manera predeterminada, los datos se descargan en los resources/data/ carpeta dentro de este repositorio, con la estructura del directorio descrita aquí.
Los conjuntos de datos que descargará (la mayoría de ellos comprimidos) tienen un tamaño combinado de solo ~ 3.5 GB.
script/console : script/console
/src . Puede separar/adjuntar a este contenedor para detener/continuar su trabajo.Para obtener más información sobre los datos, consulte los detalles de los datos a continuación, así como este cuaderno.
Si ha ejecutado los pasos de configuración anteriores, ya tendrá los datos, y no hay que hacer nada más. Los datos estarán disponibles en la carpeta /resources/data de este repositorio, con esta estructura de directorio.
Los datos se almacenan en formato JSONLINES. Cada línea en el archivo sin comprimir representa un ejemplo (generalmente una función con un comentario asociado). A continuación se ilustra un ejemplo de una fila.
original_string que es el códigocode tokenizadadocstringEl código, los comentarios y las documentos se extraen de manera específica del lenguaje, eliminando los artefactos de ese 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'
}
Las estadísticas resumidas como los recuentos de filas y los histogramas de longitud del token se pueden encontrar en este cuaderno
El script /script/setup de shell descargará automáticamente estos archivos en el directorio /resources/data . Aquí están los enlaces a los archivos relevantes para la visibilidad:
Los enlaces S3 siguen este patrón:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/{python,java,go,php,javascript,rubyh}.zip
Por ejemplo, el enlace para java es:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
El tamaño del conjunto de datos es de aproximadamente 20 GB. Los diversos archivos y la estructura del directorio se explican aquí.
Para entrenar modelos neuronales con un gran conjunto de datos, utilizamos los comentarios de documentación (por ejemplo, documentos) como un proxy. Para la evaluación (y la tabla de clasificación), recopilamos juicios de relevancia humana de pares de consultas de lenguaje natural de aspecto realista y fragmentos de código. Ahora que se ha concluido el desafío, proporcionamos los datos aquí como un .csv , con los siguientes campos:
URL en los datos (ver aquí).Le recomendamos que reproduzca y extienda estos modelos, aunque la mayoría de las variantes tardan varias horas en entrenar (y algunas tardan más de 24 horas en una instancia de AWS P3-V100).
Nuestros modelos de referencia ingieren un corpus paralelo de ( comments , code ) y aprenden a recuperar un fragmento de código dada una consulta de lenguaje natural. Específicamente, comments son comentarios de la función y método de nivel superior (por ejemplo, documentos en Python), y code es una función o método completo. A lo largo de este repositorio, nos referimos a los términos documentos y consultas indistintamente.
La consulta tiene un solo codificador, mientras que cada lenguaje de programación tiene su propio codificador. Los codificadores disponibles son la bolsa neuronal de las palabras, RNN, 1D-CNN, autoatención (BERT) y un híbrido 1D-CNN+autoatención.
El siguiente diagrama ilustra la arquitectura general de nuestros modelos de referencia:

Este paso supone que tiene una NVIDIA-GPU adecuada con CUDA V9.0 instalado. Utilizamos instancias AWS P3-V100 (un p3.2xlarge es suficiente).
Inicie el entorno de ejecución del modelo ejecutando script/console :
script/console
Esto lo dejará en el shell de un contenedor Docker con todas las dependencias necesarias instaladas, incluido el código en este repositorio, junto con los datos que descargó anteriormente. Por defecto, se lo colocará en la carpeta src/ de este repositorio de GitHub. Desde aquí puede ejecutar comandos para ejecutar el modelo.
Configure W&B (gratis para proyectos de código abierto) según las instrucciones a continuación si desea compartir sus resultados en el punto de referencia de la comunidad. Esto es opcional pero muy recomendable.
El punto de entrada a este modelo es src/train.py . Puede ver varias opciones ejecutando el siguiente comando:
python train.py --help
Para probar si todo funciona en un pequeño conjunto de datos, puede ejecutar el siguiente comando:
python train.py --testrun
Ahora estás preparado para una carrera completa de entrenamiento. Ejemplo de comandos para comenzar las ejecuciones de entrenamiento:
Entrenar un modelo de palabras neuronales en todos los idiomas
python train.py --model neuralbow
El comando anterior asumirá los valores predeterminados para las ubicaciones de los datos de capacitación y un destino donde desea guardar el modelo de salida. La ubicación predeterminada para los datos de entrenamiento se especifica en /src/data_dirs_{train,valid,test}.txt . Cada uno contiene cada uno una lista de rutas donde existen datos para la partición correspondiente. Si se especifica más de una ruta (separada por una nueva línea), los datos de todas las rutas se concatenarán juntos. Por ejemplo, este es el contenido 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 defecto, los modelos se guardan en la carpeta resources/saved_models de este repositorio.
Entrenamiento de un modelo 1D-CNN solo en datos de 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
El comando anterior anula las ubicaciones predeterminadas para guardar el modelo en trained_models y también anula la fuente del tren, la validación y los conjuntos de pruebas.
Notas adicionales:
Las opciones para --model se enumeran actualmente en src/model_restore_helper.get_model_class_from_name .
Los hiperparámetros son específicos para las clases de modelo/codificador respectivas. Un truco simple para descubrirlos es iniciar una ejecución sin especificar elecciones de hiperparameter, ya que imprimirá una lista de todos los hiperparámetros usados con sus valores predeterminados (en formato JSON).
Estamos utilizando un punto de referencia comunitario para este proyecto para fomentar la colaboración y mejorar la reproducibilidad. Está alojado por pesas y prejuicios (W&B), que es gratuito para proyectos de código abierto. Nuestras entradas en el enlace de referencia a registros detallados de nuestras métricas de capacitación y evaluación, así como artefactos modelo, y alentamos a otros participantes a proporcionar tantos detalles como sea posible.
Invitamos a la comunidad a enviar sus carreras a este punto de referencia para facilitar la transparencia siguiendo estas instrucciones.
Anticipamos que la comunidad diseñará arquitecturas personalizadas y usará marcos distintos de TensorFlow. Además, anticipamos que los conjuntos de datos adicionales serán útiles. No es nuestra intención integrar estos modelos, enfoques y conjuntos de datos en este repositorio como un superconjunto de todas las ideas disponibles. Más bien, tenemos la intención de mantener los modelos de referencia y los enlaces a los datos en este repositorio como un lugar de referencia central. Estamos aceptando PRS que actualizan la documentación, enlace a sus proyectos con puntos de referencia mejorados, corrigieron errores o realizan mejoras menores en el código. Aquí hay pautas más específicas para contribuir a este repositorio; Tenga en cuenta particularmente nuestro código de conducta. Abra un problema si no está seguro del mejor curso de acción.
Para inicializar W&B:
Navegue al directorio /src en este repositorio.
Si es la primera vez que usa W&B en una máquina, deberá iniciar sesión:
$ wandb login
Se le pedirá su clave API, que aparece en su página de configuración de perfil W&B.
Las licencias para el código fuente utilizados como datos para este proyecto se proporcionan con la descarga de datos para cada idioma en archivos _licenses.pkl .
Este código y documentación para este proyecto se publican bajo la licencia MIT.