紙| ? HuggingFace 系列 |討論頁
我們引入了 Granite 系列僅解碼器程式碼模型,用於程式碼生成任務(例如修復錯誤、解釋程式碼、記錄程式碼),並使用 116 種程式語言編寫的程式碼進行訓練。對 Granite Code 模型系列在不同任務上的全面評估表明,我們的模型在可用的開源程式碼 LLM 中始終達到最先進的效能。
Granite Code 模型的主要優點包括:
Granite 程式碼模型系列有兩個主要變體:
基本型號和指導型號均提供 3B、8B、20B 和 34B 參數尺寸。
我們準備程式碼預訓練資料的過程涉及幾個階段。首先,我們收集公開可用的資料集(例如 GitHub Code Clean、Starcoder 資料)、公共程式碼儲存庫和來自 GitHub 的問題的組合。其次,我們根據寫入資料的程式語言(我們根據檔案副檔名確定)過濾收集的程式碼資料。然後,我們也過濾掉程式碼品質低的資料。第三,我們採用積極的重複資料刪除策略,包括精確重複資料刪除和模糊重複資料刪除,以刪除具有(幾乎)相同程式碼內容的文件。最後,我們應用 HAP 內容過濾器來降低模型產生仇恨、辱罵或褻瀆語言的可能性。我們還確保透過將PII 內容(例如姓名、電子郵件地址、金鑰、密碼)替換為相應的令牌(例如,⟨NAME⟩、⟨EMAIL⟩、⟨KEY⟩、⟨PASSWORD⟩)來編輯個人識別訊息(PII) 。我們還使用 ClamAV 掃描所有資料集,以識別並刪除原始程式碼中的惡意軟體實例。除了收集模型訓練的程式碼資料之外,我們還策劃了幾個公開的高品質自然語言資料集,以提高模型在語言理解和數學推理方面的熟練程度。
Granite Code Base模型在 3-4T 程式碼資料標記和與程式碼相關的自然語言資料集上進行訓練。資料透過位元組對編碼 (BPE) 進行標記,使用與 StarCoder 相同的標記器。我們利用高品質資料進行兩個階段的訓練,如下所示:
Granite Code Instruct 模型針對以下類型的指令資料進行了微調:1)來自CommitPackFT 的程式碼提交,2)高品質數學資料集,特別是我們使用MathInstruct 和MetaMathQA,3)程式碼指令資料集,例如Glaive-Code- Assistant- v3、Self-OSS-Instruct-SC2、Glaive-Function-Calling-v2、NL2SQL11 和一小部分合成API 呼叫資料集,以及4) 高品質語言指令資料集,例如HelpSteer 和Platypus 的開放許可證過濾版本。
我們根據全面的基準測試清單對我們的程式碼模型進行了廣泛的評估,其中包括但不限於 HumanEvalPack、MBPP 和 MBPP+。這組基準測試涵蓋了常用程式語言(例如 Python、JavaScript、Java、Go、C++、Rust)的不同程式設計任務。
我們的研究結果表明,Granite Code 模型在各個模型大小上都優於強大的開源模型。下圖說明了Granite-8B-Code-Base
在三個編碼任務中如何優於Mistral-7B
、 LLama-3-8B
和其他開源模型。我們在論文中提供了進一步的評估結果。
若要使用我們的任何模型,請從下列位置選擇適當的model_path
:
ibm-granite/granite-3b-code-base-2k
ibm-granite/granite-3b-code-instruct-2k
ibm-granite/granite-8b-code-base-4k
ibm-granite/granite-8b-code-instruct-4k
ibm-granite/granite-20b-code-base-8k
ibm-granite/granite-20b-code-instruct-8k
ibm-granite/granite-34b-code-base-8k
ibm-granite/granite-34b-code-instruct-8k
from transformers import AutoModelForCausalLM , AutoTokenizer
device = "cuda" # or "cpu"
model_path = "ibm-granite/granite-3b-code-base-2k" # pick anyone from above list
tokenizer = AutoTokenizer . from_pretrained ( model_path )
# drop device_map if running on CPU
model = AutoModelForCausalLM . from_pretrained ( model_path , device_map = device )
model . eval ()
# change input text as desired
input_text = "def generate():"
# tokenize the text
input_tokens = tokenizer ( input_text , return_tensors = "pt" )
# transfer tokenized inputs to the device
for i in input_tokens :
input_tokens [ i ] = input_tokens [ i ]. to ( device )
# generate output tokens
output = model . generate ( ** input_tokens )
# decode output tokens into text
output = tokenizer . batch_decode ( output )
# loop over the batch to print, in this example the batch size is 1
for i in output :
print ( i )
我們使用 Dolomite 引擎來微調(或指令調整)我們的所有模型。我們提供了微調ibm-granite/granite-3b-code-base
範例腳本。要微調模型,只需按照以下步驟:
git clone https://github.com/IBM/dolomite-engine/
cd dolomite-engine
# you might need to modify configs/granite-example/training.yml
sh scripts/finetune.sh configs/granite-example/training.yml
# once the model is trained, convert to HuggingFace-compatible safetensors
sh scripts/export.sh configs/granite-example/export.yml
提示
如果您想在訓練期間使用無填充變壓器來節省記憶體佔用和 FLOP,請按照 Dolomite 引擎自述文件中的說明了解更多詳細資訊。
請查看我們的指南和行為準則,為我們的專案做出貢獻。
每個模型變體的模型卡都可以在各自的 HuggingFace 儲存庫中找到。請在這裡參觀我們的收藏。
可以使用以下命令克隆所選模型(本例中為 Granite-3b-code-base):
git clone https://huggingface.co/ibm-granite/granite-3b-code-base-2k
所有 Granite 程式碼模型均根據 Apache 2.0 授權分發。
請造訪我們的收藏,讓我們知道您對我們的程式碼模型系列的評論。選擇您想要提供回饋的模型的儲存庫。然後,前往「社群」選項卡,然後按一下「新討論」 。或者,您也可以在我們的 github 討論頁面上發布任何問題/評論。