Die CodesarchNet -Herausforderung wurde abgeschlossen
Wir möchten allen Teilnehmern für ihre Einreichungen danken und hoffen, dass diese Herausforderung Einblicke für Praktiker und Forscher über die Herausforderungen bei der Suche semantischer Code und motivierte neue Forschung lieferte. Wir möchten alle ermutigen, den Datensatz und die menschlichen Bewertungen weiter zu verwenden, die wir jetzt öffentlich bereitstellen. Bitte siehe unten für Einzelheiten, insbesondere den Bewertungsabschnitt.
Es werden keine neuen Einreichungen zur Herausforderung angenommen.
Inhaltsverzeichnis
Wenn dies das erste Mal ist, dass Sie dies lesen, empfehlen wir, diesen Abschnitt zu überspringen und die folgenden Abschnitte zu lesen. Die folgenden Befehle gehen davon aus, dass Sie Docker und Nvidia-Docker sowie eine GPU haben, die CUDA 9,0 oder mehr unterstützt. Hinweis: Sie sollten nur einmal script/setup ausführen müssen, um die Daten herunterzuladen.
# 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_idSchließlich können Sie Ihren Lauf zum Community -Benchmark einreichen, indem Sie diese Anweisungen befolgen.
CodesarchNet ist eine Sammlung von Datensätzen und Benchmarks, die das Problem des Codeabrufs mithilfe der natürlichen Sprache untersuchen. Diese Forschung ist eine Fortsetzung einiger Ideen, die in diesem Blog -Beitrag vorgestellt wurden, und eine gemeinsame Zusammenarbeit zwischen Github und der Deep Program Undertace Group bei Microsoft Research - Cambridge. Wir wollen eine Plattform für die Community -Forschung zur semantischen Code -Suche über Folgendes bereitstellen:
Wir hoffen, dass CodessearchNet ein Schritt in Richtung der breiteren maschinellen Lernen und der NLP -Community in Bezug auf die Beziehung zwischen Quellcode und natürlicher Sprache ist. Wir beschreiben hier eine bestimmte Aufgabe, aber wir erwarten und begrüßen andere Verwendungen unseres Datensatzes.
Mehr Kontext in Bezug auf die Motivation für dieses Problem liegt in diesem technischen Bericht. Bitte zitieren Sie den Datensatz und die Herausforderung als
@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}
}
Der primäre Datensatz besteht aus 2 Millionen ( comment , code ) Paaren aus Open -Source -Bibliotheken. Konkret ist ein comment eine Funktion oder eine Methodenkommentar auf höchstem Niveau (z. B. Dokument in Python), und code ist eine gesamte Funktion oder Methode. Derzeit enthält der Datensatz Python, JavaScript, Ruby, Go, Java und PHP -Code. In diesem Repo verweisen wir auf die Begriffe docstring und abfragen austauschbar. Wir partitionieren die Daten in Zug, Validierung und testen Splits, so dass Code aus demselben Repository nur in einer Partition existieren kann. Derzeit ist dies der einzige Datensatz, in dem wir unser Modell trainieren. Zusammenfassende Statistiken zu diesem Datensatz finden Sie in diesem Notebook
Weitere Informationen zum Erhalt der Daten finden Sie in diesem Abschnitt.
Die Metrik, die wir zur Bewertung verwenden, ist normalisierter reduzierter kumulativer Gewinn. Bitte verweisen Sie auf dieses Papier für weitere Einzelheiten zur Modellbewertung. Das Bewertungsskript finden Sie hier.
Wir haben die Abrufergebnisse für die sechs Sprachen aus 99 allgemeinen Abfragen manuell annotiert. Dieser Datensatz wird nur als Bodentut -Daten verwendet, um nur für die Bewertung zu bewerten. Weitere Informationen zum Annotationsprozess finden Sie in diesem Artikel. Diese Anmerkungen wurden verwendet, um die Ergebnisse in der Rangliste zu berechnen. Nachdem der Wettbewerb abgeschlossen wurde, finden Sie die Anmerkungen zusammen mit den Annotator -Kommentaren hier.
Sie sollten die Setup -Schritte nur einmal ausführen müssen, um die Daten herunterzuladen und die Umgebung vorzubereiten.
Aufgrund der Komplexität der Installation aller Abhängigkeiten haben wir Docker -Container darauf vorbereitet, diesen Code auszuführen. Sie finden Anweisungen zur Installation von Docker in den offiziellen Dokumenten. Darüber hinaus müssen Sie NVIDIA-Docker installieren, um die damit verbundenen Abhängigkeiten von GPU-Computer zu erfüllen. Für diejenigen, die neu in Docker sind, bietet dieser Blog -Beitrag eine sanfte Einführung, die sich auf die Datenwissenschaft konzentriert.
Nach der Installation von Docker müssen Sie die vorverarbeiteten Datensätze herunterladen, die auf S3 gehostet werden. Sie können dies tun, indem Sie script/setup ausführen.
script/setup
Dadurch werden Docker -Container erstellt und die Datensätze heruntergeladen. Standardmäßig werden die Daten in diesem Repository in die resources/data/ Ordner heruntergeladen, wobei die hier beschriebene Verzeichnisstruktur beschrieben wird.
Die Datensätze, die Sie herunterladen (die meisten von ihnen komprimiert), haben eine kombinierte Größe von nur ~ 3,5 GB.
script/console aus: script/console
/src -Verzeichnis gelandet. Sie können sich von diesem Behälter lösen/anbringen, um Ihre Arbeit zu pausieren/fortzusetzen.Weitere Informationen zu den Daten finden Sie unten sowie dieses Notebook.
Wenn Sie die obigen Einstellungsschritte ausgeführt haben, haben Sie bereits die Daten, und es muss nichts mehr getan werden. Die Daten werden im Ordner /resources/data dieses Repositorys mit dieser Verzeichnisstruktur verfügbar sein.
Daten werden im JSONLINES -Format gespeichert. Jede Zeile in der unkomprimierten Datei repräsentiert ein Beispiel (normalerweise eine Funktion mit einem zugeordneten Kommentar). Ein geschickter Beispiel für eine Zeile ist unten dargestellt.
original_string , der Code istcodedocstringCode, Kommentare und Docstrings werden auf sprachspezifische Weise extrahiert, wodurch Artefakte dieser Sprache entfernt werden.
{
'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'
}
Zusammenfassende Statistiken wie Zeilenzahlen und Token -Längenhistogramme finden Sie in diesem Notebook
Das Shell -Skript /script/setup lädt diese Dateien automatisch in das Verzeichnis /resources/data herunter. Hier sind die Links zu den entsprechenden Dateien für die Sichtbarkeit:
Die S3 -Links folgen diesem Muster:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/erpython,java,go,php.javaScript,Ruby}.zip
Zum Beispiel ist der Link für die java :
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
Die Größe des Datensatzes beträgt ungefähr 20 GB. Die verschiedenen Dateien und die Verzeichnisstruktur werden hier erläutert.
Um neuronale Modelle mit einem großen Datensatz zu trainieren, verwenden wir die Dokumentationskommentare (z. B. DOCStrings) als Proxy. Für die Bewertung (und die Rangliste) haben wir menschliche Relevanzurteile von Paaren realistisch aussehender Abfragen und Codeausschnitte gesammelt. Nachdem die Herausforderung abgeschlossen wurde, stellen wir die Daten hier als .csv mit den folgenden Feldern an:
URL -Schlüssel in den Daten (siehe hier).Wir empfehlen Ihnen, diese Modelle zu reproduzieren und zu erweitern, obwohl die meisten Varianten mehrere Stunden dauern (und einige mehr als 24 Stunden in einer AWS P3-V100-Instanz).
Unsere Basismodelle nehmen einen parallelen Korpus von ( comments , code ) ein und lernen, einen Code -Snippet bei einer natürlichen Sprachabfrage abzurufen. Insbesondere sind comments Funktions- und Methodenkommentare auf höchster Ebene (z. B. Docstrings in Python), und code ist eine gesamte Funktion oder Methode. In diesem Repo verweisen wir auf die Begriffe docstring und abfragen austauschbar.
Die Abfrage hat einen einzelnen Encoder, während jede Programmiersprache einen eigenen Encoder hat. Die verfügbaren Encoder sind Neural-Bag-of-Words, RNN, 1D-CNN, Selbstbekämpfung (Bert) und ein 1D-CNN+Selbstbekämpfung Hybrid.
Das folgende Diagramm zeigt die allgemeine Architektur unserer Basismodelle:

In diesem Schritt geht davon aus, dass Sie über eine geeignete Nvidia-GPU mit CUDA V9.0 verfügen. Wir haben AWS P3-V100-Instanzen verwendet (ein p3.2xlarge ist ausreichend).
Starten Sie die Umgebung für Modellläufe, indem Sie script/console ausführen:
script/console
Dadurch werden Sie in die Shell eines Docker -Containers mit allen erforderlichen Abhängigkeiten, einschließlich des Codes in diesem Repository, zusammen mit den zuvor heruntergeladenen Daten fallen. Standardmäßig werden Sie im src/ Ordner dieses Github -Repositorys platziert. Von hier aus können Sie Befehle ausführen, um das Modell auszuführen.
Richten Sie gemäß den folgenden Anweisungen W & B (kostenlos für Open -Source -Projekte) ein, wenn Sie Ihre Ergebnisse auf dem Community -Benchmark teilen möchten. Dies ist optional, aber sehr zu empfehlen.
Der Einstiegspunkt dieses Modells ist src/train.py . Sie können verschiedene Optionen sehen, indem Sie den folgenden Befehl ausführen:
python train.py --help
Um zu testen, ob alles auf einem kleinen Datensatz funktioniert, können Sie den folgenden Befehl ausführen:
python train.py --testrun
Jetzt sind Sie auf einen vollständigen Trainingslauf vorbereitet. Beispielbefehle zum Starten von Trainingsläufen:
Schulung eines Neural-Bag-of-Wörtern-Modells in allen Sprachen
python train.py --model neuralbow
In dem obigen Befehl werden Standardwerte für die Speicherort (n) der Trainingsdaten und eines Ziels angenommen, an dem Sie das Ausgabemodell speichern möchten. Der Standardstandort für Schulungsdaten wird in /src/data_dirs_{train,valid,test}.txt data_dirs_ <Train,valid,Testt}.txt angegeben. Diese Dateien enthalten jeweils eine Liste von Pfaden, bei denen Daten für die entsprechende Partition vorhanden sind. Wenn mehr als ein Weg angegeben (durch eine neue Linie getrennt), werden die Daten von allen Pfaden miteinander verkettet. Dies ist beispielsweise der Inhalt von 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
Standardmäßig werden Modelle im Ordner resources/saved_models dieses Repositorys gespeichert.
Training eines 1D-CNN-Modells nur auf Python-Daten:
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
Der obige Befehl überschreibt die Standardpositionen für das Speichern des Modells in trained_models und überschreibt auch die Quelle der Zug-, Validierungs- und Testsätze.
Zusätzliche Anmerkungen:
Optionen für --model sind derzeit in src/model_restore_helper.get_model_class_from_name aufgeführt.
Hyperparameter sind spezifisch für die jeweiligen Modell-/Encoder -Klassen. Ein einfacher Trick, um sie zu entdecken, besteht darin, einen Lauf zu starten, ohne Hyperparameter -Auswahlmöglichkeiten anzugeben, da dies eine Liste aller verwendeten Hyperparameter mit ihren Standardwerten (im JSON -Format) druckt.
Wir verwenden einen Community -Benchmark für dieses Projekt, um die Zusammenarbeit zu fördern und die Reproduzierbarkeit zu verbessern. Es wird von Weigs & Biases (W & B) gehostet, das für Open -Source -Projekte kostenlos ist. Unsere Einträge im Benchmark -Link zu detaillierten Protokollen unserer Schulungs- und Bewertungsmetriken sowie Modellartefakte ermutigen andere Teilnehmer, so viele Details wie möglich zu liefern.
Wir laden die Community ein, ihre Läufe an diesen Benchmark zu leisten, um die Transparenz zu erleichtern, indem sie diese Anweisungen befolgen.
Wir gehen davon aus, dass die Community benutzerdefinierte Architekturen entwirft und andere Rahmenbedingungen als Tensorflow verwenden wird. Darüber hinaus gehen wir davon aus, dass zusätzliche Datensätze nützlich sein werden. Es ist nicht unsere Absicht, diese Modelle, Ansätze und Datensätze in dieses Repository als Superet aller verfügbaren Ideen in dieses Repository zu integrieren. Wir beabsichtigen vielmehr, die Basismodelle und Links zu den Daten in diesem Repository als zentraler Referenzort beizubehalten. Wir akzeptieren PRs, die die Dokumentation aktualisieren, mit Ihren Projekten mit verbesserten Benchmarks verknüpfen, Fehler beheben oder geringfügige Verbesserungen am Code vornehmen. Hier sind spezifischere Richtlinien für den Beitrag zu diesem Repository. Beachten Sie insbesondere unseren Verhaltenskodex. Bitte eröffnen Sie ein Problem, wenn Sie sich der besten Vorgehensweise nicht sicher sind.
W & B initialisieren:
Navigieren Sie in diesem Repository zum /src -Verzeichnis.
Wenn Sie zum ersten Mal W & B auf einer Maschine verwenden, müssen Sie sich anmelden:
$ wandb login
Sie werden nach Ihrer API -Taste gefragt, die auf Ihrer Seite mit W & B -Profileinstellungen angezeigt wird.
Die als Daten für dieses Projekt verwendeten Lizenzen für Quellcode werden mit dem Daten heruntergeladen für jede Sprache in _licenses.pkl -Dateien.
Dieser Code und diese Dokumentation für dieses Projekt werden unter der MIT -Lizenz veröffentlicht.