🚀 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}
}
⚠️ 重要提示
模型的预训练数据集仅过滤了宽松许可的代码。然而,模型可能会逐字生成数据集中的源代码。代码的许可证可能要求注明出处和/或遵守其他特定要求,必须予以尊重。我们提供了一个 搜索索引 ,你可以通过它搜索预训练数据,以确定生成的代码来源,并为你的代码提供适当的归属。
💡 使用建议
由于模型不是指令模型,在使用时尽量像在源代码中那样表述命令,例如使用注释或者编写函数签名和文档字符串,让模型完成函数体,这样能获得更好的生成效果。