開發者指南 / KerasNLP / 使用 KerasNLP 上傳模型

使用 KerasNLP 上傳模型

作者: Samaneh SaadatMatthew Watson
建立日期 2024/04/29
上次修改日期 2024/04/29
說明:關於如何將微調的 KerasNLP 模型上傳至模型中心的簡介。

在 Colab 中檢視 GitHub 原始碼

簡介

針對特定任務微調機器學習模型可以產生令人印象深刻的結果。將您的微調模型上傳至模型中心,讓您可以與更廣泛的社群分享。透過分享您的模型,您將提高其他研究人員和開發人員的可存取性,使您的貢獻成為機器學習領域中不可或缺的一部分。這也可以簡化您的模型整合到實際應用程式中的過程。

本指南將引導您完成如何將您的微調模型上傳至熱門的模型中心,例如 Kaggle 模型Hugging Face Hub

設定

讓我們先安裝並匯入我們需要的所有函式庫。我們在本指南中使用 KerasNLP。

!pip install -q --upgrade keras-nlp huggingface-hub kagglehub
import os

os.environ["KERAS_BACKEND"] = "jax"

import keras_nlp

資料

我們可以使用 IMDB 評論資料集進行本指南。 讓我們從 tensorflow_dataset 中載入資料集。

import tensorflow_datasets as tfds

imdb_train, imdb_test = tfds.load(
    "imdb_reviews",
    split=["train", "test"],
    as_supervised=True,
    batch_size=4,
)

我們只使用訓練樣本中的一小部分,讓指南執行得更快。 但是,如果您需要更高品質的模型,請考慮使用更多訓練樣本。

imdb_train = imdb_train.take(100)

任務上傳

keras_nlp.models.Task 包裝了一個 keras_nlp.models.Backbone 和一個 keras_nlp.models.Preprocessor,用於建立可以直接用於給定文字問題的訓練、微調和預測的模型。 在本節中,我們將解釋如何建立 Task、微調並將其上傳到模型中心。


載入模型

如果您想基於基礎模型建立因果語言模型,只需呼叫 keras_nlp.models.CausalLM.from_preset 並傳遞內建的預設識別碼。

causal_lm = keras_nlp.models.CausalLM.from_preset("gpt2_base_en")
Downloading from https://www.kaggle.com/api/v1/models/keras/gpt2/keras/gpt2_base_en/2/download/task.json...

Downloading from https://www.kaggle.com/api/v1/models/keras/gpt2/keras/gpt2_base_en/2/download/preprocessor.json...

微調模型

載入模型後,您可以對模型呼叫 .fit() 來微調它。 在這裡,我們在 IMDB 評論上微調模型,這使得模型特定於電影領域。

# Drop labels and keep the review text only for the Causal LM.
imdb_train_reviews = imdb_train.map(lambda x, y: x)

# Fine-tune the Causal LM.
causal_lm.fit(imdb_train_reviews)

100/100 ━━━━━━━━━━━━━━━━━━━━ 151s 1s/step - loss: 1.0198 - sparse_categorical_accuracy: 0.3271


在本地儲存模型

要上傳模型,您需要先使用 save_to_preset 在本地儲存模型。

preset_dir = "./gpt2_imdb"
causal_lm.save_to_preset(preset_dir)

讓我們看看儲存的檔案。

os.listdir(preset_dir)
['preprocessor.json',
 'tokenizer.json',
 'task.json',
 'model.weights.h5',
 'config.json',
 'metadata.json',
 'assets']

載入本地儲存的模型

可以使用 from_preset 載入儲存到本地預設的模型。 您儲存的內容就是您取回的內容。

causal_lm = keras_nlp.models.CausalLM.from_preset(preset_dir)

您也可以從這個預設目錄載入 keras_nlp.models.Backbonekeras_nlp.models.Tokenizer 物件。 請注意,這些物件分別等於上面的 causal_lm.backbonecausal_lm.preprocessor.tokenizer

backbone = keras_nlp.models.Backbone.from_preset(preset_dir)
tokenizer = keras_nlp.models.Tokenizer.from_preset(preset_dir)

將模型上傳到模型中心

將預設儲存到目錄後,可以直接從 KerasNLP 程式庫將此目錄上傳到模型中心,例如 Kaggle 或 Hugging Face。 要將模型上傳到 Kaggle,URI 必須以 kaggle:// 開頭,而要上傳到 Hugging Face,URI 應以 hf:// 開頭。

上傳到 Kaggle

要將模型上傳到 Kaggle,首先,我們需要使用 Kaggle 進行驗證。 這可以透過以下其中一種方式完成:1. 設定環境變數 KAGGLE_USERNAMEKAGGLE_KEY。 2. 提供本地的 ~/.kaggle/kaggle.json。 3. 呼叫 kagglehub.login()

在繼續之前,讓我們確保我們已登入。

import kagglehub

if "KAGGLE_USERNAME" not in os.environ or "KAGGLE_KEY" not in os.environ:
    kagglehub.login()

要上傳模型,我們可以使用 keras_nlp.upload_preset(uri, preset_dir) API,其中 uri 的格式為 kaggle://<KAGGLE_USERNAME>/<MODEL>/Keras/<VARIATION>(用於上傳到 Kaggle),而 preset_dir 是模型儲存的目錄。

執行以下操作會將儲存在 preset_dir 中的模型上傳到 Kaggle

kaggle_username = kagglehub.whoami()["username"]
kaggle_uri = f"kaggle://{kaggle_username}/gpt2/keras/gpt2_imdb"
keras_nlp.upload_preset(kaggle_uri, preset_dir)
Upload successful: preprocessor.json (834B)
Upload successful: tokenizer.json (322B)
Upload successful: task.json (2KB)
Upload successful: model.weights.h5 (475MB)
Upload successful: config.json (431B)
Upload successful: metadata.json (142B)
Upload successful: merges.txt (446KB)
Upload successful: vocabulary.json (1018KB)

Your model instance version has been created.

上傳到 Hugging Face

要將模型上傳到 Hugging Face,首先,我們需要使用 Hugging Face 進行驗證。 這可以透過以下其中一種方式完成:1. 設定環境變數 HF_USERNAMEHF_TOKEN。 2. 呼叫 huggingface_hub.notebook_login()

在繼續之前,讓我們確保我們已登入。

import huggingface_hub

if "HF_USERNAME" not in os.environ or "HF_TOKEN" not in os.environ:
    huggingface_hub.notebook_login()

如果 uri 的格式為 kaggle://<HF_USERNAME>/<MODEL>,則可以使用 keras_nlp.upload_preset(uri, preset_dir) 將模型上傳到 Hugging Face。

執行以下操作會將儲存在 preset_dir 中的模型上傳到 Hugging Face

hf_username = huggingface_hub.whoami()["name"]
hf_uri = f"hf://{hf_username}/gpt2_imdb"
keras_nlp.upload_preset(hf_uri, preset_dir)

載入使用者上傳的模型

確認模型已上傳到 Kaggle 後,我們可以透過呼叫 from_preset 來載入模型。

causal_lm = keras_nlp.models.CausalLM.from_preset(
    f"kaggle://{kaggle_username}/gpt2/keras/gpt2_imdb"
)

我們也可以透過呼叫 from_preset 來載入上傳到 Hugging Face 的模型。

causal_lm = keras_nlp.models.CausalLM.from_preset(f"hf://{hf_username}/gpt2_imdb")

分類器上傳

上傳分類器模型類似於因果語言模型上傳。 要上傳微調的模型,首先,應該使用 save_to_preset API 將模型儲存到本地目錄,然後可以透過 keras_nlp.upload_preset 上傳。

# Load the base model.
classifier = keras_nlp.models.Classifier.from_preset(
    "bert_tiny_en_uncased", num_classes=2
)

# Fine-tune the classifier.
classifier.fit(imdb_train)

# Save the model to a local preset directory.
preset_dir = "./bert_tiny_imdb"
classifier.save_to_preset(preset_dir)

# Upload to Kaggle.
keras_nlp.upload_preset(
    f"kaggle://{kaggle_username}/bert/keras/bert_tiny_imdb", preset_dir
)

100/100 ━━━━━━━━━━━━━━━━━━━━ 7s 31ms/step - loss: 0.6975 - sparse_categorical_accuracy: 0.5164

Upload successful: preprocessor.json (947B)
Upload successful: tokenizer.json (461B)
Upload successful: task.json (2KB)
Upload successful: task.weights.h5 (50MB)
Upload successful: model.weights.h5 (17MB)
Upload successful: config.json (454B)
Upload successful: metadata.json (140B)
Upload successful: vocabulary.txt (226KB)

Your model instance version has been created.

確認模型已上傳到 Kaggle 後,我們可以透過呼叫 from_preset 來載入模型。

classifier = keras_nlp.models.Classifier.from_preset(
    f"kaggle://{kaggle_username}/bert/keras/bert_tiny_imdb"
)