🚀 CodeGen2.5-7B-multi
CodeGen2.5-7B-multi是一个用于程序合成的自回归语言模型,基于CodeGen2构建,在StarCoderData上训练,规模更小但性能具有竞争力,支持多种编程语言,还可进行代码填充。
🚀 快速开始
前提条件
请安装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>
:模型在填充结束时将输出的“掩码结束”标记。你可以使用此标记截断输出。
例如,如果我们想为以下函数的光标位置生成填充内容:
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>
截断模型输出。
✨ 主要特性
- 基于CodeGen2构建:CodeGen2.5基于CodeGen2构建,在StarCoderData上训练了1.4T个标记。
- 规模小但性能强:与StarCoderBase - 15.5B相比,规模不到其一半却能取得有竞争力的结果。
- 支持代码填充:和CodeGen2一样,该模型能够进行代码填充。
- 多语言支持:支持多种编程语言。
📚 详细文档
模型描述
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在指令数据上进一步训练。仅用于研究目的。
评估结果
我们在HumanEval和HumanEval - Infill上评估了我们的模型。更多详细信息请参考博客。
预期用途和局限性
作为一个自回归语言模型,CodeGen2.5能够从给定的自然语言和编程语言文本中提取特征,并计算它们的可能性。
然而,该模型旨在并最擅长程序合成,即根据英文提示生成可执行代码,其中提示应该是注释字符串的形式。该模型也可以完成部分生成的代码。
归属与其他要求
该模型的预训练数据集仅筛选了许可性许可证的数据。
尽管如此,该模型可以逐字生成数据集中的源代码。
代码的许可证可能要求归属和/或其他特定要求,必须予以尊重。
数据提供者BigCode提供了一个搜索索引,你可以通过它搜索预训练数据,以确定生成的代码来自何处,并对你的代码进行适当的归属。
伦理考量
此版本仅用于支持学术论文的研究目的。我们的模型、数据集和代码并非专门为所有下游目的而设计或评估。我们强烈建议用户在部署此模型之前评估并解决与准确性、安全性和公平性相关的潜在问题。我们鼓励用户考虑人工智能的常见局限性,遵守适用法律,并在选择用例时采用最佳实践,特别是在错误或滥用可能会对人们的生活、权利或安全产生重大影响的高风险场景中。有关用例的进一步指导,请参考我们的AUP和AI AUP。
📄 许可证
本模型遵循Apache - 2.0许可证。
📖 引用信息
请引用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}
}