模型简介
模型特点
模型能力
使用案例
🚀 CodeGemma
CodeGemma是基于Gemma构建的轻量级开源代码模型集合,可用于代码补全、代码生成、代码对话等多种任务,为开发者提供高效的代码处理能力。
🚀 快速开始
要在Hugging Face上使用CodeGemma,你需要查看并同意Google的使用许可。请确保你已登录Hugging Face,然后点击下方按钮,请求将立即处理。 确认许可
✨ 主要特性
- 多种任务支持:支持代码补全、自然语言生成代码、代码对话和指令跟随等多种任务。
- 多模型变体:提供70亿参数的预训练变体、70亿参数的指令调优变体和20亿参数的预训练变体,满足不同场景需求。
- 高性能表现:在多个编码和自然语言基准测试中表现出色。
📚 详细文档
模型信息
描述
CodeGemma是基于Gemma构建的轻量级开源代码模型集合。它是仅解码器的文本到文本和文本到代码模型,有70亿参数的预训练变体(专注于代码补全和生成任务)、70亿参数的指令调优变体(用于代码对话和指令跟随)和20亿参数的预训练变体(用于快速代码补全)。
功能 | codegemma-2b | codegemma-7b | codegemma-7b-it |
---|---|---|---|
代码补全 | ✅ | ✅ | |
自然语言生成代码 | ✅ | ✅ | |
代码对话 | ✅ | ||
指令跟随 | ✅ |
使用示例
基础用法
代码补全
代码补全可用于代码编辑器中的填充。CodeGemma使用填充中间(FIM)目标进行训练,你需要提供前缀和后缀作为补全的上下文。以下是使用示例:
from transformers import GemmaTokenizer, AutoModelForCausalLM
model_id = "google/codegemma-1.1-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_prefix|>
、<|fim_middle|>
、<|fim_suffix|>
、<|file_separator|>
或EOS标记之后的所有内容。可以通过以下方式实现:
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-1.1-2b")
model = AutoModelForCausalLM.from_pretrained("google/codegemma-1.1-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]))
输入和输出
模型类型 | 输入 | 输出 |
---|---|---|
预训练模型变体 | 代码补全和生成场景的代码前缀和/或后缀,或自然语言文本或提示 | 填充中间的代码补全、代码和自然语言 |
指令调优模型变体 | 自然语言文本或提示 | 代码和自然语言 |
模型数据
训练数据集
CodeGemma 2B和7B预训练变体在Gemma基础上,进一步使用来自公开代码仓库、开源数学数据集和合成生成代码的5000亿到1万亿个主要为英语的标记进行训练。
训练数据处理
采用了以下数据预处理技术:
- FIM预训练:FIM预训练的CodeGemma模型专注于填充中间(FIM)任务,支持PSM和SPM模式,FIM率为80% - 90%,PSM/SPM比例为50-50。
- 基于依赖图和单元测试的打包技术:为使模型与实际应用更好对齐,在项目/仓库级别构建训练示例,采用基于依赖图的打包和基于单元测试的词法打包技术。
- 文档拆分技术:开发了一种将文档拆分为前缀、中间和后缀的新技术,使后缀从更符合语法的自然点开始。
- 安全过滤:与Gemma类似,部署了严格的安全过滤,包括过滤个人数据、CSAM过滤和其他基于内容质量和安全性的过滤。
实现信息
硬件
CodeGemma使用最新一代的张量处理单元(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 | 2B (1.1) | 7B | 7B-IT | 7B-IT (1.1) |
---|---|---|---|---|---|
HumanEval | 31.1 | 37.8 | 44.5 | 56.1 | 60.4 |
MBPP | 43.6 | 49.2 | 56.2 | 54.2 | 55.6 |
HumanEval Single Line | 78.4 | 79.3 | 76.1 | 68.3 | 77.4 |
HumanEval Multi Line | 51.4 | 51.0 | 58.4 | 20.1 | 23.7 |
BC HE C++ | 24.2 | 19.9 | 32.9 | 42.2 | 46.6 |
BC HE C# | 10.6 | 26.1 | 22.4 | 26.7 | 54.7 |
BC HE Go | 20.5 | 18.0 | 21.7 | 28.6 | 34.2 |
BC HE Java | 29.2 | 29.8 | 41.0 | 48.4 | 50.3 |
BC HE JavaScript | 21.7 | 28.0 | 39.8 | 46.0 | 48.4 |
BC HE Kotlin | 28.0 | 32.3 | 39.8 | 51.6 | 47.8 |
BC HE Python | 21.7 | 36.6 | 42.2 | 48.4 | 54.0 |
BC HE Rust | 26.7 | 24.2 | 34.1 | 36.0 | 37.3 |
BC MBPP C++ | 47.1 | 38.9 | 53.8 | 56.7 | 63.5 |
BC MBPP C# | 28.7 | 45.3 | 32.5 | 41.2 | 62.0 |
BC MBPP Go | 45.6 | 38.9 | 43.3 | 46.2 | 53.2 |
BC MBPP Java | 41.8 | 49.7 | 50.3 | 57.3 | 62.9 |
BC MBPP JavaScript | 45.3 | 45.0 | 58.2 | 61.4 | 61.4 |
BC MBPP Kotlin | 46.8 | 49.7 | 54.7 | 59.9 | 62.6 |
BC MBPP Python | 38.6 | 52.9 | 59.1 | 62.0 | 60.2 |
BC MBPP Rust | 45.3 | 47.4 | 52.9 | 53.5 | 52.3 |
自然语言基准
伦理和安全
评估方法
评估方法包括结构化评估和相关内容政策的内部红队测试。红队测试由多个不同团队进行,每个团队有不同的目标和人工评估指标。模型在与伦理和安全相关的多个类别上进行评估,包括:
- 人工评估:对涵盖内容安全和代表性危害的提示进行人工评估。更多评估方法详情见Gemma模型卡。
- 特定测试:对网络攻击能力进行特定测试,确保潜在危害得到限制。
评估结果
伦理和安全评估结果在符合内部政策的可接受阈值内,包括儿童安全、内容安全、代表性危害、记忆和大规模危害等类别。更多详情见Gemma模型卡。
模型使用和限制
预期用途
- 代码补全:预训练模型可用于通过IDE扩展完成代码。
- 代码生成:指令调优模型可用于生成代码,可使用或不使用IDE扩展。
- 代码对话:指令调优模型可支持讨论代码的对话界面。
- 代码教育:指令调优模型支持交互式代码学习体验,有助于语法纠正或提供编码练习。
已知限制
大语言模型(LLMs)由于其训练数据和技术本身的局限性存在一定限制。更多LLMs限制详情见Gemma模型卡。
伦理考虑和风险
大语言模型(LLMs)的开发引发了一些伦理问题。在这些模型的开发中,已仔细考虑了多个方面。更多模型详情见Gemma模型卡。
优势
发布时,与同等规模的模型相比,该系列模型提供了从头开始为负责任的AI开发设计的高性能开源代码大语言模型实现。使用本文档中描述的编码基准评估指标,这些模型在性能上优于其他同等规模的开源模型替代方案。
📄 许可证
本项目采用gemma许可证。
模型页面
资源和技术文档
使用条款
作者



