個人 Copilot: 訓練您自己的編碼助理
Hugging Face 已經提出一種創建個人化編碼助理的方法論,以 HugCoder 為例,該模型是在 Hugging Face GitHub 組織的公開倉儲上進行微調。此方法使開發者和企業能够將大型語言模型 (LLMs) 適應於專有代碼庫,從而提高內部 API 和庫的代碼補全準確性。
數據收集工作流程
為了構建個人化助理,Hugging Face 實施了一個數據收集管道,該管道從 GitHub 倉儲中提取代碼,同時通過在本地克隆倉儲來避免 API 速率限制。
Key aspects of the workflow include:
- 平行克隆:使用 Python 的
multiprocessing模組以平行方式下載倉儲。 - 過濾:透過預定義的擴展名列表,排除非代碼文件(圖片、簡報)和非代碼路徑(
.git、__pycache__、xcodeproj)。 - 解析:代碼文件使用 "utf-8" 編碼進行解析;對於 Jupyter Notebooks,僅提取代碼單元。
- 存儲:數據使用分塊和 feather 格式進行序列化,以提高內存效率。
對於 HugCoder 項目,團隊專注於根據星標數排名前 10 的 Hugging Face 公開倉儲,包括 transformers、datasets、diffusers 和 peft。
微調策略:QLoRA vs. 完整微調
Hugging Face 使用 Fill-In-the-Middle (FIM) 訓練目標,比較了 bigcode/starcoder (15.5B 參數) 模型的兩種主要訓練方法。
參數高效微調 (PEFT) 結合 QLoRA
QLoRA 通過凍結基礎模型並訓練少量適配器權重,顯著降低了硬體需求。
- 記憶體使用量:單顆 A100 40GB GPU 已足夠,在使用 Flash Attention V2 和 Gradient Checkpointing 時,總記憶體佔用約為 26 GB(批次大小 4)。
- 成本與時間:訓練耗時 12.5 小時,預估成本為 13.75 美元(基於每小時 1.10 美元)。
完整微調
完整微調會更新所有模型參數,但需要大量硬體。
- 記憶體使用量:對於 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.37,而基礎模型為 33.57),表明沒有顯著的災難性遺忘。
定性結果與代碼填充
在手動分析中,微調模型(QLoRA 和完整微調兩種)在涉及最近庫的場景中優於 GitHub Copilot。例如,當被要求為 🤗 PEFT 庫進行代碼填充時——這個庫可能不在 Copilot 的訓練數據中——GitHub Copilot 沒有提供任何補全,而 HugCoder 變體正確地填充了函數調用及必要的參數。
進階 LoRA 技術
混合搭配 LoRAs
Hugging Face 使用 PEFT 中的 add_weighted_adapter 工具嘗試組合不同的 LoRA 適配器。通過創建一個 code_buddy 適配器(將 chatting/QA 適配器和 code-completion 適配器以相等權重結合),該模型能同時執行代碼補全並回答關於特定代碼庫的技術問題。
轉移 LoRAs
在一個基礎模型上訓練的 LoRA 適配器可以轉移到其他模型。團隊將經 StarCoder 訓練的適配器應用於 Octocoder 模型,得到的模型能正確回答關於 LoraConfig 和 PEFT 模型創建的詳細問題,而基礎的 Octocoder 模型則無法做到。
部署與本地執行
遠端部署
模型可以通過 🤗 Inference Endpoints 部署,並通過將擴展指向已部署的端點 URL,使用 llm-vscode 擴展將其整合到 VS Code。
本地執行
對於消費者硬體(例如 Mac M1),Hugging Face 使用 mlc-llm 庫來運行較小的 starcoderbase-1b 模型。該過程包括:
- 編譯模型以適應目標硬體(例如 Mac 的 Metal)。
- 配置
mlc-chat-config.json以獲得最佳的生成長度和溫度。 - 運行一個連接到
llm-vscode擴展的本地 REST 伺服器。