介绍 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)

您可以使用任何模型文件名和序列化方法,如picklejoblib。目前,我们的后端使用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 文档