大佬出走後首個發佈!Stability官宣代碼模型Stable Code Instruct 3B

新智元報道

編輯:alan 好睏

【新智元導讀】Stability AI在大佬出走後似乎並未受到影響,最近又官宣了新的代碼模型Stable Code Instruct 3B,在之前的基礎上更進一步,幹掉了所有同級競品,甚至能和7B、15B的模型掰手腕。

大佬出走後,第一個模型來了!

就在今天,Stability AI官宣了新的代碼模型Stable Code Instruct 3B。

要說Stability也是真的很神奇,首席執行官辭職了,Stable Diffusion其中幾位作者也離開了,投資公司出了點故障,自己的工資也可能要發不起了,

——但是,樓外風雨飄搖,實驗室裡巋然不動,研究該做做,論文該發發,模型該調調,大模型各領域的戰爭是一個沒落下。

而且不僅僅是鋪開攤子搞全面戰爭,每項研究也都在不斷前進,比如今天的Stable Code Instruct 3B就是在之前的Stable Code 3B的基礎上做了指令調優:

論文地址:https://static1.squarespace.com/static/6213c340453c3f502425776e/t/6601c5713150412edcd56f8e/1711392114564/Stable_Code_TechReport_release.pdf

通過自然語言提示,Stable Code Instruct 3B可以處理各種任務,例如代碼生成、數學和其他與軟件開發相關的查詢。

同階無敵,越級強殺

Stable Code Instruct 3B在同等參數量的模型中,做到了當前的SOTA,甚至優於比自己大兩倍多的CodeLlama 7B Instruct等模型,並且在軟件工程相關任務中的表現與StarChat 15B相當。

從上圖可以看出,與Codellama 7B Instruct和DeepSeek-Coder Instruct 1.3B等領先模型相比,Stable Code Instruct 3B在一系列編碼任務中性能優異。

測試表明,Stable Code Instruct 3B在代碼完成準確性、對自然語言指令的理解、以及跨不同編程語言的多功能性方面,都能夠打平甚至超越競爭對手。

Stable Code Instruct 3B根據Stack Overflow 2023開發者調查的結果,將訓練專注於 Python、Javascript、Java、C、C++和Go等編程語言。

上圖使用Multi-PL基準測試,比較了三個模型以各種編程語言生成輸出的強度。可以發現Stable Code Instruct 3B在所有語言中都明顯優於CodeLlama,並且參數量還少了一半多。

除了上述的熱門編程語言,Stable Code Instruct 3B還包括對其他語言(如SQL、PHP和Rust)的訓練,並且即使在沒有經過訓練的的語言(如Lua)中,也能提供強大的測試性能。

Stable Code Instruct 3B不僅精通代碼生成,還精通FIM(代碼中間填充)任務、數據庫查詢、代碼翻譯、解釋和創建。

通過指令調優,模型能夠理解細微的指令並採取行動,促進了除了簡單代碼完成之外的廣泛編碼任務,比如數學理解、邏輯推理和處理軟件開發的複雜技術。

模型下載:https://huggingface.co/stabilityai/stable-code-instruct-3b

Stable Code Instruct 3B現在可以通過Stability AI會員資格,用於商業目的。對於非商業用途,可以在Hugging Face上下載模型重量和代碼。

技術細節

模型架構

Stable Code建立在Stable LM 3B之上,是一個decoder-only Transformer結構,設計類似於LLaMA。下表是一些關鍵的結構信息:

與LLaMA的主要區別包括:

使用與Stable LM 3B模型相同的分詞器(BPE),大小爲50,257;另外還參照了StarCoder的特殊標記,包括用於指示文件名稱、存儲庫的星數、中間填充(FIM)等。

對於長上下文訓練,使用特殊標記來指示兩個串聯文件何時屬於同一存儲庫。

訓練過程

訓練數據

預訓練數據集收集了各種可公開訪問的大規模數據源,包括代碼存儲庫、技術文檔(如readthedocs)、以數學爲重點的文本,和大量Web數據集。

初始預訓練階段的主要目標是學習豐富的內部表示,以顯著提高模型在數學理解、邏輯推理、和處理軟件開發相關複雜技術文本方面的能力。

此外,訓練數據還包含通用文本數據集,以便爲模型提供更廣泛的語言知識和上下文,最終使模型能夠以對話方式處理更廣泛的查詢和任務。

下表展示了預訓練語料庫的數據源、類別和採樣權重等,其中代碼和自然語言數據的比例爲80:20。

另外,研究人員還引入了一個小型合成數據集,數據由CodeAlpacadataset的種子提示合成生成,包含174,000個提示。

並且參照WizardLM的方式,逐步增加給定種子提示的複雜性,又額外獲得了100,000個提示。

作者認爲,在預訓練階段早期引入這些合成數據有助於模型更好地響應自然語言文本。

長上下文數據集

由於存儲庫中多個文件通常相互依賴,因此上下文長度對於編碼模型很重要。

研究人員估計了軟件存儲庫中token的中位數和平均數分別爲12k和18k,因此選擇16,384作爲上下文長度。

接下來就是創建一個長上下文數據集,研究人員在存儲庫中獲取了一些熱門語言編寫的文件並將它們組合在一起,在每個文件之間插入一個特殊的標記,以保持分離,同時保留內容流。

爲了規避因文件的固定順序而可能產生的任何潛在偏差,作者採用了一種隨機策略。對於每個存儲庫,生成兩個不同的連接文件順序。

分階段訓練

Stable Code使用32個Amazon P4d實例進行訓練,包含256個NVIDIA A100(40GB HBM2)GPU,並使用ZeRO進行分佈式優化。

這裡採用了一種分階段的訓練方法,如上圖所示。

訓練按照標準的自迴歸序列建模預測下一個標記。使用Stable LM 3B的checkpoint初始化模型,第一階段訓練的上下文長度爲4096,然後進行持續的預訓練。

訓練以BFloat16混合精度執行,all-reduce時採用FP32。AdamW 優化器設置爲:β1=0.9,β2=0.95,ε=1e−6,λ(權重衰減)=0.1。從學習率=3.2e-4開始,設置最小學習率爲3.2e-5,使用餘弦衰減。

自然語言模型訓練的核心假設之一是從左到右的因果順序,不過對於代碼來說,這種假設並不總是成立(例如,函數調用和函數聲明對於許多函數來說可以是任意順序的)。

爲了解決這個問題,研究人員使用了FIM(中間填充)。將文檔隨機拆分爲三個段:前綴、中間段和後綴,然後將中間段移動到文檔的末尾。重新排列後,遵循相同的自迴歸訓練過程。

指令微調

在預訓練之後,作者通過微調階段進一步提高模型的對話技能,該階段包括監督微調(SFT)和直接偏好優化(DPO)。

首先使用在Hugging Face上公開可用的數據集進行SFT微調:包括OpenHermes,Code Feedback,CodeAlpaca。

在執行精確匹配重複數據刪除後,三個數據集總共提供了大約500000個訓練樣本。

使用餘弦學習速率調度器控制訓練過程,並將全局批處理大小設置爲512,將輸入打包到長度不超過4096的序列中。

在SFT之後,開始DPO階段,利用來自UltraFeedback的數據,策劃了一個包含大約7,000個樣本的數據集。此外,爲了提高模型的安全性,作者還納入了Helpful and Harmless RLFH數據集。

研究人員採用RMSProp作爲優化算法,DPO訓練的初始階段將學習率提高到5e-7的峰值。

性能測試

下面比較模型在代碼完成任務上的性能,使用Multi-PL基準來評估模型。

Stable Code Base

下表顯示了在Multi-PL上,大小爲3B參數及以下的不同代碼模型的性能。

儘管Stable Code的參數量分別不到Code Llama和StarCoder 15B的40%和20%,但模型在各種編程語言中的平均性能與它們持平。

Stable Code Instruct

下表在Multi-PL基準測試中,評估了幾個模型的instruct微調版本。

SQL Performance

代碼語言模型的一個重要應用是數據庫查詢任務。在這個領域,將Stable Code Instruct的性能與其他流行的指令調優模型,和專門爲SQL訓練的模型進行比較。這裡使用Defog AI創建的基準。

推理性能

下表給出了在消費級設備和相應的系統環境中運行Stable Code時的吞吐量和功耗。

結果表明,當採用較低的精度時,吞吐量增加了近兩倍。但需要注意的是,實施較低精度的量化可能會導致模型性能有所下降(可能很大)。

參考資料:

https://stability.ai/news/introducing-stable-code-instruct-3b