作者: Samaneh Saadat, Matthew Watson
创建日期: 2024/04/29
最后修改: 2024/04/29
描述: 本文介绍如何将微调后的 KerasNLP 模型上传到模型中心。
微调机器学习模型可以为特定任务提供令人印象深刻的结果。 将微调后的模型上传到模型中心可以让你与更广泛的社区分享它。 通过分享你的模型,你将增强其他研究人员和开发者的可及性, 使你的贡献成为机器学习领域不可或缺的一部分。 这也可以简化将你的模型集成到实际应用中的过程。
本指南将引导你如何将微调后的模型上传到流行的模型中心,如 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")
从 https://www.kaggle.com/api/v1/models/keras/gpt2/keras/gpt2_base_en/2/download/task.json 下载中...
从 https://www.kaggle.com/api/v1/models/keras/gpt2/keras/gpt2_base_en/2/download/preprocessor.json 下载中...
加载模型后,可以在模型上调用 .fit()
进行微调。
在这里,我们在 IMDB 影评上微调模型,使其对电影领域更具特定性。
# 丢弃标签,只保留 Causal LM 的评论文本。
imdb_train_reviews = imdb_train.map(lambda x, y: x)
# 微调 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.Backbone
和 keras_nlp.models.Tokenizer
对象。
请注意,这些对象等同于上面的 causal_lm.backbone
和 causal_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 则应以 hf://
开头。
要将模型上传到 Kaggle,首先,我们需要与 Kaggle 进行身份验证。
这可以通过以下方式之一完成:
1. 设置环境变量 KAGGLE_USERNAME
和 KAGGLE_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)
上传成功: preprocessor.json (834B)
上传成功: tokenizer.json (322B)
上传成功: task.json (2KB)
上传成功: model.weights.h5 (475MB)
上传成功: config.json (431B)
上传成功: metadata.json (142B)
上传成功: merges.txt (446KB)
上传成功: vocabulary.json (1018KB)
您的模型实例版本已创建。
要将模型上传到 Hugging Face,首先需要进行认证。可以通过以下方式之一实现:
HF_USERNAME
和 HF_TOKEN
。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()
keras_nlp.upload_preset(uri, preset_dir)
可用于将模型上传到 Hugging Face,如果 uri
的格式为
kaggle://<HF_USERNAME>/<MODEL>
。
运行以下命令将 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")
上传分类器模型与 Causal LM 上传相似。
要上传微调后的模型,首先应使用 save_to_preset
API 将模型保存到本地目录,然后可以通过 keras_nlp.upload_preset
上传。
# 加载基础模型。
classifier = keras_nlp.models.Classifier.from_preset(
"bert_tiny_en_uncased", num_classes=2
)
# 微调分类器。
classifier.fit(imdb_train)
# 将模型保存到本地预设目录。
preset_dir = "./bert_tiny_imdb"
classifier.save_to_preset(preset_dir)
# 上传到 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
上传成功: preprocessor.json (947B)
上传成功: tokenizer.json (461B)
上传成功: task.json (2KB)
上传成功: task.weights.h5 (50MB)
上传成功: model.weights.h5 (17MB)
上传成功: config.json (454B)
上传成功: metadata.json (140B)
上传成功: vocabulary.txt (226KB)
您的模型实例版本已创建。
在验证模型已上传到 Kaggle 后,我们可以通过调用 from_preset
加载该模型。
classifier = keras_nlp.models.Classifier.from_preset(
f"kaggle://{kaggle_username}/bert/keras/bert_tiny_imdb"
)