CodeSearchNetチャレンジが終了しました
すべての参加者の提出に感謝したいと思います。この課題が、セマンティックコード検索の課題とやる気のある新しい研究についての課題と研究者に洞察を提供することを願っています。私たちは、現在公開されているデータセットと人間の評価を継続することを全員に奨励したいと思います。詳細、具体的には評価セクションについては、以下をご覧ください。
チャレンジへの新しい提出は受け入れられません。
目次
これが初めてこれを読んでいる場合は、このセクションをスキップして次のセクションを読むことをお勧めします。以下のコマンドは、DockerとNvidia-Docker、およびCuda 9.0以上をサポートするGPUがあることを想定しています。注:データをダウンロードするには、 script/setupを1回だけ実行する必要があります。
# 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_id最後に、これらの指示に従って、コミュニティベンチマークに実行を送信できます。
CodeSearchNetは、自然言語を使用したコード検索の問題を探るデータセットとベンチマークのコレクションです。この研究は、このブログ投稿で提示されているいくつかのアイデアの継続であり、GithubとMicrosoft ResearchのDeep Programs Understing Group -Cambridgeとの共同コラボレーションです。以下を介してセマンティックコード検索に関するコミュニティ調査のためのプラットフォームを提供することを目指しています。
CodeSearchNetが、ソースコードと自然言語の関係に関して、より広範な機械学習とNLPコミュニティに関与するためのステップであることを願っています。ここでは特定のタスクについて説明しますが、データセットの他の用途を期待し、歓迎します。
この問題の動機に関するより多くのコンテキストは、この技術レポートにあります。データセットと課題を引用してください
@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}
}
主要なデータセットは、オープンソースライブラリからの200万( comment 、 code )ペアで構成されています。具体的には、 commentはトップレベルの関数またはメソッドコメント(PythonのDocstringsなど)であり、 code関数またはメソッド全体です。現在、データセットにはPython、JavaScript、Ruby、Go、Java、およびPHPコードが含まれています。このレポを通して、Docstringとクエリという用語を交換可能に参照します。データをトレーニング、検証、およびテスト分割に分割して、同じリポジトリからのコードが1つのパーティションにのみ存在できるようにします。現在、これはモデルをトレーニングする唯一のデータセットです。このデータセットに関する要約統計は、このノートブックにあります
データの取得方法の詳細については、このセクションを参照してください。
評価に使用するメトリックは、正規化された割引累積ゲインです。モデル評価に関する詳細については、このペーパーを参照してください。評価スクリプトはここにあります。
99の一般的なクエリの6つの言語の検索結果に手動で注釈を付けました。このデータセットは、評価のみのグラウンドトラースデータとして使用されます。注釈プロセスの詳細については、このペーパーを参照してください。これらの注釈は、リーダーボードのスコアを計算するために使用されました。競争が終了したので、ここでアノテーターのコメントとともに注釈を見つけることができます。
データをダウンロードして環境を準備するために、セットアップ手順を1回実行する必要があります。
すべての依存関係をインストールする複雑さのために、このコードを実行するためにDockerコンテナを準備しました。公式のドキュメントにDockerをインストールする方法に関する指示を見つけることができます。さらに、GPUコンピュート関連の依存関係を満たすには、NVIDIA-Dockerをインストールする必要があります。 Dockerに慣れていない人のために、このブログ投稿では、データサイエンスに焦点を当てた穏やかな紹介を提供します。
Dockerをインストールした後、S3でホストされている前処理されたデータセットをダウンロードする必要があります。 script/setupを実行することでこれを行うことができます。
script/setup
これにより、Dockerコンテナが構築され、データセットがダウンロードされます。デフォルトでは、データはこのリポジトリ内のresources/data/フォルダーにダウンロードされ、ここではディレクトリ構造が説明されています。
ダウンロードするデータセット(それらのほとんどが圧縮)の合計サイズはわずか3.5 GBです。
script/consoleを実行します。 script/console
/srcディレクトリから始まるDockerコンテナ内に着陸します。このコンテナにデタッチ/接続して、仕事を一時停止/続けることができます。データの詳細については、以下のデータの詳細とこのノートブックを参照してください。
上記のセットアップ手順を実行した場合、すでにデータがあり、これ以上行う必要はありません。データは、このディレクトリ構造を使用して、このリポジトリの/resources/dataフォルダーで利用できます。
データはjsonlines形式で保存されます。非圧縮ファイルの各行は、1つの例を表します(通常、関連するコメントを持つ関数)。 1つの行の見事な例を以下に示します。
original_stringの部分codeのトークン化バージョンdocstringのトークン化バージョンコード、コメント、およびドキュストリングは、言語固有の方法で抽出され、その言語のアーティファクトが削除されます。
{
'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'
}
行数やトークンの長さのヒストグラムなどの要約統計は、このノートブックにあります
シェルスクリプト/script/setupこれらのファイルを/resources/dataディレクトリに自動的にダウンロードします。可視性のための関連ファイルへのリンクは次のとおりです。
S3リンクはこのパターンに従います。
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/ {python、java、go、php、javascript、ruby} .zip
たとえば、 javaのリンクは次のとおりです。
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
データセットのサイズは約20 GBです。ここでは、さまざまなファイルとディレクトリ構造について説明します。
大規模なデータセットでニューラルモデルをトレーニングするには、ドキュメントコメント(docstringsなど)をプロキシとして使用します。評価(およびリーダーボード)のために、現実的に見える自然言語クエリとコードスニペットのペアの人間の関連性の判断を収集しました。チャレンジが終了したので、ここでは次のフィールドを使用して、ここでデータを.csvとして提供します。
URLキーと一致します(こちらを参照)。これらのモデルを複製して拡張することをお勧めしますが、ほとんどのバリエーションはトレーニングに数時間かかります(AWS P3-V100インスタンスで24時間以上かかるものもあります)。
私たちのベースラインモデルは、( comments 、 code )の並行コーパスを摂取し、自然言語のクエリを考慮してコードスニペットを取得することを学びます。具体的には、 commentsはトップレベルの関数とメソッドコメント(PythonのDocstringsなど)であり、 code関数または方法全体です。このレポを通して、Docstringとクエリという用語を交換可能に参照します。
クエリには単一のエンコーダーがありますが、各プログラミング言語には独自のエンコーダーがあります。利用可能なエンコーダーは、ニューラルバッグオブワード、RNN、1D-CNN、自己触たち(BERT)、および1D-CNN+自己触媒ハイブリッドです。
以下の図は、ベースラインモデルの一般的なアーキテクチャを示しています。

このステップでは、CUDA V9.0がインストールされている適切なNVIDIA-GPUがあることを前提としています。 AWS P3-V100インスタンスを使用しました( p3.2xlargeで十分です)。
script/consoleを実行してモデル実行環境を開始します。
script/console
これにより、このリポジトリのコードを含むすべての必要な依存関係がインストールされたDockerコンテナのシェルに、以前にダウンロードしたデータが含まれます。デフォルトでは、このGitHubリポジトリのsrc/フォルダーに配置されます。ここからコマンドを実行してモデルを実行できます。
コミュニティベンチマークで結果を共有したい場合は、以下の手順に従ってW&B(オープンソースプロジェクトの無料)をセットアップします。これはオプションですが、強くお勧めします。
このモデルへのエントリポイントはsrc/train.pyです。次のコマンドを実行することで、さまざまなオプションを確認できます。
python train.py --help
すべてが小さなデータセットで動作しているかどうかをテストするには、次のコマンドを実行できます。
python train.py --testrun
今、あなたは完全なトレーニングの実行に備えています。トレーニングをキックオフするためのコマンドの例:
すべての言語でニューラルバッグオブワードモデルをトレーニングします
python train.py --model neuralbow
上記のコマンドは、トレーニングデータの場所と出力モデルを保存する宛先のデフォルト値を想定します。トレーニングデータのデフォルトの場所は/src/data_dirs_{train,valid,test}.txt data_dirs_ {train,valid、test} .txtで指定されています。これらのファイルにはそれぞれ、対応するパーティションのデータが存在するパスのリストが含まれています。複数のパスが指定されている場合(新しいラインで区切られている)、すべてのパスからのデータが連結されます。たとえば、これは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
デフォルトでは、モデルはこのリポジトリのresources/saved_modelsフォルダーに保存されます。
Pythonデータのみで1D-CNNモデルのトレーニング:
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
上記のコマンドは、モデルtrained_modelsに保存するためのデフォルトの場所をオーバーライドし、列車、検証、およびテストセットのソースをオーバーライドします。
追加のメモ:
--modelのオプションは現在、 src/model_restore_helper.get_model_class_from_nameにリストされています。
ハイパーパラメーターは、それぞれのモデル/エンコーダークラスに固有です。それらを発見するための簡単なトリックは、ハイパーパラメーターの選択を指定せずにランをキックオフすることです。これにより、デフォルト値(JSON形式)で使用されているすべてのハイパーパラメーターのリストが印刷されるためです。
このプロジェクトにコミュニティベンチマークを使用して、コラボレーションを促進し、再現性を向上させています。これは、オープンソースプロジェクトには無料のWeights&Biases(W&B)がホストしています。ベンチマークへのエントリは、トレーニングおよび評価メトリックの詳細なログ、およびモデルアーティファクトへのリンクをリンクしており、他の参加者にできるだけ多くの詳細を提供することをお勧めします。
これらの指示に従って透明性を促進するために、コミュニティにこのベンチマークにランを提出するよう招待します。
コミュニティは、カスタムアーキテクチャを設計し、Tensorflow以外のフレームワークを使用すると予想しています。さらに、追加のデータセットが役立つと予想しています。これらのモデル、アプローチ、およびデータセットを、利用可能なすべてのアイデアのスーパーセットとしてこのリポジトリに統合することは私たちの意図ではありません。むしろ、基準の中心的な場所として、このリポジトリのデータにベースラインモデルとリンクを維持するつもりです。ドキュメントを更新するPRS、プロジェクトへのリンクの改善、バグの修正、またはコードの軽微な改善を受け入れています。このリポジトリに貢献するためのより具体的なガイドラインを以下に示します。特に私たちの行動規範に注意してください。最良の行動方針がわからない場合は、問題を開いてください。
W&Bを初期化するには:
このリポジトリの/srcディレクトリに移動します。
マシンでW&Bを使用するのが初めての場合は、ログインする必要があります。
$ wandb login
W&Bプロファイル設定ページに表示されるAPIキーが求められます。
このプロジェクトのデータとして使用されるソースコードのライセンスには、 _licenses.pklファイルの各言語のデータダウンロードが提供されます。
このプロジェクトのこのコードとドキュメントは、MITライセンスの下でリリースされます。