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 以获得最高精度。

Sources