Keras 3 API 文件 / KerasNLP / 預先訓練的模型 / Gemma / GemmaCausalLM 模型

GemmaCausalLM 模型

[來源]

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() 建立模型時,預設會執行此操作。

參數

範例

使用 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 可以傳遞為以下其中一種:

  1. 內建的預設集識別碼,例如 'bert_base_en'
  2. Kaggle 模型控點,例如 'kaggle://user/bert/keras/bert_base_en'
  3. Hugging Face 控點,例如 'hf://user/bert_base_en'
  4. 本機預設集目錄的路徑,例如 './bert_base_en'

對於任何 Task 子類別,您可以執行 cls.presets.keys() 來列出類別上可用的所有內建預設集。

這個建構函式可以用兩種方式呼叫。可以從特定任務的基類呼叫,例如 keras_nlp.models.CausalLM.from_preset(),或者從模型類別呼叫,例如 keras_nlp.models.BertTextClassifier.from_preset()。如果從基類呼叫,則傳回物件的子類別將從預設集目錄中的配置推斷出來。

參數

  • preset:字串。內建的預設集識別碼、Kaggle 模型控點、Hugging Face 控點或本機目錄的路徑。
  • load_weights:布林值。如果為 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() 方法設定。

如果 inputstf.data.Dataset,則輸出將「逐批」產生並串聯起來。否則,所有輸入都將作為單一批次處理。

如果模型附加了 preprocessor,則 inputs 會在 generate() 函式內部進行預處理,並且應該符合 preprocessor 層預期的結構(通常是原始字串)。如果未附加 preprocessor,則 inputs 應符合 backbone 預期的結構。請參閱上面的範例用法以了解每個範例。

參數

  • inputs:python 資料、張量資料或 tf.data.Dataset。如果模型附加了 preprocessor,則 inputs 應該符合 preprocessor 層預期的結構。如果未附加 preprocessor,則 inputs 應符合 backbone 模型預期的結構。
  • max_length:選用。int。產生序列的最大長度。預設為 preprocessor 設定的最大 sequence_length。如果 preprocessorNone,則應將 inputs 填充至所需的最大長度,並且將忽略此參數。
  • stop_token_ids:選用。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 表示的生成結果。

參數

  • token_ids:一個[批次大小,token 數量] 張量,包含要評估的 token。通常,此張量會擷取呼叫 GemmaCausalLM.generate() 的輸出,亦即輸入文字和模型產生文字的 token。
  • padding_mask:一個[批次大小,token 數量] 張量,指示在產生過程中應保留的 token。這是 GemmaBackbone 所需的產物,不會影響此函式的計算。如果省略,此函式會使用 keras.ops.ones() 建立適當形狀的張量。
  • scoring_mode:要返回的分數類型,可以是「logits」或「loss」,兩者都將針對每個輸入 token 計算。
  • layer_intercept_fn:一個可選函式,用於透過額外計算來增強激活,例如作為可解釋性研究的一部分。此函式會將激活作為其第一個參數,並將與該骨幹層關聯的數值索引作為第二個參數。_此索引_不是_ self.backbone.layers _中的索引。索引 -1 伴隨在正向傳播中呼叫 token_ids 上的 self.backbone.token_embedding() 所返回的嵌入。所有後續索引將是骨幹中每個 Transformers 層返回的激活的 0 基底索引。此函式必須返回一個[批次大小,token 數量,隱藏維度] 張量,該張量可以作為模型中下一層的輸入。
  • target_ids:一個[批次大小,token 數量] 張量,包含應針對其計算損失的預測 token。如果提供了一段 token(張量中沿軸 = 1 的連續真值),則損失將計算為這些 token 的總和。

引發

  • ValueError:如果提供了不受支援的 scoring_mode,或者在使用 ScoringMode.LOSS 時未提供 target_ids。

返回

每個 token 的分數,以大小為的張量表示在「logits」模式下為 [批次大小,token 數量,詞彙大小],或在「loss」模式下為 [批次大小,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)