license: apache-2.0
datasets:
- bigcode/starcoderdata
language:
- code
pipeline_tag: text-generation
CodeGen2.5-7B-multi
标题: CodeGen2.5:小巧而强大
作者: Erik Nijkamp*, Hiroaki Hayashi*, Yingbo Zhou, Caiming Xiong
(* 同等贡献)
模型描述
CodeGen2.5 是一个用于程序合成的自回归语言模型系列。
基于 CodeGen2,该模型在 StarCoderData 上训练了 1.4T tokens,以不到一半的规模实现了与 StarCoderBase-15.5B 相媲美的结果。
与 CodeGen2 类似,该模型支持代码填充,并支持多种编程语言。
我们随后进一步在 Python 数据和指令数据上进行了训练。我们发布了以下所有模型:
- CodeGen2.5-7B-multi(本仓库):基于 StarCoderData 训练。采用 Apache-2.0 许可证。
- CodeGen2.5-7B-mono:在额外 Python tokens 上进一步训练。采用 Apache-2.0 许可证。
- CodeGen2.5-7B-instruct:在 CodeGen2.5-7B-mono 基础上基于指令数据进一步训练。仅限研究用途。
使用方法
此模型可通过 AutoModelForCausalLM
功能轻松加载。
前提条件
请安装 OpenAI 的 tiktoken
以使用分词器。
pip install tiktoken==0.4.0
因果采样(代码自动补全)
对于常规的因果采样,只需根据上下文生成补全内容:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen25-7b-multi", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen25-7b-multi")
text = "def hello_world():"
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_ids = model.generate(input_ids, max_length=128)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
填充采样
对于填充采样,我们遵循 CodeGen2 的格式:
<mask_N>
:第 N 个需要填充的片段。实际使用时,在需要填充的位置插入 <mask_1>
。
<sep>
:后缀与填充样本之间的分隔符。见下文。
<eom>
:模型在填充结束时输出的“End-Of-Mask”标记。可用于截断输出。
例如,如果我们想为以下函数的光标位置生成填充:
def hello_world():
|
return name
我们按以下方式构造模型输入:
- 在光标位置插入
<mask_1>
标记。
- 追加
<sep>
标记以指示边界。
- 插入另一个
<mask_1>
以指示需要填充的片段。
最终代码如下:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen25-7b-multi", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen25-7b-multi")
def format(prefix, suffix):
return prefix + "<mask_1>" + suffix + "<|endoftext|>" + "<sep>" + "<mask_1>"
prefix = "def hello_world():\n "
suffix = " return name"
text = format(prefix, suffix)
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_ids = model.generate(input_ids, max_length=128)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=False)[len(text):])
你可能需要使用 <eom>
截断模型输出。
评估结果
我们在 HumanEval 和 HumanEval-Infill 上评估了模型性能。详情请参阅博客。
预期用途与限制
作为一个自回归语言模型,CodeGen2.5 能够从给定的自然语言和编程语言文本中提取特征并计算其似然。然而,该模型最适合程序合成,即根据英文提示生成可执行代码,提示应以注释字符串的形式提供。模型也能补全部分生成的代码。
归属与其他要求
模型的预训练数据集仅筛选了宽松许可证的内容。尽管如此,模型可能逐字生成数据集中的源代码。代码的许可证可能要求归属或其他特定要求,必须遵守。数据提供方 BigCode 提供了一个搜索索引,可用于搜索预训练数据以识别生成代码的来源,并在你的代码中正确标注归属。
伦理考量
此版本仅用于支持学术论文的研究目的。我们的模型、数据集和代码并非为所有下游用途专门设计或评估。我们强烈建议用户在部署此模型前评估并解决与准确性、安全性和公平性相关的潜在问题。我们鼓励用户考虑 AI 的常见限制,遵守适用法律,并在选择用例时采用最佳实践,尤其是可能显著影响人们生活、权利或安全的高风险场景。有关用例的进一步指导,请参考我们的 AUP 和 AI AUP。
BibTeX 条目与引用信息
请引用 CodeGen2 论文:
@article{Nijkamp2023codegen2,
title={CodeGen2: Lessons for Training LLMs on Programming and Natural Languages},
author={Nijkamp, Erik and Hayashi, Hiroaki and Xiong, Caiming and Savarese, Silvio and Zhou, Yingbo},
journal={arXiv preprint},
year={2023}
}