模型:

Salesforce/codegen2-1B

英文

CodeGen2 (CodeGen2-1B)

模型描述

CodeGen2 是一个自回归语言模型家族,用于程序合成,该模型最初由 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-1B")
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen2-1B", 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>: "End-Of-Mask" 令牌,模型会在插值结束时输出。您可以使用此令牌来截断输出。

例如,如果我们要为以下函数的光标位置生成插值:

def hello_world():
    |
    return name

则模型的输入构建如下:

  • 在光标位置插入 <mask_1> 令牌
  • 在边界处追加 <sep> 令牌以指示边界
  • 插入另一个 <mask_1> 以指示要插值的屏蔽部分。
  • 最终的片段如下所示:

    from transformers import AutoTokenizer, AutoModelForCausalLM
    tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen2-1B")
    model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen2-1B", 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}
    }