模型简介
模型特点
模型能力
使用案例
库名称:transformers
许可证:gemma
小部件:
- 消息:
- 角色:用户
内容:大脑是如何工作的?
推理:
参数:
最大新生成标记数:200
额外授权标题:在Hugging Face上访问Gemma
额外授权提示:要在Hugging Face上访问Gemma,您需要审阅并同意Google的使用许可。为此,请确保您已登录Hugging Face并点击下方按钮。请求将立即处理。
额外授权按钮内容:确认许可
- 角色:用户
Gemma模型卡
模型页面:Gemma
此模型卡对应Gemma模型最新的7B指令调优版本。以下是Gemma系列的其他模型:
基础模型 | 指令调优模型 | |
---|---|---|
2B | gemma-2b | gemma-1.1-2b-it |
7B | gemma-7b | gemma-1.1-7b-it |
发布说明
这是Gemma 1.1 7B(IT),是对原始指令调优Gemma版本的更新。
Gemma 1.1采用了一种新颖的RLHF方法进行训练,在质量、编码能力、事实性、指令遵循和多轮对话质量方面取得了显著提升。我们还修复了多轮对话中的一个错误,并确保模型响应不会总是以"Sure,"
开头。
我们相信此版本在大多数用例中都有所改进,但仍鼓励用户在其特定应用中进行测试。旧版模型仍可在同一仓库中获取。我们感谢大家对Gemma的热情采用,并继续欢迎来自社区的所有反馈。
资源与技术文档:
使用条款:条款
作者:Google
模型信息
简要描述及输入输出的定义。
描述
Gemma是Google推出的一系列轻量级、先进的开放模型,基于与创建Gemini模型相同的研究和技术构建。它们是仅解码器的文本到文本大语言模型,提供英语版本,包含开放权重、预训练变体和指令调优变体。Gemma模型适用于多种文本生成任务,包括问答、摘要和推理。其相对较小的体积使其能够在资源有限的环境中部署,如笔记本电脑、台式机或自有云基础设施,从而普及先进AI模型的访问,促进创新。
使用
以下是一些快速开始运行模型的代码片段。首先确保pip install -U transformers
,然后复制适用于您用例的代码片段。
在CPU上运行模型
如下所述,我们推荐torch.bfloat16
作为默认数据类型。如有需要,可以使用其他精度。
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
tokenizer = AutoTokenizer.from_pretrained("google/gemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
torch_dtype=torch.bfloat16
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt")
outputs = model.generate(**input_ids, max_new_tokens=50)
print(tokenizer.decode(outputs[0]))
在单/多GPU上运行模型
# pip install accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
tokenizer = AutoTokenizer.from_pretrained("google/gemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
device_map="auto",
torch_dtype=torch.bfloat16
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
在GPU上使用不同精度运行模型
此模型的原始权重以bfloat16
精度导出。您可以使用float16
(在某些硬件上可能更快),在加载模型时指定torch_dtype
。为方便起见,float16
版本的仓库包含已转换为该精度的权重副本。
您也可以使用float32
(如果跳过dtype,模型权重将仅向上转换为float32
,但精度不会提高)。示例如下:
- 使用
torch.float16
# pip install accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
tokenizer = AutoTokenizer.from_pretrained("google/gemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
device_map="auto",
torch_dtype=torch.float16,
revision="float16",
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
- 使用
torch.bfloat16
# pip install accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
device_map="auto",
torch_dtype=torch.bfloat16
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
- 向上转换为
torch.float32
# pip install accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("google/gemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
device_map="auto"
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
通过bitsandbytes
量化版本
- 使用8位精度(int8)
# pip install bitsandbytes accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
tokenizer = AutoTokenizer.from_pretrained("google/gemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
quantization_config=quantization_config
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
- 使用4位精度
# pip install bitsandbytes accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_4bit=True)
tokenizer = AutoTokenizer.from_pretrained("google/gemma-1.1-7b-it")
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-1.1-7b-it",
quantization_config=quantization_config
)
input_text = "写一首关于机器学习的诗。"
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))
其他优化
- Flash Attention 2
首先确保在环境中安装flash-attn
:pip install flash-attn
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
+ attn_implementation="flash_attention_2"
).to(0)
在JAX/Flax中运行模型
使用仓库的flax
分支:
import jax.numpy as jnp
from transformers import AutoTokenizer, FlaxGemmaForCausalLM
model_id = "google/gemma-1.1-7b-it"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.padding_side = "left"
model, params = FlaxGemmaForCausalLM.from_pretrained(
model_id,
dtype=jnp.bfloat16,
revision="flax",
_do_init=False,
)
inputs = tokenizer("Valencia and Málaga are", return_tensors="np", padding=True)
output = model.generate(**inputs, params=params, max_new_tokens=20, do_sample=False)
output_text = tokenizer.batch_decode(output.sequences, skip_special_tokens=True)
查看此笔记本了解如何并行化JAX推理的详细指南。
聊天模板
指令调优模型使用必须遵守的聊天模板进行对话使用。最简单的方法是使用分词器内置的聊天模板,如下所示:
加载模型并应用聊天模板到对话中。此示例从单次用户交互开始:
from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch
model_id = "google/gemma-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": "写一个Hello World程序" },
]
prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
此时,提示包含以下文本:
<bos><start_of_turn>user
写一个Hello World程序<end_of_turn>
<start_of_turn>model
如您所见,每个回合以<start_of_turn>
分隔符开头,然后是实体角色(user
表示用户提供的内容,model
表示LLM响应)。回合以<end_of_turn>
标记结束。
您可以根据需要手动构建提示,而无需使用分词器的聊天模板。
提示准备就绪后,可以按如下方式生成:
inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=150)
微调
您可以在google/gemma-7b
仓库的examples/
目录下找到一些微调脚本。要适配此模型,只需将模型ID更改为google/gemma-1.1-7b-it
。
我们提供:
- 在UltraChat数据集上使用QLoRA进行监督微调(SFT)的脚本
- 在TPU设备上使用FSDP进行SFT的脚本
- 可在免费层Google Colab实例上运行的笔记本,用于在英语名言数据集上进行SFT
输入和输出
- 输入: 文本字符串,如问题、提示或待摘要的文档。
- 输出: 生成的英语文本,作为对输入的响应,如问题的答案或文档的摘要。
模型数据
用于模型训练的数据及数据处理方式。
训练数据集
这些模型在包含多种来源的文本数据集上训练,总计6万亿标记。关键组成部分包括:
- 网络文档:多样化的网络文本确保模型接触到广泛的语言风格、主题和词汇。主要为英语内容。
- 代码:让模型接触代码有助于学习编程语言的语法和模式,提高生成代码或理解代码相关问题的能力。
- 数学:数学文本训练帮助模型学习逻辑推理、符号表示和解决数学查询。
这些多样化数据源的组合对于训练能够处理各种任务和文本格式的强大语言模型至关重要。
数据预处理
以下是应用于训练数据的关键数据清理和过滤方法:
- CSAM过滤:在数据准备过程的多个阶段应用严格的CSAM(儿童性虐待材料)过滤,确保排除有害和非法内容。
- 敏感数据过滤:作为使Gemma预训练模型安全可靠的一部分,使用自动化技术过滤掉某些个人信息和其他敏感数据。
- 其他方法:根据我们的政策,基于内容质量和安全性进行过滤。
实现信息
关于模型内部的详细信息。
硬件
Gemma使用最新一代的Tensor Processing Unit (TPU)硬件(TPUv5e)进行训练。
训练大语言模型需要大量计算资源。TPU专为机器学习中常见的矩阵运算设计,在此领域具有以下优势:
- 性能:TPU专为处理LLM训练中的大规模计算而设计,相比CPU可显著加速训练。
- 内存:TPU通常配备大量高带宽内存,可处理大模型和批量训练,从而提高模型质量。
- 可扩展性:TPU Pod(大型TPU集群)为处理大型基础模型的复杂性提供了可扩展解决方案。
- 成本效益:在许多场景下,TPU相比基于CPU的基础设施提供了更具成本效益的解决方案,尤其是在考虑到更快的训练节省的时间和资源时。
- 这些优势与Google的可持续运营承诺一致。
软件
训练使用JAX和ML Pathways完成。
JAX允许研究人员利用包括TPU在内的最新硬件,更快更高效地训练大模型。
ML Pathways是Google构建能够跨多个任务泛化的人工智能系统的最新努力。这特别适合基础模型,包括这些大语言模型。
如关于Gemini模型家族的论文所述,JAX和ML Pathways一起使用:“JAX和Pathways的‘单一控制器’编程模型允许单个Python进程编排整个训练运行,极大地简化了开发工作流程。”
评估
模型评估指标和结果。
基准测试结果
预训练基础模型针对大量不同数据集和指标进行评估,涵盖文本生成的各个方面:
基准测试 | 指标 | 2B参数 | 7B参数 |
---|---|---|---|
MMLU | 5-shot, top-1 | 42.3 | 64.3 |
HellaSwag | 0-shot | 71.4 | 81.2 |
PIQA | 0-shot | 77.3 | 81.2 |
SocialIQA | 0-shot | 49.7 | 51.8 |
BooIQ | 0-shot | 69.4 | 83.2 |
WinoGrande | 部分分数 | 65.4 | 72.3 |
CommonsenseQA | 7-shot | 65.3 | 71.3 |
OpenBookQA | 47.8 | 52.8 | |
ARC-e | 73.2 | 81.5 | |
ARC-c | 42.1 | 53.2 |


