🚀 CodeGemma
CodeGemma是基于Gemma构建的轻量级开源代码模型集合,提供了不同参数规模的变体,可用于代码补全、代码生成、代码对话等多种编程相关任务,为开发者提供了强大的代码辅助能力。
模型链接
✨ 主要特性
CodeGemma模型具有以下特点:
- 多任务支持:支持代码补全、自然语言到代码的生成、代码对话和指令跟随等多种任务。
- 多种参数变体:提供20亿和70亿参数的预训练变体,以及70亿参数的指令调优变体,满足不同场景的需求。
- 高性能表现:在多个编码和自然语言基准测试中表现出色。
📦 安装指南
文档未提及安装步骤,故跳过此章节。
💻 使用示例
基础用法
代码生成
from transformers import GemmaTokenizer, AutoModelForCausalLM
tokenizer = GemmaTokenizer.from_pretrained("google/codegemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained("google/codegemma-1.1-7b-it")
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]))
聊天模板
from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch
model_id = "google/codegemma-1.1-7b-it"
dtype = torch.bfloat16
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
torch_dtype=dtype,
)
chat = [
{ "role": "user", "content": "Write a hello world program" },
]
prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
高级用法
inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=150)
📚 详细文档
输入输出
- 输入:
- 预训练模型变体:代码补全和生成场景的代码前缀和/或后缀,或自然语言文本或提示。
- 指令调优模型变体:自然语言文本或提示。
- 输出:
- 预训练模型变体:中间填充代码补全、代码和自然语言。
- 指令调优模型变体:代码和自然语言。
模型数据
训练数据集
以Gemma为基础模型,CodeGemma 2B和7B预训练变体在额外的5000 - 10000亿个主要为英语的令牌数据上进行进一步训练,这些数据来自公开可用的代码库、开源数学数据集和合成生成的代码。
训练数据处理
采用了以下数据预处理技术:
- 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模型卡片。
模型使用与限制
预期用途
Code Gemma模型有广泛的应用,不同的IT和PT模型有不同的用途:
- 代码补全:PT模型可用于通过IDE扩展完成代码。
- 代码生成:IT模型可用于生成代码,有无IDE扩展均可。
- 代码对话:IT模型可支持代码讨论的对话界面。
- 代码教育:IT模型支持交互式代码学习体验,有助于语法纠正或提供编码练习。
已知限制
大语言模型(LLMs)基于其训练数据和技术本身存在局限性。更多LLMs局限性细节见Gemma模型卡片。
伦理考虑与风险
大语言模型(LLMs)的开发引发了一些伦理问题。在这些模型的开发过程中,我们仔细考虑了多个方面。更多模型细节请参考Gemma模型卡片中的相关讨论。
优势
在发布时,与同等规模的模型相比,这个模型家族提供了高性能的、专注于开源代码的大语言模型实现,从一开始就为负责任的AI开发而设计。使用本文档中描述的编码基准评估指标,这些模型在性能上优于其他同等规模的开源模型。
📄 许可证
本项目使用的许可证为 gemma。