每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/
什么是CodeGemma
CodeGemma是谷歌开发的一系列专注于代码的大型语言模型(LLM)家族,基于先前训练好的2B和7B Gemma检查点。CodeGemma进一步在主要是英语的数据、数学和编程代码上训练了额外的5000亿标记,以增强逻辑和数学推理能力,适用于代码补全和生成。
CodeGemma 2B专门针对代码填充训练,适用于需要快速代码补全和生成的场景,特别是在延迟和/或隐私非常关键的环境中。CodeGemma 7B的训练数据包括80%的代码填充数据和20%的自然语言,可以用于代码补全以及代码和语言的理解和生成。CodeGemma 7B Instruct经过了针对指令跟随的微调,特别适用于围绕代码、编程或数学推理话题的对话使用。所有模型都维持与其前代相同的8000标记的上下文大小。
评估结果
在Python的HumanEval基准测试中,CodeGemma-7B在同等大小的7B模型中表现出色,除了DeepSeek-Coder-7B外。对Java、JavaScript和C++等其他编程语言的评估也显示出优秀的性能,这些语言的评估是通过MultiPL-E(HumanEval的翻译)进行的。技术报告显示,该模型在GSM8K上的表现在7B模型中最佳。指令版本CodeGemma-7B-it在HumanEval和MBPP上对最受欢迎的语言表现得更好。
使用CodeGemma
你可以在这个空间或下面嵌入的聊天机器人中轻松尝试CodeGemma模型(70亿参数):
这个空间展示了由谷歌开发的CodeGemma-7B-it模型。CodeGemma是基于Gemma之上构建的一系列轻量级开放代码模型。随意使用,或复制以私下运行!https://huggingface.co/spaces/ysharma/CodeGemma
Prompt格式
对于CodeGemma 2B和CodeGemma 7B模型,它们使用填充(infilling)技术来进行代码补全,这包括代码、注释、文档字符串和导入语句。CodeGemma通过“填充中间”(FIM)目标进行训练,你需要提供前缀和后缀作为补全的上下文。使用以下标记来分隔输入的不同部分:
- 前置标记(`<bos>`或类似):位于我们希望运行补全操作之前的上下文前。
- 光标定位标记(通常是特定的分隔符或符号):你必须将此标记放置在编辑器中光标的确切位置,因为这是模型将进行代码补全的位置。
- 提示标记(如`<prompt>`):邀请模型执行生成的提示。
此外,还有提供多文件上下文的标记。具体使用示例将在“与Transformers一起使用”部分展示。
对于CodeGemma 7B Instruct模型,它使用与基础Gemma指令调优版本相同的提示格式,遵循以下对话结构:
```
<bos><start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
LaMDA<end_of_turn>
<start_of_turn>model
LaMDA who?<end_of_turn>
```
像Gemma模型一样,复现这种格式最简单的方法是使用Transformers库中提供的聊天模板。这些模板通过预定义的标记来结构化输入和输出,从而简化了与模型的交互过程,并使其更易于集成和使用。使用这种结构化输入,模型能够更准确地解析和响应用户的查询,这对于构建交互式AI应用尤为重要。
使用Transformers
最新4.39版的变压器大放异彩,带来了CodeGemma这个新玩意儿,让你可以在Hugging Face生态系统中尽情挥洒,例如:
- 训练和推断的脚本样例
- 安全的文件格式(safetensors)
- 配合比特小零件的4位量化工具,PEFT高效调参技术,还有闪电般的注意力机制2代
- 各种小工具助你运行模型
- 轻松部署模型的出口机制
像Gemma模型一样,CodeGemma也能和torch.compile()完美配合,给推断速度来个大提升。
惊喜加码:我们还特地准备了一个Colab笔记本,让你一键试用这个模型哦。
想要加入CodeGemma的酷炫行列,先来个升级保持最新:
pip install --upgrade transformers
下面这段代码示范如何用transformers来实现codegemma-2b的代码补全。记得,这玩意儿大概要6GB的RAM,用float16精度就能在你的家用GPU上跑起来。
```python
from transformers import GemmaTokenizer, AutoModelForCausalLM
import torch
model_id = "google/codegemma-2b"
tokenizer = GemmaTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16
).to("cuda:0")
prompt = '''\
import datetime
def calculate_age(birth_year):
"""根据出生年份计算年龄"""
current_year = datetime.date.today().year
return age\
'''
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:]))
```
注意,光标位置的 token 会告诉你代码该从哪儿接着写。这段代码的结果可能如下:
```python
age = current_year - birth_yeartest_calculate_age.py
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
```
CodeGemma 7B通常会比较啰嗦,可能会在代码完结后还不自觉地多嘴几句。如果想要提前结束生成,可以设置一些终止符,像这样:
```python
FIM_PREFIX = ''
FIM_SUFFIX = ''
FIM_MIDDLE = ''
FIM_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,
)
```
这样一来,一旦碰到任何一个终止符,生成就会立刻停止。
Google Cloud集成
你可以通过Vertex AI或Google Kubernetes Engine(GKE)在谷歌云上部署和训练Gemma,使用文本生成推理和Transformers。
推理端点集成
你还可以在Hugging Face的推理端点上部署CodeGemma,该端点使用文本生成推理作为后端。文本生成推理是Hugging Face开发的生产就绪的推理容器,使大型语言模型的部署变得简单。它具有连续批处理、令牌流处理、多GPU上的张量并行快速推理等特性,并在Apache 2许可下分发。
from huggingface_hub import InferenceClient
client = InferenceClient(model=IE_ENDPOINT)
prompt = """\
<|fim_prefix|>import <|fim_suffix|>
if __name__ == '__main__':
sys.exit(0)<|fim_middle|>\
"""
client.text_generation(prompt=prompt)
想要了解更多关于使用Hugging Face推理端点部署大型语言模型的信息,请查看之前的博客文章。注意,T4s不支持bfloat16格式,因此你将需要使用不同的GPU选项。
这就是关于CodeGemma及其在代码生成、补全和对话使用方面的潜力和应用的概述,以及如何将其与现有的云和推理服务集成的详细信息。
为了更全面地利用CodeGemma,下面继续介绍一些关键的集成和使用策略,包括如何优化模型以适应不同的使用场景和平台。
结束语
通过以上介绍,您现在应该对CodeGemma及其与Google Cloud和Hugging Face推理端点的集成有了全面的了解。无论是在处理代码生成、补全任务,还是构建对话式AI,CodeGemma都提供了强大的功能和灵活的部署选项。这些模型的开放性和可扩展性使其成为研究者和开发者的强大工具,可以帮助他们在复杂的编程和人工智能挑战中取得进展。
此外,随着AI和机器学习技术的不断发展,我们期待看到CodeGemma如何继续演化,以适应日益增长的计算需求和更为复杂的应用场景。随着这些技术的成熟,使用这些高级工具的企业和开发者将能够更加快速和高效地解决问题,推动技术前沿的发展。