模型:

Salesforce/codegen25-7b-instruct

英文

CodeGen2.5-7B-instruct

标题: CodeGen2.5: Small, but mighty

作者: 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> :模型将在补全结束时输出的“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-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上评估了我们的模型。有关详细信息,请参阅 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}
    }