KerasHub:预训练模型 / 开发者指南 / 使用 KerasHub 上传模型

使用 KerasHub 上传模型

作者: Samaneh Saadat, Matthew Watson
创建日期 2024/04/29
最后修改日期 2024/04/29
描述: 介绍如何将微调后的 KerasHub 模型上传到模型库。

在 Colab 中查看 GitHub 源代码

引言

微调机器学习模型可以在特定任务上取得令人印象深刻的结果。将您的微调模型上传到模型库可以使其与更广泛的社区共享。通过分享您的模型,您可以提高其他研究人员和开发者的可访问性,使您的贡献成为机器学习领域不可或缺的一部分。这还可以简化您的模型在实际应用中的集成。

本指南将引导您了解如何将微调后的模型上传到流行的模型库,例如 Kaggle ModelsHugging Face Hub

设置

首先,我们安装并导入所有必需的库。本指南使用 KerasHub。

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

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

import keras_hub

数据

我们可以使用 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_hub.models.Task 包装了 keras_hub.models.Backbonekeras_hub.models.Preprocessor,以创建一个可以直接用于训练、微调和预测给定文本问题的模型。在本节中,我们将解释如何创建 Task、对其进行微调并将其上传到模型库。


加载模型

如果您想基于一个基础模型构建 Causal LM,只需调用 keras_hub.models.CausalLM.from_preset 并传入一个内置的预设标识符即可。

causal_lm = keras_hub.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_hub.models.CausalLM.from_preset(preset_dir)

您还可以从这个预设目录加载 keras_hub.models.Backbonekeras_hub.models.Tokenizer 对象。请注意,这些对象与上面的 causal_lm.backbonecausal_lm.preprocessor.tokenizer 是等效的。

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

将模型上传到模型库

将预设保存到目录后,可以直接从 KerasHub 库将此目录上传到 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_hub.upload_preset(uri, preset_dir) API,其中 uri 对于上传到 Kaggle 的格式为 kaggle://<KAGGLE_USERNAME>/<MODEL>/Keras/<VARIATION>,而 preset_dir 是模型保存所在的目录。

运行以下命令会将保存在 preset_dir 中的模型上传到 Kaggle

kaggle_username = kagglehub.whoami()["username"]
kaggle_uri = f"kaggle://{kaggle_username}/gpt2/keras/gpt2_imdb"
keras_hub.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 的格式为 hf://<HF_USERNAME>/<MODEL>,则可以使用 keras_hub.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_hub.upload_preset(hf_uri, preset_dir)

加载用户上传的模型

验证模型已上传到 Kaggle 后,我们可以通过调用 from_preset 加载模型。

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

我们也可以通过调用 from_preset 加载上传到 Hugging Face 的模型。

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

分类器上传

上传分类器模型与上传 Causal LM 类似。要上传微调后的模型,首先应使用 save_to_preset API 将模型保存到本地目录,然后通过 keras_hub.upload_preset 进行上传。

# Load the base model.
classifier = keras_hub.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_hub.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_hub.models.Classifier.from_preset(
    f"kaggle://{kaggle_username}/bert/keras/bert_tiny_imdb"
)