CodeGemma 发布说明 / 新功能
Google 已发布 CodeGemma,这是一系列开放获取的大型语言模型(LLM),专注于代码。CodeGemma 基于预训练的 2B 和 7B Gemma 检查点,进一步在额外的 5000 亿英文数据、数学和代码令牌上进行训练,以提升代码补全和生成的逻辑与数学推理能力。
CodeGemma 模型变体
CodeGemma 提供三种不同的版本,以满足不同的部署和使用场景需求:
- CodeGemma 2B:仅在代码填充任务上进行训练的基础模型。它针对快速代码补全和生成进行优化,尤其适用于对低延迟或高隐私有需求的环境。
- CodeGemma 7B:在代码填充数据(80%)和自然语言混合上进行训练的基础模型。它支持代码补全,以及通用的代码和语言理解与生成。
- CodeGemma 7B Instruct:对 7B 模型进行指令微调的版本。它旨在进行关于编程、代码和数学推理的对话交互。
该系列所有模型均保持 8K 令牌的上下文大小。
性能与基准测试
CodeGemma-7B 在与其他 7B 级模型的比较中表现出强劲的性能。在 Python 的 HumanEval 基准测试中,除 DeepSeek-Coder-7B 外,它优于同等规模的模型。这一性能趋势同样适用于包括 Java、JavaScript 和 C++ 在内的其他编程语言,通过 MultiPL-E 对 HumanEval 的翻译实现。
根据技术报告,CodeGemma-7B 在 GSM8K 基准测试中在 7B 模型中表现最佳。此外,CodeGemma-7B-it(指令)版本在 HumanEval 和 MBPP 两个基准上对最流行的编程语言都有所提升。
技术实现与提示
代码填充(FIM)
CodeGemma 2B 和 7B 使用中间填充(Fill-In-the-Middle,FIM)目标进行代码补全。这使模型能够基于前缀和后缀生成代码,以填补两者之间的空白。以下特殊令牌用于构建这些提示:
<|fim_prefix|>:位于光标前的上下文之前。<|fim_suffix|>:位于后缀之前;该令牌标记模型应生成代码的确切位置。<|fim_middle|>:触发生成的提示。<|file_separator|>:用于提供多文件上下文。
指令微调
CodeGemma 7B Instruct 遵循标准的 Gemma 指令微调提示格式,使用带有 <bos>、<start_of_turn>user 和 <start_of_turn>model 标记的对话结构。
部署与集成
Hugging Face Transformers
CodeGemma 已集成到 transformers 库(4.39 及以上版本)。它支持 safetensors 格式、通过 bitsandbytes 实现的 4 位量化、参数高效微调(PEFT)以及 Flash Attention 2。模型兼容 torch.compile(),可加速推理。
硬件需求:
- CodeGemma 2B:使用
float16精度时大约需要 6 GB 内存。 - CodeGemma 7B:在 4 位模式下加载时大约需要 9 GB 内存。
云端与推理端点
- Google Cloud:CodeGemma 可通过 Vertex AI 或 Google Kubernetes Engine(GKE)使用文本生成推理(TGI)进行部署。
- Hugging Face Inference Endpoints:模型可使用 TGI 作为后端进行部署。请注意,T4 GPU 不支持
bfloat16格式,需要使用其他 GPU 选项。
精度建议
原始检查点以 bfloat16 发布。虽然 float16 在某些硬件上更适合使用且更快,但相较于 float32,推荐使用 bfloat16 以获得最高精度。