개인용 코파일럿: 나만의 코딩 어시스턴트 훈련하기

Hugging Face는 HugCoder로 예시된 개인화된 코딩 어시스턴트를 만드는 방법론을 도입했습니다. 이 접근 방식은 개발자와 기업이 전용 코드베이스에 큰 언어 모델(LLMs)을 맞춤화하여 내부 API 및 라이브러리에 대한 코드 완성 정확성을 향상시킬 수 있게 합니다.

데이터 수집 워크플로우

개인화된 어시스턴트를 구축하기 위해, Hugging Face는 로컬에서 리포지토리를 복제하여 API rate limits를 피하면서 GitHub 리포지토리에서 코드를 추출하는 데이터 수집 파이프라인을 구현했습니다.

워크플로우의 주요 측면은 다음과 같습니다:

  • 병렬 클론: Python의 multiprocessing 모듈을 사용하여 리포지토리를 병렬로 다운로드합니다.
  • 필터링: 비코드 파일(이미지, 프레젠테이션)과 비코드 경로(.git, __pycache__, xcodeproj)는 미리 정의된 확장자 목록을 통해 제외됩니다.
  • 파싱: 코드 파일은 'utf-8' 인코딩으로 파싱되며, Jupyter Notebook의 경우 코드 셀만 추출됩니다.
  • 저장: 데이터는 메모리 효율을 위해 청킹과 feather 형식으로 직렬화됩니다.

HugCoder 프로젝트에서 팀은 스타gazers 기준으로 상위 10개의 Hugging Face 공개 리포지토리, 즉 transformers, datasets, diffusers, peft에 집중했습니다.

미세 조정 전략: QLoRA 대비 전체 미세 조정

Hugging Face는 Fill-In-the-Middle(FIM) 훈련 목표를 사용하여 bigcode/starcoder(15.5B 파라미터) 모델의 두 가지 주요 훈련 방법을 비교했습니다.

매개변수 효율적 미세 조정(PEFT)와 QLoRA

QLoRA는 기본 모델을 동결하고 작은 어댑터 가중치 세트를 훈련시켜 하드웨어 요구 사항을 크게 줄입니다.

  • 메모리 사용량: 단일 A100 40GB GPU이면 충분하며, Flash Attention V2와 Gradient Checkpointing을 사용할 때 배치 크기 4 기준으로 총 메모리 점유량이 약 26 GB입니다.
  • 비용 및 시간: 훈련은 12.5시간이 소요되었으며, 시간당 $1.10 기준으로 예상 비용은 $13.75입니다.

전체 미세 조정

전체 미세 조정은 모든 모델 매개변수를 업데이트하지만 상당한 하드웨어가 필요합니다.

  • 메모리 사용량: 15.5B 모델에 대해 활성화를 제외하고 최소 248GB의 GPU 메모리가 필요하며, 이에 따라 최소 4x A100 80GB GPU가 필요합니다. PyTorch Fully Sharded Data Parallel(FSDP)를 사용할 때 GPU당 메모리는 per_gpu_batch_size 1 기준으로 70 GB에서 77.6 GB 사이입니다.
  • 비용 및 시간: 8x A100 80GB GPU에서 훈련은 9시간이 소요되었으며, 시간당 $12.00 기준으로 예상 비용은 $108입니다.

성능 비교

전체 미세 조정은 QLoRA보다 더 빠르게 수렴하고 약간 낮은 손실을 달성했습니다. 그러나 QLoRA 모델은 humaneval-python 벤치마크에서(base model의 Pass@1 33.57에 비해 33.37) 비슷한 성능을 유지하여 심각한 katastrofic forgetting이 발생하지 않았음을 나타냅니다.

정성적 결과 및 코드 인필링

수동 분석에서 미세 조정된 모델(QLoRA와 전체 모두)은 최근 라이브러리를 포함하는 시나리오에서 GitHub Copilot보다 성능이 뛰어났습니다. 예를 들어, 🤗 PEFT 라이브러리에 대한 코드 인필링 작업을 맡겼을 때(Copilot의 훈련 데이터에 포함되지 않았을 수 있음) GitHub Copilot은 어떤 완성도 제공하지 않았지만, HugCoder 변형은 필요한 매개변수와 함께 함수 호출을 올바르게 채웠습니다.

고급 LoRA 기법

믹스 앤 매치 LoRA

Hugging Face는 PEFT의 add_weighted_adapter 유틸리티를 사용하여 다양한 LoRA 어댑터를 결합하는 실험을 진행했습니다. chatting/QA 어댑터와 code-completion 어댑터를 동일한 가중치로 결합하여 만든 code_buddy 어댑터를 통해 모델은 코드 완성을 동시에 수행하고 특정 코드베이스에 대한 기술적 질문에 답변할 수 있었습니다.

LoRA 이전

한 기본 모델에서 훈련된 LoRA 어댑터는 다른 모델로 이전할 수 있습니다. 팀은 Octocoder 모델에 StarCoder-trained 어댑터를 적용하여, 기본 Octocoder 모델이 실패했던 LoraConfig 및 PEFT 모델 생성에 대한 자세한 질문에 정확히 답변할 수 있는 모델을 얻었습니다.

배포 및 로컬 실행

원격 배포

모델은 🤗 Inference Endpoints를 통해 배포되고, 배포된 엔드포인트 URL을 가리키도록 llm-vscode 확장을 설정하여 VS Code에 통합할 수 있습니다.

로컬 실행

소비자 하드웨어(예: Mac M1)에서 Hugging Face는 더 작은 starcoderbase-1b 모델을 실행하기 위해 mlc-llm 라이브러리를 사용했습니다. 과정은 다음과 같습니다:

  1. 대상 하드웨어에 모델을 컴파일합니다(예: Mac용 Metal).
  2. 최적의 생성 길이와 온도를 위해 mlc-chat-config.json을 구성합니다.
  3. llm-vscode 확장에 연결되는 로컬 REST 서버를 실행합니다.

Sources