HuggingFace镜像/codegen2-7B_P
模型介绍文件和版本分析
下载使用量0

CodeGen2(CodeGen2-7B)

模型说明

CodeGen2 是一系列用于程序合成的自回归语言模型,在以下论文中被提出:

Erik Nijkamp*、Hiroaki Hayashi*、Caiming Xiong、Silvio Savarese、Yingbo Zhou 所著的 CodeGen2: Lessons for Training LLMs on Programming and Natural Languages。

与最初的 CodeGen 模型系列(即 CodeGen1)不同,CodeGen2 具备填充功能,并支持更多编程语言。

现已发布四种模型规模:1B、3.7B、7B、16B。

使用方法

该模型可通过 AutoModelForCausalLM 功能轻松加载。

因果采样

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


from openmind import AutoTokenizer, AutoModelForCausalLM
import openmind
import torch
import torch_npu 
import argparse

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--model_name_or_path",
        type=str,
        help="Path to model",
        default="LF_AICC/codegen2-7B_P",
    )
    args = parser.parse_args()
    return args

args = parse_args()
model = args.model_name_or_path

tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = openmind.pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
sequences = pipeline(
   "<|im_start|>user\nDoes P=NP?<|im_end|>\n<|im_start|>assistant\n",
    max_length=256,
    do_sample=True,
    top_k=10,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")

填充采样

对于填充采样,我们引入了三种新的特殊令牌类型:

  • <mask_N>:第 N 个待掩码的片段。实际使用时,将 <mask_1> 放置在您希望采样填充内容的位置。
  • <sep>:后缀与填充样本之间的分隔符令牌。详见下文。
  • <eom>:模型在填充结束时会输出的“掩码结束”(End-Of-Mask)令牌。您可以使用此令牌来截断输出内容。

例如,如果我们想要为函数的以下光标位置生成填充内容:

    <|im_start|>user\nDoes P=NP?<|im_end|>\n<|im_start|>assistant\n

我们通过以下方式构建模型的输入:

  1. 在光标位置插入 <mask_1> 标记
  2. 追加 <sep> 标记以指示边界
  3. 插入另一个 <mask_1> 以指示我们要填充的掩码

最终代码片段如下:


from openmind import AutoTokenizer, AutoModelForCausalLM
import openmind
import torch
import torch_npu 
import argparse

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--model_name_or_path",
        type=str,
        help="Path to model",
        default="LF_AICC/codegen2-7B_P",
    )
    args = parser.parse_args()
    return args

args = parse_args()
model = args.model_name_or_path

tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = openmind.pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
sequences = pipeline(
   "<|im_start|>user\nDoes P=NP?<|im_end|>\n<|im_start|>assistant\n",
    max_length=256,
    do_sample=True,
    top_k=10,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")

你可能需要使用 <eom> 来截断模型输出。

训练数据

此检查点是在 Stack 数据集(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 上对模型进行了评估。更多详情请参考 论文。

预期用途和局限性

作为自回归语言模型,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}
}