Le défi CodesearchNet a été conclu
Nous tenons à remercier tous les participants pour leurs soumissions et nous espérons que ce défi a fourni des informations aux praticiens et aux chercheurs sur les défis de la recherche de code sémantique et a motivé de nouvelles recherches. Nous tenons à encourager tout le monde à continuer à utiliser l'ensemble de données et les évaluations humaines, que nous fournissons maintenant publiquement. Veuillez voir ci-dessous pour plus de détails, en particulier la section d'évaluation.
Aucune nouvelle soumission au défi ne sera acceptée.
Table des matières
Si c'est la première fois que vous lisez ceci, nous vous recommandons de sauter cette section et de lire les sections suivantes. Les commandes ci-dessous supposent que vous avez Docker et Nvidia-Docker, ainsi qu'un GPU qui prend en charge CUDA 9.0 ou plus. Remarque: vous ne devez avoir à exécuter script/setup qu'une fois pour télécharger les données.
# 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_idEnfin, vous pouvez soumettre votre course à la référence communautaire en suivant ces instructions.
CodesearchNet est une collection d'ensembles de données et de repères qui explorent le problème de la récupération de code en utilisant le langage naturel. Cette recherche est une continuation de certaines idées présentées dans ce billet de blog et est une collaboration conjointe entre GitHub et le groupe de compréhension du programme Deep chez Microsoft Research - Cambridge. Nous visons à fournir une plate-forme pour la recherche communautaire sur la recherche de code sémantique via ce qui suit:
Nous espérons que CodesearchNet est une étape vers l'installation avec l'apprentissage automatique et la communauté PNLP plus larges concernant la relation entre le code source et le langage naturel. Nous décrivons une tâche spécifique ici, mais nous nous attendons et nous accueillons d'autres utilisations de notre ensemble de données.
Plus de contexte concernant la motivation de ce problème réside dans ce rapport technique. S'il vous plaît, citez l'ensemble de données et le défi comme
@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}
}
L'ensemble de données principal se compose de 2 millions de paires ( comment , code ) des bibliothèques open source. Concrètement, un comment est une fonction de niveau supérieur ou un commentaire de méthode (par exemple les docstrings dans Python), et code est une fonction ou une méthode entière. Actuellement, l'ensemble de données contient du code Python, JavaScript, Ruby, Go, Java et PHP. Tout au long de ce dépôt, nous nous référons aux termes docstring et interrogeant de manière interchangeable. Nous partitions les données dans le train, la validation et les tests de test tels que le code du même référentiel ne peut exister que dans une seule partition. Il s'agit actuellement du seul ensemble de données sur lequel nous formons notre modèle. Des statistiques de résumé sur cet ensemble de données peuvent être trouvées dans ce cahier
Pour plus d'informations sur la façon d'obtenir les données, consultez cette section.
La métrique que nous utilisons pour l'évaluation est normalisée à un gain cumulatif réduit. Veuillez faire référence à cet article pour plus de détails concernant l'évaluation du modèle. Le script d'évaluation peut être trouvé ici.
Nous avons manuellement annoté les résultats de récupération pour les six langues de 99 requêtes générales. Cet ensemble de données est utilisé comme des données de terrain pour l'évaluation uniquement . Veuillez vous référer à ce document pour plus de détails sur le processus d'annotation. Ces annotations ont été utilisées pour calculer les scores dans le classement. Maintenant que le concours a été conclu, vous pouvez trouver les annotations, ainsi que les commentaires de l'annotateur ici.
Vous ne devriez avoir à effectuer les étapes de configuration qu'une seule fois pour télécharger les données et préparer l'environnement.
En raison de la complexité de l'installation de toutes les dépendances, nous avons préparé des conteneurs Docker pour exécuter ce code. Vous pouvez trouver des instructions sur la façon d'installer Docker dans les documents officiels. De plus, vous devez installer Nvidia-Docker pour satisfaire les dépendances liées à la compréhension GPU. Pour ceux qui sont nouveaux à Docker, ce billet de blog fournit une introduction douce axée sur la science des données.
Après avoir installé Docker, vous devez télécharger les ensembles de données prétraités, qui sont hébergés sur S3. Vous pouvez le faire en exécutant script/setup .
script/setup
Cela créera des conteneurs Docker et téléchargera les ensembles de données. Par défaut, les données sont téléchargées dans le dossier resources/data/ à l'intérieur de ce référentiel, avec la structure du répertoire décrit ici.
Les ensembles de données que vous téléchargerez (la plupart d'entre eux compressés) ont une taille combinée de seulement ~ 3,5 Go.
script/console : script/console
/src . Vous pouvez détacher / attacher à ce conteneur pour faire une pause / continuer votre travail.Pour en savoir plus sur les données, consultez les détails des données ci-dessous, ainsi que ce cahier.
Si vous avez exécuté les étapes de configuration ci-dessus, vous aurez déjà les données et rien de plus à faire. Les données seront disponibles dans le dossier /resources/data de ce référentiel, avec cette structure de répertoire.
Les données sont stockées au format JSONLINes. Chaque ligne du fichier non compressé représente un exemple (généralement une fonction avec un commentaire associé). Un exemple en tremblement de ligne d'une ligne est illustré ci-dessous.
original_string qui est le codecodedocstringLe code, les commentaires et les docstrings sont extraits d'une manière spécifique à la langue, supprimant les artefacts de cette langue.
{
'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'
}
Des statistiques sommaires telles que le nombre de lignes et les histogrammes de longueur de jeton peuvent être trouvés dans ce cahier
Le shell script /script/setup téléchargera automatiquement ces fichiers dans le répertoire /resources/data . Voici les liens vers les fichiers pertinents pour la visibilité:
Les liens S3 suivent ce modèle:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/{python,java,go,php,javascript,ruby }.zip
Par exemple, le lien pour le java est:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
La taille de l'ensemble de données est d'environ 20 Go. Les différents fichiers et la structure du répertoire sont expliqués ici.
Pour former des modèles neuronaux avec un grand ensemble de données, nous utilisons les commentaires de documentation (par exemple les docstrings) comme indicateur indirect. Pour l'évaluation (et le classement), nous avons collecté des jugements de pertinence humaine de paires de requêtes en langage naturel et d'extraits de code réalistes. Maintenant que le défi a été conclu, nous fournissons les données ici en tant que .csv , avec les champs suivants:
URL des données (voir ici).Nous vous encourageons à reproduire et à étendre ces modèles, bien que la plupart des variantes prennent plusieurs heures pour s'entraîner (et certaines prennent plus de 24 heures sur une instance AWS P3-V100).
Nos modèles de référence ingèrent un corpus parallèle de ( comments , code ) et apprenez à récupérer un extrait de code compte tenu d'une requête en langage naturel. Plus précisément, comments sont des commentaires de fonction et de méthode de niveau supérieur (par exemple les docstrings dans Python), et code est une fonction ou une méthode entière. Tout au long de ce dépôt, nous nous référons aux termes docstring et interrogeant de manière interchangeable.
La requête a un seul encodeur, tandis que chaque langage de programmation a son propre encodeur. Les encodeurs disponibles sont des livres neuronaux, RNN, 1D-CNN, auto-attention (Bert) et un hybride d'auto-agence d'auto-agence 1D-CNN +.
Le diagramme ci-dessous illustre l'architecture générale de nos modèles de référence:

Cette étape suppose que vous avez installé un NVIDIA-GPU approprié avec CUDA V9.0. Nous avons utilisé des instances AWS P3-V100 (un p3.2xlarge est suffisant).
Démarrez l'environnement d'exécution du modèle en exécutant script/console :
script/console
Cela vous déposera dans le shell d'un conteneur Docker avec toutes les dépendances nécessaires installées, y compris le code de ce référentiel, ainsi que des données que vous avez téléchargées plus tôt. Par défaut, vous serez placé dans le dossier src/ de ce référentiel GitHub. De là, vous pouvez exécuter des commandes pour exécuter le modèle.
Configurez W&B (GRATUIT pour les projets open source) selon les instructions ci-dessous si vous souhaitez partager vos résultats sur la référence communautaire. Ceci est facultatif mais fortement recommandé.
Le point d'entrée de ce modèle est src/train.py . Vous pouvez voir diverses options en exécutant la commande suivante:
python train.py --help
Pour tester si tout fonctionne sur un petit ensemble de données, vous pouvez exécuter la commande suivante:
python train.py --testrun
Maintenant, vous êtes prêt pour une course d'entraînement complète. Exemples de commandes pour lancer des courses d'entraînement:
Formation d'un modèle de sac de mots neural sur toutes les langues
python train.py --model neuralbow
La commande ci-dessus supposera les valeurs par défaut pour les emplacements des données de formation et une destination où vous souhaitez enregistrer le modèle de sortie. L'emplacement par défaut pour les données de formation est spécifié dans /src/data_dirs_{train,valid,test}.txt data_dirs_; Ces fichiers contiennent chacun une liste de chemins où des données pour la partition correspondante existent. Si plus d'un chemin spécifié (séparé par une nouvelle ligne), les données de tous les chemins seront concaténées ensemble. Par exemple, il s'agit du contenu 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
Par défaut, les modèles sont enregistrés dans le dossier resources/saved_models de ce référentiel.
Formation d'un modèle 1D-CNN sur les données Python uniquement:
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
La commande ci-dessus remplace les emplacements par défaut pour enregistrer le modèle à trained_models et remplace également la source du train, la validation et les ensembles de tests.
Notes supplémentaires:
Les options pour --model sont actuellement répertoriées dans src/model_restore_helper.get_model_class_from_name .
Les hyperparamètres sont spécifiques aux classes de modèle / d'encodeur respectives. Une astuce simple pour les découvrir consiste à lancer une course sans spécifier les choix d'hyperparamètre, car cela imprimera une liste de tous les hyperparamètres utilisés avec leurs valeurs par défaut (au format JSON).
Nous utilisons une référence communautaire pour ce projet pour encourager la collaboration et améliorer la reproductibilité. Il est hébergé par des poids et des biais (W&B), qui est gratuit pour les projets open source. Nos entrées dans la référence sont liées aux journaux détaillés de nos mesures de formation et d'évaluation, ainsi que des artefacts modèles, et nous encourageons les autres participants à fournir autant de détails que possible.
Nous invitons la communauté à soumettre leurs courses à cette référence pour faciliter la transparence en suivant ces instructions.
Nous prévoyons que la communauté concevra des architectures personnalisées et utilisera des cadres autres que TensorFlow. De plus, nous prévoyons que des ensembles de données supplémentaires seront utiles. Nous n'avons pas l'intention d'intégrer ces modèles, approches et ensembles de données dans ce référentiel en tant que superset de toutes les idées disponibles. Nous avons plutôt l'intention de maintenir les modèles de référence et les liens vers les données de ce référentiel comme lieu de référence central. Nous acceptons les RP qui mettent à jour la documentation, lions votre projet avec vos repères améliorés, corriger les bogues ou apporter des améliorations mineures au code. Voici des directives plus spécifiques pour contribuer à ce référentiel; Notez en particulier notre code de conduite. Veuillez ouvrir un problème si vous n'êtes pas sûr du meilleur plan d'action.
Pour initialiser W&B:
Accédez au répertoire /src dans ce référentiel.
Si c'est la première fois que vous utilisez W&B sur une machine, vous devrez vous connecter:
$ wandb login
On vous demandera votre clé API, qui apparaît sur votre page Paramètres de profil W&B.
Les licences pour le code source utilisées comme données pour ce projet sont fournies avec le téléchargement de données pour chaque langue dans les fichiers _licenses.pkl .
Ce code et la documentation de ce projet sont publiés sous la licence MIT.