模型:

Salesforce/codegen2-3_7B

英文

CodeGen2 (CodeGen2-3.7B)

模型描述

CodeGen2 是一系列自回归语言模型,用于程序合成,在论文中介绍了这一模型:

CodeGen2: Lessons for Training LLMs on Programming and Natural Languages 作者为Erik Nijkamp*,Hiroaki Hayashi*,Caiming Xiong,Silvio Savarese,Yingbo Zhou。

与原始的CodeGen模型系列(即CodeGen1)不同,CodeGen2能够进行填充,并支持更多的编程语言。

发布了四种模型大小:1B,3.7B,7B,16B。

如何使用

可以使用AutoModelForCausalLM功能轻松加载该模型。

因果抽样

对于常规的因果抽样,只需根据上下文生成补全内容即可:

from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen2-3_7B")
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen2-3_7B", trust_remote_code=True, revision="main")

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

填充抽样

对于填充抽样,我们引入了三种特殊的标记类型:

  • <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/codegen2-3_7B")
    model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen2-3_7B", trust_remote_code=True, revision="main")
    
    
    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>截断模型的输出。

    训练数据

    此检查点是在 the deduplicated version of the Stack dataset (v1.1) 的严格允许子集上训练的。支持的语言(和框架)如下:c,c ++,c-sharp,dart,go,java,javascript,kotlin,lua,php,python,ruby,rust,scala,shell,sql,swift,typescript,vue。

    训练过程

    CodeGen2使用交叉熵损失进行训练,以最大化顺序输入的可能性。输入序列有两种格式:(1)因果语言建模和(2)文件级别的片段损坏。更多细节请参阅论文。

    评估结果

    我们在HumanEval和HumanEval-Infill上评估了我们的模型。更多细节请参阅 paper

    预期用途和限制

    CodeGen2作为一种自回归语言模型,能够从给定的自然语言和编程语言文本中提取特征,并计算它们的可能性。然而,该模型适用于程序合成,即根据英文提示生成可执行代码,在这种情况下,提示应该是以注释字符串的形式提供的。该模型也可以补全部分生成的代码。

    BibTeX条目和引用信息

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