GemmaCausalLM 类keras_nlp.models.GemmaCausalLM(backbone, preprocessor=None, **kwargs)
用于因果语言建模的端到端 Gemma 模型。
因果语言模型 (LM) 根据前面的标记预测下一个标记。此任务设置可用于对模型进行无监督训练,使其基于纯文本输入进行训练,或用于自动回归生成与用于训练的数据类似的纯文本。此任务可用于预训练或微调 Gemma 模型,只需调用 fit() 即可。
此模型有一个 generate() 方法,该方法根据提示生成文本。所用的生成策略由 compile() 上的附加 sampler 参数控制。您可以使用不同的 keras_nlp.samplers 对象重新编译模型以控制生成。默认情况下,将使用 "greedy" 采样。
此模型可以选择使用 preprocessor 层进行配置,在这种情况下,它将在 fit()、predict()、evaluate() 和 generate() 期间自动将预处理应用于字符串输入。在使用 from_preset() 创建模型时,默认情况下会执行此操作。
参数
keras_nlp.models.GemmaBackbone 实例。keras_nlp.models.GemmaCausalLMPreprocessor 或 None。如果为 None,则此模型不会应用预处理,并且在调用模型之前应预处理输入。示例
使用 generate() 进行文本生成。
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_2b_en")
gemma_lm.generate("I want to say", max_length=30)
# Generate with batched prompts.
gemma_lm.generate(["This is a", "Where are you"], max_length=30)
使用自定义采样器编译 generate() 函数。
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_2b_en")
gemma_lm.compile(sampler="top_k")
gemma_lm.generate("I want to say", max_length=30)
gemma_lm.compile(sampler=keras_nlp.samplers.BeamSampler(num_beams=2))
gemma_lm.generate("I want to say", max_length=30)
在没有预处理的情况下使用 generate()。
prompt = {
# Token ids for "<bos> Keras is".
"token_ids": np.array([[2, 214064, 603, 0, 0, 0, 0]] * 2),
# Use `"padding_mask"` to indicate values that should not be overridden.
"padding_mask": np.array([[1, 1, 1, 0, 0, 0, 0]] * 2),
}
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset(
"gemma_2b_en",
preprocessor=None,
)
gemma_lm.generate(prompt)
对单个批次调用 fit()。
features = ["The quick brown fox jumped.", "I forgot my homework."]
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_2b_en")
gemma_lm.fit(x=features, batch_size=2)
启用 LoRA 微调,调用 fit()。
features = ["The quick brown fox jumped.", "I forgot my homework."]
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma_2b_en")
gemma.backbone.enable_lora(rank=4)
gemma_lm.fit(x=features, batch_size=2)
在没有预处理的情况下调用 fit()。
x = {
# Token ids for "<bos> Keras is deep learning library<eos>"
"token_ids": np.array([[2, 214064, 603, 5271, 6044, 9581, 1, 0]] * 2),
"padding_mask": np.array([[1, 1, 1, 1, 1, 1, 1, 0]] * 2),
}
y = np.array([[214064, 603, 5271, 6044, 9581, 3, 0, 0]] * 2)
sw = np.array([[1, 1, 1, 1, 1, 1, 0, 0]] * 2)
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset(
"gemma_2b_en",
preprocessor=None,
)
gemma_lm.fit(x=x, y=y, sample_weight=sw, batch_size=2)
自定义骨干和词汇表。
tokenizer = keras_nlp.models.GemmaTokenizer(
proto="proto.spm",
)
preprocessor = keras_nlp.models.GemmaCausalLMPreprocessor(
tokenizer=tokenizer,
sequence_length=128,
)
backbone = keras_nlp.models.GemmaBackbone(
vocabulary_size=30552,
num_layers=4,
num_heads=4,
hidden_dim=256,
intermediate_dim=512,
max_sequence_length=128,
)
gemma_lm = keras_nlp.models.GemmaCausalLM(
backbone=backbone,
preprocessor=preprocessor,
)
gemma_lm.fit(x=features, batch_size=2)
from_preset 方法GemmaCausalLM.from_preset(preset, load_weights=True, **kwargs)
从模型预设实例化 keras_nlp.models.Task。
预设是用于保存和加载预训练模型的配置、权重和其他文件资产的目录。preset 可以作为以下之一传递
'bert_base_en''kaggle://user/bert/keras/bert_base_en''hf://user/bert_base_en''./bert_base_en'对于任何 Task 子类,您可以运行 cls.presets.keys() 列出该类上可用的所有内置预设。
此构造函数可以以两种方式之一调用。从任务特定基类(如 keras_nlp.models.CausalLM.from_preset())调用,或从模型类(如 keras_nlp.models.BertTextClassifier.from_preset())调用。如果从基类调用,则返回对象的子类将从预设目录中的配置推断。
参数
True,则保存的权重将加载到模型体系结构中。如果为 False,则所有权重将随机初始化。示例
# Load a Gemma generative task.
causal_lm = keras_nlp.models.CausalLM.from_preset(
"gemma_2b_en",
)
# Load a Bert classification task.
model = keras_nlp.models.TextClassifier.from_preset(
"bert_base_en",
num_classes=2,
)
| 预设名称 | 参数 | 说明 |
|---|---|---|
| gemma_2b_en | 2.51B | 20 亿参数,18 层,基础 Gemma 模型。 |
| gemma_instruct_2b_en | 2.51B | 20 亿参数,18 层,指令微调的 Gemma 模型。 |
| gemma_1.1_instruct_2b_en | 2.51B | 20 亿参数,18 层,指令微调的 Gemma 模型。1.1 更新提高了模型质量。 |
| code_gemma_1.1_2b_en | 2.51B | 20 亿参数,18 层,CodeGemma 模型。此模型已在代码补全的填充中间 (FIM) 任务上进行训练。1.1 更新提高了模型质量。 |
| code_gemma_2b_en | 2.51B | 20 亿参数,18 层,CodeGemma 模型。此模型已在代码补全的填充中间 (FIM) 任务上进行训练。 |
| gemma_7b_en | 8.54B | 70 亿参数,28 层,基础 Gemma 模型。 |
| gemma_instruct_7b_en | 8.54B | 70 亿参数,28 层,指令微调的 Gemma 模型。 |
| gemma_1.1_instruct_7b_en | 8.54B | 70 亿参数,28 层,指令微调的 Gemma 模型。1.1 更新提高了模型质量。 |
| code_gemma_7b_en | 8.54B | 70 亿参数,28 层,CodeGemma 模型。此模型已在代码补全的填充中间 (FIM) 任务上进行训练。 |
| code_gemma_instruct_7b_en | 8.54B | 70 亿参数,28 层,指令微调的 CodeGemma 模型。此模型已针对与代码相关的聊天用例进行训练。 |
| code_gemma_1.1_instruct_7b_en | 8.54B | 70 亿参数,28 层,指令微调的 CodeGemma 模型。此模型已针对与代码相关的聊天用例进行训练。1.1 更新提高了模型质量。 |
| gemma2_2b_en | 2.61B | 20 亿参数,26 层,基础 Gemma 模型。 |
| gemma2_instruct_2b_en | 2.61B | 20 亿参数,26 层,指令微调的 Gemma 模型。 |
| gemma2_9b_en | 9.24B | 90 亿参数,42 层,基础 Gemma 模型。 |
| gemma2_instruct_9b_en | 9.24B | 90 亿参数,42 层,指令微调的 Gemma 模型。 |
| gemma2_27b_en | 27.23B | 270 亿参数,42 层,基础 Gemma 模型。 |
| gemma2_instruct_27b_en | 27.23B | 270 亿参数,42 层,指令微调的 Gemma 模型。 |
| shieldgemma_2b_en | 2.61B | 20 亿参数,26 层,ShieldGemma 模型。 |
| shieldgemma_9b_en | 9.24B | 90 亿参数,42 层,ShieldGemma 模型。 |
| shieldgemma_27b_en | 27.23B | 270 亿参数,42 层,ShieldGemma 模型。 |
generate 方法GemmaCausalLM.generate(inputs, max_length=None, stop_token_ids="auto")
根据提示 inputs 生成文本。
此方法根据给定的 inputs 生成文本。用于生成的采样方法可以通过 compile() 方法设置。
如果 inputs 是 tf.data.Dataset,则将逐批生成输出并进行串联。否则,所有输入将被视为单个批次进行处理。
如果 preprocessor 附加到模型,则 inputs 将在 generate() 函数内部进行预处理,并且应与 preprocessor 层(通常是原始字符串)所期望的结构匹配。如果 preprocessor 未附加,则输入应与 backbone 所期望的结构匹配。有关每个示例的演示,请参见上面的示例用法。
参数
tf.data.Dataset。如果 preprocessor 附加到模型,则 inputs 应与 preprocessor 层所期望的结构匹配。如果 preprocessor 未附加,则 inputs 应与 backbone 模型所期望的结构匹配。preprocessor 的最大配置的 sequence_length。如果 preprocessor 为 None,则 inputs 应填充到所需的最大长度,并且此参数将被忽略。None、“auto”或标记 ID 元组。默认为“auto”,它使用 preprocessor.tokenizer.end_token_id。不指定处理器会导致错误。None 在生成 max_length 个标记后停止生成。您也可以指定模型应停止的标记 ID 列表。请注意,每个标记序列都将被解释为停止标记,不支持多标记停止序列。backbone 属性keras_nlp.models.GemmaCausalLM.backbone
具有核心体系结构的 keras_nlp.models.Backbone 模型。
preprocessor 属性keras_nlp.models.GemmaCausalLM.preprocessor
用于预处理输入的 keras_nlp.models.Preprocessor 层。
score 方法GemmaCausalLM.score(
token_ids,
padding_mask=None,
scoring_mode="logits",
layer_intercept_fn=None,
target_ids=None,
)
对由提供的标记 ID 表示的生成进行评分。
参数
GemmaCausalLM.generate() 的调用的输出,即输入文本和模型生成的文本的标记。keras.ops.ones() 创建适当形状的张量。self.backbone.layers 中的索引_。索引 -1 与在正向方向上对 token_ids 调用 self.backbone.token_embedding() 返回的嵌入相伴。所有后续索引将是骨干中每个 Transformers 层返回的激活的 0 基索引。此函数必须返回一个引发
返回值
每个标记的评分,作为大小为
示例
使用 TensorFlow 计算嵌入和损失评分之间的梯度
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset(
"gemma_2b_en"
)
generations = gemma_lm.generate(
["This is a", "Where are you"],
max_length=30
)
preprocessed = gemma_lm.preprocessor.generate_preprocess(generations)
generation_ids = preprocessed["token_ids"]
padding_mask = preprocessed["padding_mask"]
target_ids = keras.ops.roll(generation_ids, shift=-1, axis=1)
embeddings = None
with tf.GradientTape(watch_accessed_variables=True) as tape:
def layer_intercept_fn(x, i):
if i == -1:
nonlocal embeddings, tape
embeddings = x
tape.watch(embeddings)
return x
losses = gemma_lm.score(
token_ids=generation_ids,
padding_mask=padding_mask,
scoring_mode="loss",
layer_intercept_fn=layer_intercept_fn,
target_ids=target_ids,
)
grads = tape.gradient(losses, embeddings)