GemmaCausalLM
類別keras_nlp.models.GemmaCausalLM(backbone, preprocessor=None, **kwargs)
用於因果語言建模的端到端 Gemma 模型。
因果語言模型 (LM) 會根據先前的標記預測下一個標記。此任務設定可用於對純文字輸入進行無監督訓練模型,或自動遞迴地產生類似於訓練資料的純文字。只需呼叫 fit()
即可將此任務用於預先訓練或微調 Gemma 模型。
此模型具有 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
,則 inputs
應符合 backbone
預期的結構。請參閱上面的範例用法以了解每個範例。
參數
tf.data.Dataset
。如果模型附加了 preprocessor
,則 inputs
應該符合 preprocessor
層預期的結構。如果未附加 preprocessor
,則 inputs
應符合 backbone
模型預期的結構。preprocessor
設定的最大 sequence_length
。如果 preprocessor
為 None
,則應將 inputs
填充至所需的最大長度,並且將忽略此參數。None
、「自動」或 token ID 的元組。預設值為「自動」,它使用 preprocessor.tokenizer.end_token_id
。未指定處理器將產生錯誤。None 會在產生 max_length
個 token 後停止產生。您也可以指定模型應該停止的 token ID 列表。請注意,token 序列將各自被解釋為一個停止 token,不支援多 token 停止序列。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,
)
評估由提供的 token ID 表示的生成結果。
參數
GemmaCausalLM.generate()
的輸出,亦即輸入文字和模型產生文字的 token。keras.ops.ones()
建立適當形狀的張量。self.backbone.layers
_中的索引。索引 -1 伴隨在正向傳播中呼叫 token_ids
上的 self.backbone.token_embedding()
所返回的嵌入。所有後續索引將是骨幹中每個 Transformers 層返回的激活的 0 基底索引。此函式必須返回一個引發
返回
每個 token 的分數,以大小為的張量表示
範例
使用 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)