🚀 SantaCoder
SantaCoder是一系列參數為11億的模型,在Python、Java和JavaScript代碼上進行訓練。它能根據一定上下文生成代碼片段,可用於代碼補全、代碼生成等場景,為開發者提供便利。
🚀 快速開始
你可以在 SantaCoder Space Demo 中體驗該模型。
✨ 主要特性
- 多語言支持:支持Python、Java和JavaScript三種編程語言。
- 多模型變體:除主模型外,還有多個基於不同過濾參數、架構和目標變體訓練的模型。
- Fill - in - the - Middle目標:支持填充中間內容的功能。
📦 安裝指南
使用該模型前,你需要安裝transformers
庫:
pip install -q transformers
💻 使用示例
基礎用法
from transformers import AutoModelForCausalLM, AutoTokenizer
checkpoint = "bigcode/santacoder"
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, trust_remote_code=True).to(device)
inputs = tokenizer.encode("def print_hello_world():", return_tensors="pt").to(device)
outputs = model.generate(inputs)
print(tokenizer.decode(outputs[0]))
高級用法 - Fill - in - the - Middle
Fill - in - the - Middle 使用特殊標記來識別輸入和輸出的前綴、中間和後綴部分:
input_text = "<fim-prefix>def print_hello_world():\n <fim-suffix>\n print('Hello world!')<fim-middle>"
inputs = tokenizer.encode(input_text, return_tensors="pt").to(device)
outputs = model.generate(inputs)
print(tokenizer.decode(outputs[0]))
請確保使用 <fim-prefix>, <fim-suffix>, <fim-middle>
,而不是像StarCoder模型中的 <fim_prefix>, <fim_suffix>, <fim_middle>
。
高級用法 - 加載其他檢查點
我們將每個實驗的檢查點上傳到單獨的分支,並將中間檢查點作為分支上的提交。你可以使用 revision
標誌加載它們:
model = AutoModelForCausalLM.from_pretrained(
"bigcode/santacoder",
revision="no-fim",
trust_remote_code=True
)
📚 詳細文檔
模型概述
SantaCoder模型是一系列參數為11億的模型,在 The Stack (v1.1) (排除了選擇退出請求)的Python、Java和JavaScript子集上進行訓練。主模型使用 Multi Query Attention ,上下文窗口為2048個標記,並使用近似去重和註釋與代碼的比例作為過濾標準,採用 Fill - in - the - Middle目標 進行訓練。此外,還有幾個在具有不同過濾參數的數據集上訓練的模型,以及架構和目標的變體。
不同模型的架構、目標和過濾條件如下:
模型 |
架構 |
目標 |
過濾條件 |
mha |
MHA |
AR + FIM |
基礎 |
no - fim |
MQA |
AR |
基礎 |
fim |
MQA |
AR + FIM |
基礎 |
stars |
MQA |
AR + FIM |
GitHub星數 |
fertility |
MQA |
AR + FIM |
分詞器豐富度 |
comments |
MQA |
AR + FIM |
註釋與代碼比例 |
dedup - alt |
MQA |
AR + FIM |
更強的近似去重 |
final |
MQA |
AR + FIM |
更強的近似去重和註釋與代碼比例 |
final
模型是性能最佳的模型,訓練時間是其他模型的兩倍(2360億個標記)。這個檢查點是默認模型,可在 main
分支上獲取。所有其他檢查點都在具有相應名稱的單獨分支上。
預期用途
該模型在GitHub代碼上進行訓練,因此它 不是 一個指令模型,像“編寫一個計算平方根的函數”這樣的命令效果不佳。你應該像在源代碼中那樣表述命令,例如註釋(如 # the following function computes the sqrt
),或者編寫函數簽名和文檔字符串,讓模型完成函數體。
歡迎在社區標籤中分享你的生成結果!
侷限性
該模型在Python、Java和JavaScript的源代碼上進行訓練。源代碼中主要使用英語,儘管也存在其他語言。因此,該模型能夠根據一定上下文生成代碼片段,但生成的代碼不能保證按預期工作,可能效率低下、包含錯誤或漏洞。
訓練信息
模型
- 架構:具有多查詢注意力和Fill - in - the - Middle目標的GPT - 2模型
- 預訓練步驟:600K
- 預訓練標記:2360億
- 精度:float16
硬件
- GPU:96個Tesla V100
- 訓練時間:6.2天
- 總FLOPS:2.1 x 10e21
軟件
🔧 技術細節
模型使用 Multi Query Attention 技術,能夠在處理長序列時提高效率。同時,採用 Fill - in - the - Middle目標 進行訓練,使得模型能夠更好地處理代碼中的中間填充任務。在訓練過程中,使用近似去重和註釋與代碼的比例作為過濾標準,提高了訓練數據的質量。
📄 許可證
該模型遵循BigCode OpenRAIL - M v1許可協議。你可以在 這裡 找到完整的協議。
📚 引用
@article{allal2023santacoder,
title={SantaCoder: don't reach for the stars!},
author={Allal, Loubna Ben and Li, Raymond and Kocetkov, Denis and Mou, Chenghao and Akiki, Christopher and Ferrandis, Carlos Munoz and Muennighoff, Niklas and Mishra, Mayank and Gu, Alex and Dey, Manan and others},
journal={arXiv preprint arXiv:2301.03988},
year={2023}
}
⚠️ 重要提示
模型的預訓練數據集僅過濾了寬鬆許可的代碼。然而,模型可能會逐字生成數據集中的源代碼。代碼的許可證可能要求註明出處和/或遵守其他特定要求,必須予以尊重。我們提供了一個 搜索索引 ,你可以通過它搜索預訓練數據,以確定生成的代碼來源,併為你的代碼提供適當的歸屬。
💡 使用建議
由於模型不是指令模型,在使用時儘量像在源代碼中那樣表述命令,例如使用註釋或者編寫函數簽名和文檔字符串,讓模型完成函數體,這樣能獲得更好的生成效果。