模型:

Salesforce/codegen25-7b-multi

英文

CodeGen2.5-7B-multi

标题: CodeGen2.5: Small, but mighty

作者: Erik Nijkamp *, Hiroaki Hayashi *,Yingbo Zhou,Caiming Xiong

(* 同等贡献)

模型描述

CodeGen2.5 是一系列用于程序合成的自回归语言模型。

CodeGen2 的基础上构建,该模型在1.4T标记的 StarCoderData 上进行了训练,并且在比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-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上评估了我们的模型。有关更多详细信息,请参阅 blog

    预期使用和限制

    作为一个自回归语言模型,CodeGen2.5能够从给定的自然语言和编程语言文本中提取特征,并计算它们的可能性。然而,该模型适用于程序合成,并且在给定英语提示的情况下表现最佳,其中提示应采用注释字符串的形式。该模型也可以完成部分生成的代码。

    归因和其他要求

    模型的预训练数据集仅被筛选为仅包含许可证。然而,模型可以直接从数据集中生成源代码。代码的许可证可能要求归因和/或其他特定要求,必须遵守。数据提供者BigCode提供了一个工具,可以搜索预训练数据以确定生成的代码来自于哪里,并对您的代码应用适当的归因。

    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}
    }