パーソナル Copilot: 自分専用のコーディングアシスタントを訓練する
Hugging Faceは、パーソナライズされたコーディングアシスタントを作成するための手法を導入しました。その例として、Hugging FaceのGitHub組織の公開リポジトリでファインチューニングされたモデルである HugCoder が挙げられます。このアプローチにより、開発者や企業は大規模言語モデル(LLM)を独自のコードベースに適合させ、社内APIやライブラリに対するコード補完の精度を向上させることが可能になります。
データ収集ワークフロー
パーソナライズされたアシスタントを構築するために、Hugging Faceは、リポジトリをローカルにクローンすることでAPIのレート制限を回避しながら、GitHubリポジトリからコードを抽出するデータ収集パイプラインを実装しました。
ワークフローの主な側面は以下の通りです:
- 並列クローン: Pythonの
multiprocessingモジュールを使用して、リポジトリを並列にダウンロードします。 - フィルタリング: 非コードファイル(画像、プレゼンテーション)および非コードパス(
.git,__pycache__,xcodeproj)は、定義済みの拡張子リストによって除外されます。 - パース: コードファイルは「utf-8」エンコーディングを使用してパースされ、Jupyter Notebookについてはコードセルのみが抽出されます。
- ストレージ: メモリ効率を高めるため、データはチャンク化とfeather形式を使用してシリアル化されます。
HugCoderプロジェクトでは、チームはtransformers、datasets、diffusers、peftを含む、スター数に基づいた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モデルを実行しました。プロセスは以下の通りです:
- ターゲットハードウェア(例:Mac用のMetal)向けにモデルをコンパイルする。
- 最適な生成長と温度のために
mlc-chat-config.jsonを設定する。 llm-vscode拡張機能に接続するローカルRESTサーバーを実行する。