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我们通过以下方式构建模型的输入:
<mask_1> 标记<sep> 标记以指示边界<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 能够从给定的自然语言和编程语言文本中提取特征,并计算它们的可能性。 然而,该模型旨在并最擅长程序合成,即根据英文提示生成可执行代码,其中提示应以注释字符串的形式呈现。该模型也可以补全部分生成的代码。
@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}
}