IBM巨獻:用于代碼智能的Granite Code系列開放基礎模型
一直以來,IBM研究院以其深厚的技術積累和創新精神走在科技前沿。作為全球領先的技術研究機構之一,IBM研究院不僅在傳統計算機科學領域取得了豐碩成果,更在人工智能、量子計算、云計算等新興領域展現了其強大的研發實力和前瞻性視角。特別是在人工智能領域,IBM研究院推出的多項創新技術和產品,如著名的問答系統“沃森”(Watson),已經成為業界的標桿,推動了整個行業的進步。
近年來隨著軟件開發過程的復雜化,代碼智能成為了提高開發效率、降低錯誤率的關鍵技術。自2023年開始,IBM研究院推出了Granite Code模型系列,這是一系列開放基礎模型,旨在提升代碼智能水平,輔助開發者更高效地完成編程任務。Granite Code模型系列通過深度學習技術,能夠理解和生成代碼,幫助修復漏洞,解釋和文檔化代碼,維護代碼庫等,其應用潛力巨大。
最新Granite Code模型系列的推出,不僅是IBM研究院在人工智能領域的又一重要貢獻,也預示著代碼智能技術的新發展方向。這些模型的開放性,使得更廣泛的開發者和研究者能夠利用這些先進的工具,共同推動軟件開發領域的創新??梢灶A見,Granite Code模型系列將在提高軟件開發質量、加速軟件創新進程等方面發揮重要作用,對整個IT行業產生深遠影響。
01.背景與動機
隨著軟件系統的不斷增長和復雜化,開發者面臨著越來越多的挑戰,包括代碼質量控制、缺陷檢測、以及維護成本的上升。在這樣的背景下,代碼智能技術的發展顯得尤為重要,它能夠幫助開發者提高效率,減少錯誤,從而加速軟件開發進程。
開放基礎模型(Open Foundation Models)的出現,為軟件開發帶來了革命性的影響。這些模型通過大規模的數據訓練,能夠理解和生成代碼,輔助開發者完成從代碼編寫到調試的各個環節。它們的開放性質意味著更多的開發者和研究者可以共同參與到模型的改進和應用中,推動了整個行業的創新。
IBM研究院推出的Granite Code模型系列,是在這一背景下的重要創新。這些模型不僅覆蓋了116種編程語言,而且在大小上從3億到340億參數不等,適用于從復雜的應用程序現代化任務到內存受限的設備上的使用。Granite Code模型系列的創新點在于其強大的代碼理解和生成能力,以及在代碼修復、解釋和文檔化等多個方面的應用潛力。研究動機則是為了解決軟件開發中的實際問題,如提高代碼質量、降低維護成本,以及加速開發進程。(鏈接:??https://github.com/ibm-granite/granite-code-models??)
圖1:Granite-8B-代碼(基本/指令)與HumanEvalPack上類似大小的其他開源(代碼)LLM的比較(Muennighoff et al.,2023),涵蓋3個編碼任務和6種編程語言。
Granite Code模型的主要優勢包括:
·全能代碼LLM:Granite Code模型在不同類型的代碼相關任務上實現了有競爭力或最先進的性能,包括代碼生成、解釋、修復、編輯、翻譯等,展示了其解決多樣化編碼任務的能力。
·值得信賴的企業級LLM:所有模型都是在IBM的AI倫理原則指導下,使用許可允許的數據進行訓練的,由IBM的法律團隊指導,以確保企業可信賴地使用。所有Granite Code模型都在Apache 2.0許可下發布。
02.模型架構
Granite Code模型系列的設計理念是為了解決軟件開發中的多樣化問題,包括但不限于代碼生成、缺陷修復、代碼解釋、文檔生成以及代碼庫維護等。
表1:Granite Code模型的模型配置。
技術架構的核心在于Granite Code模型是基于變壓器(Transformer)架構的解碼器模型。這種架構已經在自然語言處理領域證明了其有效性,特別是在處理長序列數據時。Granite Code模型采用了深層的網絡結構,這使得模型能夠捕捉到編程語言中的復雜模式和依賴關系。模型的深度和寬度,即其層數和每層的寬度,都是經過精心設計的,以確保模型能夠處理各種規模的代碼,從簡單的腳本到復雜的系統級應用程序。
Granite Code模型有兩個主要變體,分別是基礎模型(Granite Code Base)和指令跟隨模型(Granite Code Instruct),后者通過結合Git提交與人類指令以及開源合成代碼指令數據集進行微調?;A模型經過兩階段訓練策略從頭開始訓練:第一階段,模型在116種編程語言中訓練了3到4萬億個token,以確保對編程語言和語法有全面的理解;第二階段,模型在5000億個token上進一步訓練,這些token是從代碼和自然語言領域精心設計的高質量數據混合而成,以提高模型的推理能力。指令模型是通過在CommitPack、OASST、HelpSteer和開源數學數據集(包括MathInstruct和MetaMathQA)上進一步微調上述訓練好的基礎模型得到的,包括用于提高指令跟隨和推理能力的合成代碼數據集。
圖2:Granite34B代碼有效訓練的深度升級概述。我們利用1.6T令牌后的20B模型,在不改變訓練和推理框架的情況下,用相同的代碼預訓練數據開始訓練34B模型。
在一系列綜合性基準測試中對代碼LLM進行了廣泛評估,包括HumanEvalPack、MBPP(+)、RepoBench、ReCode等。這些基準測試涵蓋了許多不同類型的編碼任務,不僅僅是Python中的代碼合成,還包括代碼修復、代碼解釋、代碼編輯、代碼翻譯等,涵蓋了大多數主要編程語言(Python、JavaScript、Java、Go、C++、Rust等)。研究發現,在開源模型中,Granite Code模型在所有模型大小和基準測試中表現出非常強勁的性能(通常比Granite大兩倍的其他開源代碼模型表現更好)。此外,由于推理對于解決復雜的問題和任務至關重要,他們還在六個數學基準測試上測試了Granite-8B-Code-Base模型,包括MATH、GSM8K以及具有計算工具訪問權限的問題解決,在這些測試中,Granite 8B模型的性能優于大多數最先進的7B或8B LLM。
數據來源和處理是構建有效模型的另一個關鍵因素。Granite Code模型訓練所使用的數據集涵蓋了116種編程語言,這些數據來自于公開的代碼庫、論壇和其他編程相關的文檔。在數據預處理階段,IBM研究院的團隊采用了多種技術來清洗和篩選數據,確保模型訓練使用的是高質量的數據。例如,他們會移除代碼中的重復部分、過濾掉低質量的代碼片段,以及排除可能包含敏感信息的數據。此外,數據集還經過了去重和模糊去重處理,以減少訓練集中的冗余信息。
參數規模對性能的影響顯而易見。Granite Code模型系列包括從3億到340億參數不等的模型,這一寬廣的參數范圍使得模型能夠適應不同的應用場景。在參數規模較小的模型中,它們可以被部署在內存受限的設備上,如移動設備和嵌入式系統。而參數規模較大的模型則能夠處理更復雜的任務,如大規模的代碼庫維護和復雜的代碼生成任務。模型的性能隨著參數規模的增加而提高,但同時也需要更多的計算資源和更長的訓練時間。
在模型架構方面,他們基于Transformer解碼器架構訓練了一系列不同大小的代碼模型。對于所有模型架構,他們使用預歸一化:將歸一化應用于注意力和MLP塊的輸入。例如,3B模型是Granite-code模型家族中最小的模型,使用RoPE嵌入和多頭注意力進行訓練。該模型使用帶GLU的swish激活函數(也稱為swiglu)進行MLP訓練。對于歸一化,他們使用RMSNorm,因為它在計算上比LayerNorm更高效。3B模型的訓練上下文長度為2048個token。8B模型的架構與3B模型類似,但使用了分組查詢注意力(GQA),在此規模下提供了模型性能和推理效率之間更好的折衷。他們使用4096個token的上下文長度訓練8B模型。
Granite Code模型系列的技術架構、數據處理方法以及參數規模的設計,共同確保了模型在代碼智能領域的高性能和廣泛適用性。
03.訓練與評估
訓練過程中采用的方法和技術
Granite Code模型的訓練過程采用了最先進的機器學習技術和大規模數據集。模型訓練主要分為兩個階段:
1.預訓練階段:在這一階段,模型使用了大量的代碼數據,這些數據覆蓋了116種編程語言。通過這種多語言的訓練,模型能夠學習到不同編程語言的語法和結構特點。此外,預訓練還包括了自然語言處理任務,以提高模型對代碼注釋和文檔的理解能力。Granite Code模型經過兩階段訓練,第一階段(僅代碼訓練):3B和8B模型在包含116種語言的4萬億token的代碼數據上進行訓練。20B參數模型在3萬億token的代碼上進行訓練。34B模型在20B模型的1.6T檢查點之后的1.4T token上進行訓練。第二階段(代碼+語言訓練):在第二階段,他們包括了額外的高質量公開數據,包括技術、數學和網絡文檔,以進一步提高模型在推理和問題解決技能方面的性能,這些技能對代碼生成至關重要。他們在第二階段訓練中為所有模型訓練了500B token(80%代碼和20%語言數據)。
2.微調階段:在預訓練的基礎上,模型會針對特定的編程任務進行微調。這包括代碼生成、代碼修復、代碼解釋等多種任務。微調使模型能夠在特定任務上達到更高的精度和效率。他們使用因果語言建模目標和填充中間(Fill-In-the-Middle, FIM)目標進行訓練。FIM目標的任務是在給定上下文和后續文本的情況下預測插入的token。他們訓練他們的模型以在PSM(前綴-后綴-中間)和SPM(后綴-前綴-中間)模式下工作,使用與Starcoder相同的相關格式控制token。
基礎設施方面,他們使用IBM的兩個超級計算集群Vela和Blue Vela進行訓練,分別配備NVIDIA A100和H100 GPU。Vela A100 GPU集群的每個節點都有2×Intel Xeon可擴展處理器,與8×80GB A100 GPU通過NVLink和NVSwitch相連。Vela集群采用RoCE(RDMA over Converged Ethernet)和GDR(GPU-direct RDMA)進行高性能網絡通信。同樣,Blue Vela集群的每個節點由雙48核Intel處理器組成,配備8×80GB H100 GPU。Blue Vela采用3.2Tbps InfiniBand互連,以促進節點之間的無縫通信,以其高吞吐量和低延遲而聞名。此外,Blue Vela采用單獨的、專用的InfiniBand存儲網絡,為每個計算節點提供800Gbps的速度,由多個ESS6000存儲設備支持。兩個集群為他們的模型提供了可擴展且高效的訓練基礎設施,可以在數千個GPU上進行訓練。他們估計Granite Code模型的預訓練碳排放量約為455 tCO2eq,這是基于模型的總能耗和美國國家平均碳強度因子0.423 kg CO2eq/KWh計算得出的,沒有考慮數據中心的位置。Blue Vela集群運行在100%可再生能源上,以最小化環境影響。
在訓練過程中,IBM研究院采用了多種技術來優化模型性能,包括但不限于:
- 多階段訓練策略:通過分階段訓練,模型能夠逐步學習和適應不同的任務和數據集。
- 高質量數據集:精心篩選和預處理的數據集確保了訓練的有效性和模型的泛化能力。
- 大規模并行訓練:利用IBM的超級計算資源,模型能夠在短時間內完成大規模的并行訓練。
各種編程語言和任務上的表現
Granite Code模型在多種編程語言和任務上都展現了出色的性能。在代碼生成任務中,模型能夠準確地生成符合語言規范的代碼片段。在代碼修復任務中,模型能夠識別出代碼中的錯誤并提供修復方案。在代碼解釋任務中,模型能夠清晰地解釋代碼的功能和邏輯。
在不同編程語言的處理上,Granite Code模型也展現了強大的多語言支持能力。無論是常用的編程語言如Python、Java、JavaScript,還是較少見的語言如Go、Rust,模型都能夠提供高質量的代碼智能服務。
與其他現有模型的性能對比
與市場上其他的代碼智能模型相比,Granite Code模型在多個方面都顯示出了優勢。例如,與CodeGemma、Starcoder2和Llama3等模型相比,Granite Code模型在代碼生成和修復任務上的準確率更高,處理速度更快,且更能適應不同的編程環境和任務需求。
圖3:Granite-8B-Code-Instruct、Mistral-7B-Instruct-v0.2、Gemma-7B-IT和Llama-3-8B-Instruction在HumanEvalPack上的性能。
在代碼生成方面,他們采用了HumanEvalSynthesize基準測試,該測試將HumanEval基準測試中的Python問題擴展到另外五種常用編程語言,即JavaScript、Java、Go、C++、Rust。他們使用貪婪解碼以零樣本的方式評估所有模型,對于基礎模型使用完成格式,對于指令調整模型使用指令模板。在構建指令調整模型的提示時,他們遵循官方示例提供的格式。他們在HuggingFace模型卡片、GitHub倉庫和正式出版物或技術報告中搜索合適的提示格式。
在MultiPL-E基準測試中,他們比較了18種不同編程語言上的所有基礎模型,按照Lozhkov等人的方法,以0.2的溫度和0.95的top-p采樣每個提示的50個完成。從表中可以看出,沒有一個單一的模型在所有模型大小的每種語言上都表現最好。與同等大小的開源模型CodeLlama-7B相比,Granite-8B-Code-Base在16/18種編程語言上表現最佳。在中等大小的模型中,Starcoder2-15B表現最佳。在大型模型中,Granite-34B-Code-Base在大多數語言上都比CodeLlama-34B表現更好,展示了其在多種語言上的代碼生成效果。
Granite Code模型系列不僅在技術上達到了行業領先水平,而且在開放性和適用性上也為未來的軟件開發趨勢提供了新的可能性。
04.應用場景
企業軟件開發中的應用潛力
Granite Code模型系列的設計初衷是為了提高軟件開發的效率和質量。在企業級軟件開發中,這些模型可以大幅度減少開發者的重復工作,自動化常規但復雜的編程任務。例如,在維護大型代碼庫時,Granite Code模型可以自動識別和修復安全漏洞,或者對遺留代碼進行現代化改造,這對于保持企業軟件的競爭力至關重要。
模型在代碼生成、修復、解釋方面的實際效果
代碼生成:Granite Code模型能夠根據開發者的需求生成高質量的代碼片段。在實際應用中,開發者可以通過提供功能描述來生成相應的代碼,這不僅提高了開發速度,也降低了因手動編碼導致的錯誤。
代碼修復:這些模型在識別和修復代碼中的缺陷方面表現出色。它們能夠理解代碼的上下文,自動提出修復建議,甚至直接生成修復后的代碼,極大地提高了軟件的可靠性和安全性。
代碼解釋:Granite Code模型還能夠對代碼進行解釋,幫助開發者理解復雜的代碼邏輯。這一功能對于新加入項目的開發者來說尤其有用,可以快速上手并參與到項目中。
內存受限設備上的應用前景
隨著物聯網和移動設備的普及,對在內存受限設備上運行高效AI模型的需求日益增長。Granite Code模型系列中較小的模型可以部署在這些設備上,執行代碼分析、缺陷檢測等任務,而不會占用過多的計算資源。這使得即使是資源受限的設備也能夠利用AI的力量來優化和保障軟件質量。
Granite Code模型系列不僅在技術上達到了行業領先水平,而且在開放性和適用性上也為未來的軟件開發趨勢提供了新的可能性。
05.魯棒性分析
表16顯示了不同模型在每個擾動類別的最差情況RP@1。
表16:RP@1在Recode基準上的性能。接下來對所有模型使用具有貪婪采樣的HumanEval基準的擾動版本,以消除隨機性效應并實現公平比較。
代碼擾動的挑戰:在實際的軟件開發過程中,代碼擾動是常見的問題,它可能源于開發者的錯誤、外部庫的更新或其他不可預見的變化。一個魯棒的代碼智能模型應該能夠有效地處理這些擾動,維持其性能不受影響。
Granite Code模型的應對策略:Granite Code模型通過在訓練過程中引入各種擾動,提高了模型的魯棒性。這包括對函數名、文檔字符串和代碼本身的變化進行模擬,以此訓練模型識別和適應這些變化。此外,模型還被設計為能夠在不同程度的噪聲和擾動下保持穩定的性能。
最壞情況下的性能表現:在ReCode基準測試中,Granite Code模型展現了其在最壞情況下的性能。即使在極端的代碼擾動情況下,Granite Code模型也能夠保持較高的代碼生成和修復準確率。這證明了模型在處理現實世界軟件開發中遇到的復雜問題時的可靠性。
性能表現的具體分析
RP@1性能指標:在ReCode基準測試中,RP@1(Robust Pass@1)是衡量模型在面對擾動時是否能正確生成或修復代碼的指標。Granite Code模型在不同的擾動類別中都展現了優異的RP@1性能,特別是在文檔字符串和函數名的擾動測試中。
圖4:Granite代碼模型在Berkeley函數調用排行榜上的性能??傮w精度隨著模型大小的增加而不斷提高,這表明大型模型在函數調用能力方面的優勢。
圖5:Berkley函數調用排行榜上的Granite-8B-Code與CodeLlama-7B。Granite-8B-Code(基本/指導)在所有三個指標上始終優于CodeLlama-7B(基本/指示)。
與其他模型的對比:與市場上其他的代碼智能模型相比,Granite Code模型在魯棒性方面表現出了明顯的優勢。即使在參數規模較小的模型中,Granite Code模型也能夠有效地處理代碼擾動,而在參數規模較大的模型中,其魯棒性更是顯著。
06.未來展望
隨著技術的發展和市場需求的變化,Granite Code模型預計將在多個方向上進行擴展和深化。模型的參數規??赡軙^續增長,以提供更高的性能和更強的泛化能力。模型可能會在特定領域進行優化,例如針對大數據分析、云計算等領域的特定需求。此外模型的應用范圍也可能會擴展到代碼安全分析、智能代碼審查等新的領域。
Granite Code模型的開放性質意味著它們可以不斷地進行更新和改進。IBM研究院可能會定期發布模型的更新版本,以納入最新的研究成果和市場反饋。同時,開發者社區的貢獻也可能成為模型改進的重要來源。通過持續的迭代,Granite Code模型將能夠保持其在行業中的領先地位。
在處理復雜的軟件項目時,長上下文的處理能力對于模型的性能至關重要。未來的研究可能會專注于如何提高模型在長上下文中的表現,例如通過改進模型的注意力機制或引入新的上下文管理技術。此外,針對特定編程語言的專門化模型也是未來研究的一個重要方向。這些專門化模型可以為特定語言提供更高效的代碼智能服務,例如針對Python、Java等流行語言的專門化模型。
總結來說,Granite Code模型系列不僅在技術上達到了行業領先水平,而且在未來的發展潛力上也展現了巨大的前景。IBM研究院在這一系列模型上的工作,不僅展示了其在人工智能領域的技術實力,也為軟件開發的未來趨勢提供了新的方向。這些模型的開放性和多功能性,將使其在推動軟件開發自動化和智能化方面發揮重要作用。
參考資料:
1.https://arxiv.org/pdf/2405.04324
2.https://github.com/ibm-granite/granite-code-models
3.https://www.ibm.com/impact/ai-ethics
