Codesearchnet 챌린지가 마무리되었습니다
우리는 모든 참가자들의 제출에 대해 감사의 말씀을 전하며,이 도전이 시맨틱 코드 검색의 과제에 대해 실무자와 연구원들에게 통찰력을 제공하고 새로운 연구 동기를 부여하기를 바랍니다. 우리는 모든 사람들이 데이터 세트와 인간 평가를 계속 사용하도록 권장하고 있으며, 현재 공개적으로 제공합니다. 자세한 내용, 특히 평가 섹션은 아래를 참조하십시오.
도전에 대한 새로운 제출은 수락되지 않습니다.
목차
이번이 처음 읽는 경우이 섹션을 건너 뛰고 다음 섹션을 읽는 것이 좋습니다. 아래 명령은 CUDA 9.0 이상을 지원하는 GPU뿐만 아니라 Docker와 Nvidia-Docker가 있다고 가정합니다. 참고 : 데이터를 다운로드하려면 script/setup 한 번만 실행하면됩니다.
# 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은 자연어를 사용하여 코드 검색 문제를 탐색하는 데이터 세트 및 벤치 마크 모음입니다. 이 연구는이 블로그 게시물에서 제시된 일부 아이디어의 연속이며 Microsoft Research -Cambridge의 Github과 Deep 프로그램 이해 그룹 간의 공동 협력입니다. 우리는 다음을 통해 시맨틱 코드 검색에 대한 커뮤니티 연구를위한 플랫폼을 제공하는 것을 목표로합니다.
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}
}
기본 데이터 세트는 오픈 소스 라이브러리의 2 백만 ( comment , code ) 쌍으로 구성됩니다. 구체적으로 comment 최상위 함수 또는 메소드 주석 (예 : Python의 문서화)이며 code 전체 기능 또는 메소드입니다. 현재 데이터 세트에는 Python, JavaScript, Ruby, Go, Java 및 PHP 코드가 포함되어 있습니다. 이 repo에서 우리는 DocString 및 쿼리 용어를 상호 교환 적으로 언급합니다. 우리는 데이터를 열차, 검증 및 테스트로 분할하여 동일한 저장소의 코드가 한 파티션에만 존재할 수 있도록 분할됩니다. 현재 이것은 모델을 훈련시키는 유일한 데이터 세트입니다. 이 데이터 세트에 대한 요약 통계는이 노트에서 찾을 수 있습니다.
데이터를 얻는 방법에 대한 자세한 내용은이 섹션을 참조하십시오.
우리가 평가에 사용하는 메트릭은 할인 된 누적 이득을 정규화합니다. 모델 평가에 대한 자세한 내용은이 백서에 참조하십시오. 평가 스크립트는 여기에서 찾을 수 있습니다.
우리는 99 개의 일반 쿼리의 6 개 언어에 대한 검색 결과에 수동으로 주석을 달았습니다. 이 데이터 세트는 평가 전용 근거 데이터로 사용됩니다. 주석 과정에 대한 자세한 내용은이 논문을 참조하십시오. 이 주석은 리더 보드에서 점수를 계산하는 데 사용되었습니다. 경쟁이 끝났으므로 여기에 주석이있는 주석과 함께 주석을 찾을 수 있습니다.
데이터를 다운로드하고 환경을 준비하려면 설정 단계를 한 번만 수행하면됩니다.
모든 종속성을 설치하는 복잡성으로 인해이 코드를 실행하기 위해 Docker 컨테이너를 준비했습니다. 공식 문서에 Docker를 설치하는 방법에 대한 지침을 찾을 수 있습니다. 또한 GPU 컴플렉션 관련 종속성을 만족시키기 위해 NVIDIA DOCKER를 설치해야합니다. Docker를 처음 접하는 사람들을 위해이 블로그 게시물은 데이터 과학에 중점을 둔 부드러운 소개를 제공합니다.
Docker를 설치 한 후에는 S3에서 호스팅되는 사전 처리 된 데이터 세트를 다운로드해야합니다. script/setup 실행하여이를 수행 할 수 있습니다.
script/setup
이것은 Docker 컨테이너를 만들고 데이터 세트를 다운로드합니다. 기본적으로 데이터는이 저장소 내부의 resources/data/ 폴더로 다운로드되며 여기에 설명 된 디렉토리 구조가 있습니다.
다운로드 할 데이터 세트 (대부분 압축)의 크기는 ~ 3.5GB입니다.
script/console 실행하십시오. script/console
/src 디렉토리에서 시작하여 Docker 컨테이너 내부에 착륙합니다. 이 컨테이너에서 분리/부착하여 작업을 일시 중지/계속할 수 있습니다.데이터에 대한 자세한 내용은 아래 데이터 세부 정보 와이 노트북을 참조하십시오.
위의 설정 단계를 실행 한 경우 이미 데이터가 있으며 더 이상 수행 할 필요가 없습니다. 데이터는이 디렉토리 구조와 함께이 저장소의 /resources/data 폴더에서 사용할 수 있습니다.
데이터는 JSONLINES 형식으로 저장됩니다. 압축되지 않은 파일의 각 줄은 하나의 예를 나타냅니다 (일반적으로 관련 주석이있는 함수). 한 행의 예열 된 예는 다음과 같습니다.
original_string 의 일부codedocstring코드, 의견 및 문서는 언어 별 방식으로 추출되어 해당 언어의 인공물을 제거합니다.
{
'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/ {plython, java,go,javaScript, ruby }.zip
예를 들어, java 의 링크는 다음과 같습니다.
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
데이터 세트의 크기는 약 20GB입니다. 다양한 파일과 디렉토리 구조는 여기에 설명되어 있습니다.
큰 데이터 세트로 신경 모델을 훈련시키기 위해 문서 주석 (예 : docstrings)을 프록시로 사용합니다. 평가 (및 리더 보드)를 위해, 우리는 현실적인 자연어 쿼리 및 코드 스 니펫 쌍의 인간 관련성 판단을 수집했습니다. 이제 도전이 끝났으므로 여기에 데이터를 다음 분야와 함께 .csv 로 제공합니다.
URL 키와 일치합니다 (여기 참조).대부분의 변형은 훈련하는 데 몇 시간이 걸리지만이 모델을 재생산하고 연장하는 것이 좋습니다 (일부는 AWS P3-V100 인스턴스에서 24 시간 이상이 걸립니다).
우리의 기준 모델은 ( comments , code )의 병렬 코퍼스를 섭취하고 자연어 쿼리가 주어진 코드 스 니펫을 검색하는 법을 배웁니다. 구체적으로, comments 최상위 함수 및 메소드 주석 (예 : Python의 Docstrings)이며 code 전체 기능 또는 방법입니다. 이 repo에서 우리는 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 폴더에 모델이 저장됩니다.
파이썬 데이터에 대한 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 에 나열되어 있습니다.
하이퍼 파라미터는 각 모델/인코더 클래스에 따라 다릅니다. 이들을 발견하는 간단한 트릭은 하이퍼 파라미터 선택을 지정하지 않고 실행을 시작하는 것입니다.
우리는이 프로젝트를 위해 커뮤니티 벤치 마크를 사용하여 협업을 장려하고 재현성을 향상시킵니다. W & B (Weights & Biases)로 호스팅되며 오픈 소스 프로젝트에는 무료입니다. 벤치 마크의 항목은 교육 및 평가 지표의 세부 로그에 대한 링크 및 모델 인공물을 링크하며 다른 참가자가 가능한 한 많은 세부 사항을 제공하도록 권장합니다.
우리는 커뮤니티 가이 벤치 마크에 자신의 달리기를 제출하도록 초대하여 이러한 지침에 따라 투명성을 용이하게합니다.
우리는 커뮤니티가 맞춤형 아키텍처를 설계하고 텐서 플로 이외의 프레임 워크를 사용할 것으로 기대합니다. 또한 추가 데이터 세트가 유용 할 것으로 기대합니다. 이러한 모델, 접근 방식 및 데이터 세트를이 저장소에 통합하는 것은 우리의 의도가 아닙니다. 오히려, 우리는 기준 모델 과이 저장소의 데이터에 대한 링크를 참조의 중심 장소로 유지하려고합니다. 우리는 문서를 업데이트하고, 벤치 마크를 개선하여 프로젝트에 대한 링크, 버그 수정 또는 코드를 약간 개선하는 PRS를 수락하고 있습니다. 다음은이 저장소에 기여하기위한보다 구체적인 지침입니다. 특히 우리의 행동 강령에 주목하십시오. 최상의 행동을 확신하지 못하는 경우 문제를 열어주십시오.
W & B를 초기화하려면 :
이 저장소의 /src 디렉토리로 이동하십시오.
컴퓨터에서 W & B를 처음 사용하는 경우 로그인해야합니다.
$ wandb login
W & B 프로필 설정 페이지에 나타나는 API 키를 요청합니다.
이 프로젝트의 데이터로 사용되는 소스 코드의 라이센스에는 _licenses.pkl 파일의 각 언어에 대한 데이터 다운로드가 제공됩니다.
이 프로젝트에 대한이 코드 및 문서는 MIT 라이센스에 따라 릴리스됩니다.