パーソナル Copilot: 自分専用のコーディングアシスタントを訓練する

Hugging Faceは、パーソナライズされたコーディングアシスタントを作成するための手法を導入しました。その例として、Hugging FaceのGitHub組織の公開リポジトリでファインチューニングされたモデルである HugCoder が挙げられます。このアプローチにより、開発者や企業は大規模言語モデル(LLM)を独自のコードベースに適合させ、社内APIやライブラリに対するコード補完の精度を向上させることが可能になります。

データ収集ワークフロー

パーソナライズされたアシスタントを構築するために、Hugging Faceは、リポジトリをローカルにクローンすることでAPIのレート制限を回避しながら、GitHubリポジトリからコードを抽出するデータ収集パイプラインを実装しました。

ワークフローの主な側面は以下の通りです:

  • 並列クローン: Pythonの multiprocessing モジュールを使用して、リポジトリを並列にダウンロードします。
  • フィルタリング: 非コードファイル(画像、プレゼンテーション)および非コードパス(.git, __pycache__, xcodeproj)は、定義済みの拡張子リストによって除外されます。
  • パース: コードファイルは「utf-8」エンコーディングを使用してパースされ、Jupyter Notebookについてはコードセルのみが抽出されます。
  • ストレージ: メモリ効率を高めるため、データはチャンク化とfeather形式を使用してシリアル化されます。

HugCoderプロジェクトでは、チームはtransformersdatasetsdiffuserspeftを含む、スター数に基づいたHugging Faceのトップ10公開リポジトリに焦点を当てました。

ファインチューニング戦略: QLoRA vs. Full Fine-Tuning

Hugging Faceは、Fill-In-the-Middle (FIM) トレーニング目的を使用して、bigcode/starcoder (15.5B パラメータ) モデルに対する2つの主要なトレーニング手法を比較しました。

QLoRAによるパラメータ効率の高いファインチューニング (PEFT)

QLoRAは、ベースモデルを凍結し、小さなアダプターウェイトのセットをトレーニングすることで、ハードウェア要件を大幅に削減します。

  • メモリ使用量: Flash Attention V2とGradient Checkpointingを使用した場合、バッチサイズ4で合計メモリ占有率は約26 GBであり、単一のA100 40GB GPUで十分です。
  • コストと時間: トレーニングには12.5時間かかり、推定コストは$13.75($1.10/時に基づく)でした。

Full Fine-Tuning

フルファインチューニングはすべてのモデルパラメータを更新しますが、膨大なハードウェアを必要とします。

  • メモリ使用量: 15.5Bモデルには最低248GBのGPUメモリが必要であり(アクティベーションを除く)、少なくとも4枚のA100 80GB GPUが必要です。PyTorch Fully Sharded Data Parallel (FSDP) を使用した場合、GPUあたりのメモリは70 GBから77.6 GBの範囲でした(per_gpu_batch_size 1)。
  • コストと時間: 8枚のA100 80GB GPUを使用して9時間かかり、推定コストは$108($12.00/時に基づく)でした。

パフォーマンス比較

フルファインチューニングは、QLoRAよりも収束が早く、わずかに低い損失を達成しました。しかし、QLoRAモデルはhumaneval-pythonベンチマークにおいて同等のパフォーマンスを維持しており(ベースモデルのPass@1が33.57に対し、33.37)、重大な破滅的忘却(catastrophic forgetting)は認められませんでした。

定性的結果とコードインフィリング

手動分析では、ファインチューニングされたモデル(QLoRAとフルの両方)は、新しいライブラリが関わるシナリオにおいてGitHub Copilotを上回りました。例えば、Copilotのトレーニングデータに含まれていない可能性のある🤗 PEFTライブラリのコードのインフィリングを依頼した場合、GitHub Copilotは補完を提供しませんでしたが、HugCoderのバリアントは必要なパラメータを伴って関数呼び出しを正しく補完しました。

高度なLoRAテクニック

Mix-and-Match LoRAs

Hugging Faceは、PEFTの add_weighted_adapter ユーティリティを使用して、異なるLoRAアダプターを組み合わせる実験を行いました。code_buddy アダプター(chatting/QA アダプターとcode-completion アダプターを等しい重みで組み合わせたもの)を作成することで、モデルはコード補完と特定のコードベースに関する技術的な質問への回答を同時に行うことができました。

LoRAの転送

あるベースモデルでトレーニングされたLoRAアダプターは、他のモデルに転送できます。チームはStarCoderでトレーニングされたアダプターをOctocoderモデルに適用しました。その結果、ベースのOctocoderモデルではできなかったLoraConfigやPEFTモデルの作成に関する詳細な質問に、正しく回答できるモデルが得られました。

デプロイとローカル実行

リモートデプロイ

モデルは🤗 Inference Endpointsを介してデプロイでき、デプロイされたエンドポイントURLをllm-vscode拡張機能に指定することでVS Codeに統合できます。

ローカル実行

コンシューマー向けハードウェア(例:Mac M1)の場合、Hugging Faceはmlc-llmライブラリを使用して、より小さなstarcoderbase-1bモデルを実行しました。プロセスは以下の通りです:

  1. ターゲットハードウェア(例:Mac用のMetal)向けにモデルをコンパイルする。
  2. 最適な生成長と温度のためにmlc-chat-config.jsonを設定する。
  3. llm-vscode拡張機能に接続するローカルRESTサーバーを実行する。

Sources