性能表現接近專有模型,科學家推出開源代碼大模型與構建指南

自 2021 年,OpenAI 推出了 CodeX 以來,大語言模型(Large Language Model,LLM)的發展已經給代碼生成工作帶來了巨大的變革。作爲 LLM 的一個重要分支,代碼大模型(Code LLMs)不僅可以自動生成代碼,還能夠輔助代碼審查、錯誤調試、代碼補全等任務,從而大幅減少開發者在重複性勞動上的時間投入,讓他們得以專注於創造本身。

不過,在面向代碼的 LLMs 中,開源模型依然與最先進的專有模型存在較大差距,其主要原因在於這些專有模型的訓練數據集通常爲私有數據,限制了研究界在強基線模型構建和深入理解方面的能力。

爲了彌補這一不足,來自墨爾本大學、復旦大學等高校的研究人員,聯合無限光年推出了完全開放的代碼大模型 OpenCoder。將開源代碼 LLM 的性能提升至專有模型水平,同時也發佈了完整的模型構建過程,旨在爲代碼 AI 研究的透明化和可重複性提供基礎。

相關論文以《OpenCoder:頂級代碼大型語言模型的開放手冊》(OpenCoder: The Open Cookbook for Top-Tier Code Large Language Models)爲題發表在預印本網站arXiv上 [1]。

圖丨相關論文(來源:arXiv)

研究團隊的目標在於填補開源代碼模型與商業化代碼模型在性能與透明度上的空白,因此,團隊在論文中提供了完整的可復現數據集與訓練方法。

在最初的數據預處理方面,OpenCoder 採用了兩類主要數據源:從 GitHub 的公開庫中收集的原始代碼以及來自 Web 數據庫的代碼相關的 Web 數據。

首先,研究團隊排除了所有超過 8MB 的文件,這些大多數爲非文本文件。此外,只保留特定編程語言的文件,這些語言通過文件擴展名進行識別,並參考 GitHub 的 linguist 工具,最終保留了 607 種編程語言文件,以保證數據的多樣性和相關性。

爲了確保數據多樣性並減少偏差,OpenCoder 採用了精確去重和模糊去重的方法,通過 SHA256 哈希值對每個文檔進行計算,去除完全相同的文件,同時利用 MinHash 和局部敏感哈希(LSH)方法進一步減少內容相似的文件。在數據清洗中,還去除了無關的版權聲明和個人身份信息,並通過一系列啓發式規則對數據進行過濾,以確保代碼的質量。

爲了最大程度利用高質量的數據集,OpenCoder 保留了原始數據的分佈特徵,但對部分高資源編程語言進行了下采樣,例如將 Java 數據從 409GB 下采樣至 200GB,將 HTML 數據從 213GB 下采樣至 64GB,以減少無信息結構化內容的影響。最終,課題組預訓練階段生成了大約 730B 的 token。

對於與代碼相關的 Web 數據,團隊通過 Common Crawl 數據集進行高質量數據的抽取,結合 FastText 模型進行自動化的數據標註與篩選,並對域名進行相關性分析和手動註釋,最終獲取了 330GB 的高質量的網頁代碼數據集。

圖丨OpenCoder 的預訓練數據處理工作流程(來源:arXiv)

至於模型架構及其訓練方面,OpenCoder 的 1.5B 參數和 8B 參數這兩種規模的模型均採用標準的 Transformer 架構,注意力機制使用多頭注意力,以增強對複雜代碼結構的建模能力。此外,其採用了旋轉位置編碼(RoPE)以更好地處理長距離依賴關係,提高對上下文的理解能力。

圖丨OpenCoder 的關鍵超參數概覽(來源:arXiv)

然後,團隊採用了 WSD(Warmup, Steady, Decay)學習率調度方法,以確保模型在不同訓練階段的穩定性和高效性。訓練初期通過 2000 步的 warmup 階段逐漸增加學習率,達到峰值後在穩定階段保持較長時間,最後在退火階段逐漸減少學習率,以實現模型的精細調優。

消融實驗的結果說明,使用高質量數據進行退火可以顯著提升模型在複雜編碼任務中的表現,尤其是在計算預算有限的情況下,精心選擇的高質量數據能夠更有效地提高模型的效率和穩定性。

訓練使用了 Megatron-LM 框架,在 512 個 H100 GPU 上進行分佈式訓練,以確保在大規模數據上的高效計算。訓練 8B 模型的總時間約爲 187.5 小時,總 GPU 時數爲 96000 小時。

在 OpenCoder 的後訓練階段,團隊首先從 Evol-Instruct、Infinity-Instruct 和 McEval-Instruct 等多個數據庫中,通過多種語言的採樣收集了大量開源的指令語料。接着,再從 WildChat 和 Code-290k-ShareGPT 等數據集中抽取真實用戶查詢,並使用 LLM 清洗數據,以去除低質量響應。

圖丨OpenCoder 的指令數據合成工作流程(來源:arXiv)

爲進一步提升模型在指令理解和代碼生成任務中的表現,OpenCoder 還進行了雙階段的指令微調,分別針對計算機科學理論和實際編碼任務進行優化。

在第一階段,團隊重點合成了與計算機科學理論相關的問題-答案 (QA) 對,使模型能夠更深入地理解算法、數據結構和網絡等理論概念,由此讓模型能更精準地回答關於二叉搜索樹、動態規劃和麪向對象設計等主題的問題。第二階段,研究人員則通過從 GitHub 提取的高質量代碼數據集對模型進行微調,以提高其在實際的編碼任務上的表現。

爲了檢驗 OpenCoder 的能力,研究人員在多個基準上將它與其他流行的開源模型(如 StarCoder2 、Qwen2.5-Code 等)進行了比較,包括 HumanEval、MBPP 和 BigCodeBench,覆蓋了代碼生成、代碼補全和代碼理解等不同編碼場景下的任務。結果表明,OpenCoder 在這些任務中始終表現優於這些模型。

例如,在 HumanEval 基準測試中,OpenCoder-8B 的 Pass@1 達到了 68.9%,超過了 StarCoder2-15B 的 46.3%。在 MBPP 基準測試中,OpenCoder-8B 的表現也達到了 79.9%,強於其他同類模型。

(來源:arXiv)

此外,在多語言代碼生成評估 MultiPL-E 與綜合多語言代碼評估基準 McEval 中,其表現也同樣突出,證實了其較爲出色的多語言性能。

值得一提的是,研究團隊還發現,使用 GitHub 星標作爲數據過濾標準的模型比未使用此標準的模型在代碼生成和代碼補全任務中的成功率更高,這進一步驗證了高質量數據源對模型性能的直接影響。再結合前述去重處理與退火等階段的分析,這些結果揭示出數據處理、數據質量和訓練流程中的關鍵因素對模型性能的影響。

總結而言,OpenCoder 作爲一個完全開源的代碼語言模型,不僅將開源代碼模型的性能提升至商業化模型水平,也爲研究界提供了一套透明、可復現的完整訓練材料,有望推動對代碼生成技術的進一步發展。

未來,研究團隊將繼續優化模型和數據,並通過不斷地更新和用戶反饋的融入,進一步提升模型的適應性和多樣性。

相關代碼與數據集已在 GitHub 開源(項目地址:https://opencoder-llm.github.io/)。

參考資料:

1. https://arxiv.org/abs/2411.04905

2. https://opencoder-llm.github.io/

排版:劉雅坤