介绍 Skops
Skops 简介
介绍Skops
在Hugging Face,我们致力于解决开源机器学习中的各种问题,包括安全和开放地托管模型,实现可复现性、可解释性和协作性。我们非常荣幸地向您介绍我们的新库:Skops!通过Skops,您可以将您的scikit-learn模型托管到Hugging Face Hub上,为模型文档创建模型卡片,并与他人进行协作。
让我们通过一个端到端的示例来了解一下:首先训练一个模型,然后逐步看看如何在生产中利用Skops进行sklearn。
# 首先导入库
import sklearn
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
# 加载数据并进行拆分
X, y = load_breast_cancer(as_frame=True, return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 训练模型
model = DecisionTreeClassifier().fit(X_train, y_train)
您可以使用任何模型文件名和序列化方法,如pickle
或joblib
。目前,我们的后端使用joblib
来加载模型。hub_utils.init
在给定路径中创建一个包含模型的本地文件夹,并包含训练模型的环境规范的配置文件。传递给init
的数据和任务将帮助Hugging Face Hub在模型页面上启用推理小部件,并提供发现功能以找到模型。
from skops import hub_utils
import pickle
# 保存模型
model_path = "example.pkl"
local_repo = "my-awesome-model"
with open(model_path, mode="bw") as f:
pickle.dump(model, file=f)
# 现在我们将初始化一个本地存储库
hub_utils.init(
model=model_path,
requirements=[f"scikit-learn={sklearn.__version__}"],
dst=local_repo,
task="tabular-classification",
data=X_test,
)
存储库现在包含序列化的模型和配置文件。配置文件包含以下内容:
- 模型的特性。
- 模型的要求。
- 从我们传递的
X_test
中提取的示例输入。 - 模型文件的名称。
- 要解决的任务的名称。
现在我们将创建模型卡片。卡片应该符合预期的Hugging Face Hub格式:一个markdown部分和一个metadata部分,它是顶部的yaml
部分。元数据部分的键在此处定义,并用于模型的可发现性。模型卡片的内容由模板确定,该模板具有:
- 顶部的
yaml
部分用于元数据(例如模型许可证、库名称等) - markdown部分包含自由文本和要填充的部分(例如模型的简单描述),以下部分由
skops
提取以填充模型卡片: - 模型的超参数。
- 模型的交互式图表。
- 对于元数据,填充库名称、任务标识符(例如tabular-classification)和推理小部件所需的信息。
我们将指导您如何以编程方式传递信息以填充模型卡片。您可以查看我们关于skops
提供的默认模板的文档,以及此处模板期望的内容和外观。
您可以通过实例化skops
中的Card
类来创建模型卡片。在模型序列化期间,任务名称和库名称将被写入配置文件。这些信息在卡片的元数据中也是必需的,因此您可以使用metadata_from_config
方法从配置文件中提取元数据,并在创建卡片时将其传递给卡片。您可以使用add
来添加信息和元数据。
from skops import card
# 创建卡片
model_card = card.Card(model, metadata=card.metadata_from_config(Path(destination_folder)))
limitations = "该模型尚未准备好用于生产。"
model_description = "这是一个在乳腺癌数据集上训练的DecisionTreeClassifier模型。"
model_card_authors = "skops_user"
get_started_code = "import pickle \nwith open(dtc_pkl_filename, 'rb') as file: \n clf = pickle.load(file)"
citation_bibtex = "bibtex\n@inproceedings{...,year={2020}}"
# 我们可以使用add来添加信息
model_card.add(
citation_bibtex=citation_bibtex,
get_started_code=get_started_code,
model_card_authors=model_card_authors,
limitations=limitations,
model_description=model_description,
)
# 我们可以直接设置元数据部分
model_card.metadata.license = "mit"
我们将现在评估模型并添加评估方法的描述,方法是使用 add
添加。指标通过 add_metrics
添加,将被解析成一个表格。
from sklearn.metrics import (ConfusionMatrixDisplay, confusion_matrix,
accuracy_score, f1_score)
# 让我们进行预测并评估模型
y_pred = model.predict(X_test)
# 我们可以使用 add_metrics 传递指标,并使用 add 传递详细信息
model_card.add(eval_method="使用测试集对模型进行评估,评估指标为准确度和F1分数(宏平均)。")
model_card.add_metrics(accuracy=accuracy_score(y_test, y_pred))
model_card.add_metrics(**{"f1 score": f1_score(y_test, y_pred, average="micro")})
我们还可以使用 add_plot
添加我们选择的任何图表到卡片中,代码如下所示。
import matplotlib.pyplot as plt
from pathlib import Path
# 我们将创建一个混淆矩阵
cm = confusion_matrix(y_test, y_pred, labels=model.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=model.classes_)
disp.plot()
# 保存图表
plt.savefig(Path(local_repo) / "confusion_matrix.png")
# 图表将以名称 confusion_matrix 写入模型卡片中
# 我们传递图表本身的路径
model_card.add_plot(confusion_matrix="confusion_matrix.png")
让我们将模型卡片保存在本地仓库中。这里的文件名应该是 README.md
,因为 Hugging Face Hub 需要这样的文件名。
model_card.save(Path(local_repo) / "README.md")
我们现在可以将仓库推送到 Hugging Face Hub 中。为此,我们将使用 hub_utils
中的 push
。Hugging Face Hub 需要身份验证令牌,因此您需要在 notebook_login
(如果您从笔记本中登录)或 huggingface-cli login
(如果您从 CLI 中登录)中传递您的令牌。
# 如果仓库在 Hugging Face Hub 上不存在,当我们将 create_remote 设置为 True 时,它将被创建
repo_id = "skops-user/my-awesome-model"
hub_utils.push(
repo_id=repo_id,
source=local_repo,
token=token,
commit_message="从示例中将文件推送到仓库!",
create_remote=True,
)
一旦我们将模型推送到 Hub,任何人都可以使用它,除非仓库是私有的。您可以使用 download
下载模型。除了模型文件,仓库还包含模型配置和环境要求。
download_repo = "downloaded-model"
hub_utils.download(repo_id=repo_id, dst=download_repo)
推理小部件已启用,可以在仓库中进行预测。
如果您的项目要求发生了变化,您可以使用 update_env
更新环境。
hub_utils.update_env(path=local_repo, requirements=["scikit-learn"])
您可以在此处查看使用以上代码推送的示例仓库。我们准备了两个示例,展示如何保存您的模型和使用模型卡片工具。您可以在下面的资源部分中找到它们。
资源
- 模型卡片教程
- hub_utils 教程
- skops 文档