license: other
datasets:
- bigcode/starcoderdata
language:
- code
pipeline_tag: text-generation
CodeGen2.5-7B-instruct
标题: CodeGen2.5:小巧而强大
作者: Erik Nijkamp*, Hiroaki Hayashi*, Yingbo Zhou, Caiming Xiong
(* 同等贡献)
模型描述
CodeGen2.5 是一个用于程序合成的自回归语言模型系列。
基于 CodeGen2,该模型在 StarCoderData 上训练了1.4T个标记,以不到一半的规模实现了与 StarCoderBase-15.5B 相媲美的结果。
与 CodeGen2 类似,该模型支持填充生成,并支持多种编程语言。
我们进一步在 Python 数据上训练,然后在指令数据上训练。我们发布了以下所有模型:
- CodeGen2.5-7B-multi:在 StarCoderData 上训练。基于 Apache-2.0 许可。
- CodeGen2.5-7B-mono:在额外的 Python 标记上进一步训练。基于 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-instruct", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen25-7b-instruct")
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>
:“填充结束”标记,模型在填充完成后会输出此标记。可用于截断输出。
例如,如果我们想为以下函数的光标位置生成填充:
def hello_world():
|
return name
我们按以下方式构造模型输入:
- 在光标位置插入
<mask_1>
标记。
- 追加
<sep>
标记以指示边界。
- 插入另一个
<mask_1>
标记以指示需要填充的部分。
最终代码如下:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen25-7b-instruct", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen25-7b-instruct")
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}
}