库名称:transformers
许可证:gemma
许可证链接:https://ai.google.dev/gemma/terms
额外授权标题:在Hugging Face上访问CodeGemma
额外授权提示:要访问Hugging Face上的CodeGemma,您需要审阅并同意Google的使用许可。为此,请确保您已登录Hugging Face并点击下方按钮。请求将立即处理。
额外授权按钮内容:确认许可
CodeGemma
模型页面
: CodeGemma
资源与技术文档
: 技术报告
: 负责任生成式AI工具包
使用条款
: 条款
作者
: Google
模型信息
简要描述及输入输出的定义。
描述
CodeGemma是基于Gemma构建的一系列轻量级开源代码模型。CodeGemma模型是文本到文本和文本到代码的解码器专用模型,提供70亿参数的预训练变体,专注于代码补全和代码生成任务;70亿参数的指令调优变体,用于代码对话和指令跟随;以及20亿参数的预训练变体,用于快速代码补全。
示例用法
代码补全
代码补全可用于代码编辑器中的填充。CodeGemma通过填充中间(FIM)目标训练完成此任务,您需要提供前缀和后缀作为补全的上下文。以下标记用于分隔输入的不同部分:
<|fim_prefix|>
位于我们想要运行的补全之前的上下文前。
<|fim_suffix|>
位于后缀前。您必须将此标记精确放置在编辑器中光标的位置,因为这是模型将补全的位置。
<|fim_middle|>
是提示模型运行生成的标记。
此外,还有<|file_separator|>
,用于提供多文件上下文。
请确保不要在标记周围提供任何额外的空格或换行符,除非这些空格或换行符自然出现在您想要补全的代码片段中。以下是一个示例:
from transformers import GemmaTokenizer, AutoModelForCausalLM
model_id = "google/codegemma-2b"
tokenizer = GemmaTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
prompt = '''\
<|fim_prefix|>import datetime
def calculate_age(birth_year):
"""Calculates a person's age based on their birth year."""
current_year = datetime.date.today().year
<|fim_suffix|>
return age<|fim_middle|>\
'''
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
prompt_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0][prompt_len:]))
可能会返回如下内容:
age = current_year - birth_year<|file_separator|>test_calculate_age.py
<|fim_suffix|>
assert calculate_age(1990) == 33
assert calculate_age(1980) == 43
assert calculate_age(1970) == 53
assert calculate_age(1960) == 63
assert calculate_age(1950) == 73
注意正确补全后的额外内容。模型返回补全内容后,跟随一个FIM标记或EOS标记。您应忽略这些标记之后的任何内容。一种好的方法是在generate
函数中提供一个终止符列表,如下所示:
FIM_PREFIX = '<|fim_prefix|>'
FIM_SUFFIX = '<|fim_suffix|>'
FIM_MIDDLE = '<|fim_middle|>'
FIM_FILE_SEPARATOR = '<|file_separator|>'
terminators = tokenizer.convert_tokens_to_ids([FIM_PREFIX, FIM_MIDDLE, FIM_SUFFIX, FIM_FILE_SEPARATOR])
terminators += [tokenizer.eos_token_id]
outputs = model.generate(
**inputs,
max_new_tokens=100,
eos_token_id=terminators,
)
在这种情况下,生成会在响应中找到第一个分隔符时立即停止:
age = current_year - birth_year<|file_separator|>
代码生成
from transformers import GemmaTokenizer, AutoModelForCausalLM
tokenizer = GemmaTokenizer.from_pretrained("google/codegemma-2b")
model = AutoModelForCausalLM.from_pretrained("google/codegemma-2b")
input_text = "Write me a Python function to calculate the nth fibonacci number."
input_ids = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
输入和输出
输入
: 对于预训练模型变体:用于代码补全和生成场景的代码前缀和/或后缀,或自然语言文本或提示
: 对于指令调优模型变体:自然语言文本或提示
输出
: 对于预训练模型变体:填充中间代码补全、代码和自然语言
: 对于指令调优模型变体:代码和自然语言
模型数据
用于模型训练的数据及数据处理方式。
训练数据集
以Gemma为基础模型,CodeGemma 2B和7B预训练变体进一步在5000亿个主要来自公开代码仓库、开源数学数据集和合成生成代码的英语数据标记上进行训练。
训练数据处理
应用了以下数据预处理技术:
- FIM 预训练的CodeGemma模型专注于填充中间(FIM)任务。模型训练以处理PSM和SPM模式。我们的FIM设置为80%的FIM率,50-50的PSM/SPM。
- 基于依赖图的打包和基于单元测试的词汇打包技术:为了提高模型与现实世界应用的对齐,我们在项目/仓库级别结构化训练示例,以将每个仓库中最相关的源文件放在一起。具体来说,我们采用了两种启发式技术:基于依赖图的打包和基于单元测试的词汇打包。
- 我们开发了一种新技术,将文档拆分为前缀、中间和后缀,以使后缀在更符合语法的自然点开始,而不是纯粹的随机分布。
- 安全性:与Gemma类似,我们部署了严格的安全过滤,包括过滤个人数据、CSAM过滤以及基于内容质量和安全性的其他过滤,符合我们的政策。
实现信息
关于训练模型所使用的硬件和软件的信息。
硬件
CodeGemma使用最新一代的Tensor Processing Unit (TPU)硬件(TPUv5e)进行训练。
软件
训练使用JAX和ML Pathways完成。
评估信息
模型评估指标和结果。
评估方法
我们在多个领域的各种学术基准上评估CodeGemma:
- 代码补全基准:HumanEval单行和多行填充
- 代码生成基准:HumanEval、MBPP、BabelCode(C++、C#、Go、Java、JavaScript、Kotlin、Python、Rust)
- 问答:BoolQ、PIQA、TriviaQA
- 自然语言:ARC-Challenge、HellaSwag、MMLU、WinoGrande
- 数学推理:GSM8K、MATH
评估结果
编码基准
基准 |
2B |
7B |
7B-IT |
HumanEval |
31.1 |
44.5 |
56.1 |
MBPP |
43.6 |
56.2 |
54.2 |
HumanEval Single Line |
78.41 |
76.09 |
68.25 |
HumanEval Multi Line |
51.44 |
58.44 |
20.05 |
BC HE C++ |
24.2 |
32.9 |
42.2 |
BC HE C# |
10.6 |
22.4 |
26.7 |
BC HE Go |
20.5 |
21.7 |
28.6 |
BC HE Java |
29.2 |
41.0 |
48.4 |
BC HE JavaScript |
21.7 |
39.8 |
46.0 |
BC HE Kotlin |
28.0 |
39.8 |
51.6 |
BC HE Python |
21.7 |
42.2 |
48.4 |
BC HE Rust |
26.7 |
34.1 |
36.0 |
BC MBPP C++ |
47.1 |
53.8 |
56.7 |
BC MBPP C# |
28.7 |
32.5 |
41.2 |
BC MBPP Go |
45.6 |
43.3 |
46.2 |
BC MBPP Java |
41.8 |
50.3 |
57.3 |
BC MBPP JavaScript |
45.3 |
58.2 |
61.4 |
BC MBPP Kotlin |
46.8 |
54.7 |
59.9 |
BC MBPP Python |
38.6 |
59.1 |
62.0 |
BC MBPP Rust |
45.3 |
52.9 |
53.5 |
自然语言基准

伦理与安全
伦理与安全评估方法及结果。
评估方法
我们的评估方法包括结构化评估和相关内容政策的内部红队测试。红队由多个不同团队进行,每个团队有不同的目标和人工评估指标。这些模型针对多个与伦理和安全相关的类别进行了评估,包括:
- 关于内容安全和代表性危害的提示的人工评估。有关评估方法的更多详情,请参阅Gemma模型卡。
- 网络攻击能力的特定测试,重点关注测试自主黑客能力并确保潜在危害有限。
评估结果
伦理和安全评估的结果在可接受的阈值内,符合内部政策对于儿童安全、内容安全、代表性危害、记忆、大规模危害等类别。更多详情请参阅Gemma模型卡。
模型使用与限制
这些模型有一些用户应注意的限制。
预期用途
Code Gemma模型有广泛的应用,IT和PT模型的应用各不相同。以下潜在用途列表并不全面。此列表的目的是提供关于模型创建者在模型训练和开发过程中考虑的潜在用例的背景信息。
代码补全
: PT模型可用于通过IDE扩展补全代码
代码生成
: IT模型可用于生成代码,无论是否使用IDE扩展
代码对话
: IT模型可以支持讨论代码的对话界面。
代码教育
: IT模型支持交互式代码学习体验,帮助语法纠正或提供编码练习。
已知限制
大型语言模型(LLMs)基于其训练数据和技术固有限制存在局限性。有关LLMs限制的更多详情,请参阅Gemma模型卡。
伦理考虑与风险
大型语言模型(LLMs)的开发引发了一些伦理问题。我们在这些模型的开发中仔细考虑了多个方面。有关模型详情,请参阅Gemma模型卡中的相同讨论。
优势
在发布时,这一系列模型提供了高性能的开源代码专用大型语言模型实现,从设计之初就考虑了负责任AI开发,与类似规模的模型相比。
使用本文档中描述的编码基准评估指标,这些模型已显示出优于其他类似规模的开源模型替代方案。