使用 Kubeflow Model Registry

Kubeflow Model Registry 是一个用于管理机器学习模型、其版本以及相关元数据的中心仓库。它允许数据科学家发布模型、跟踪其来源,并协作进行模型开发。

访问 Model Registry

  1. 打开监控面板:登录 Kubeflow 中央监控面板。
  2. Model Registry:在侧边栏中单击 Model Registry。这将带你进入当前 namespace 中已注册模型的列表。

    注意:如果你看不到 Model Registry,请确保平台管理员已在你的 namespace 中部署了一个 Model Registry 实例。

注册模型

你可以通过用户界面或使用 Python client 以编程方式注册模型。

选项 1:使用 UI

  1. 创建已注册模型

    • 单击 Register Model
    • Model Name:输入一个唯一名称(例如,fraud-detection)。
    • Description:添加描述。
    • Version details:可选地添加版本信息、标签和元数据。
    • Model Location:提供模型 artifact 的 S3/URI(例如,s3://my-bucket/models/fraud-detection/v1/)。
    • 单击 Create
  2. 创建版本

    • 单击 Registered Model 旁边下拉菜单,并选择 Register New Version
    • 输入版本名称、描述、元数据和 artifact URI。
    • 单击 Register new version

选项 2:使用 Python Client

你可以直接在 Jupyter Notebook 中使用 model-registry Python client 注册模型。

前提条件

  • 安装 client:python -m pip install model-registry=="0.3.5" kserve=="0.13"
  • 确保你可以访问 Model Registry service。如果在 Kubeflow Notebook 中运行,可以使用内部 service DNS(例如 http://model-registry-service.<namespace>.svc:8080)。

示例代码

以下示例演示如何注册存储在 S3 中的模型。

from model_registry import ModelRegistry

# 1. Connect to the Model Registry
# Replace with your actual Model Registry service host/port
# Inside cluster, typically: "http://model-registry-service.<namespace>.svc.cluster.local:8080"
registry = ModelRegistry(
    server_address="http://model-registry-service.kubeflow.svc.cluster.local",
    port=8080,
    author="your name",
    is_secure=False
)

# 2. Register a new Model
rm = registry.register_model(
    "iris",
    "s3://kfserving-examples/models/sklearn/1.0/model",
    model_format_name="sklearn",
    model_format_version="1",
    version="v1",
    description="Iris scikit-learn model",
    metadata={
        "accuracy": 3.14,
        "license": "BSD 3-Clause License",
    }
)

# 3. Retrieve model information
model = registry.get_registered_model("iris")
print("Registered Model:", model, "with ID", model.id)

version = registry.get_model_version("iris", "v1")
print("Model Version:", version, "with ID", version.id)

art = registry.get_model_artifact("iris", "v1")
print("Model Artifact:", art, "with ID", art.id)

部署已注册模型

一旦模型完成注册,你就可以使用 KServe 将其部署为 InferenceService

要进行部署,通常需要模型 artifact 的 URI。你可以从 Registry UI 或通过 Python API 获取该 URI:

from kubernetes import client
import kserve

isvc = kserve.V1beta1InferenceService(
    api_version=kserve.constants.KSERVE_GROUP + "/v1beta1",
    kind=kserve.constants.KSERVE_KIND,
    metadata=client.V1ObjectMeta(
        name="iris-model",
        namespace=kserve.utils.get_default_target_namespace(),
        labels={
            "modelregistry/registered-model-id": model.id,
            "modelregistry/model-version-id": version.id,
        },
    ),
    spec=kserve.V1beta1InferenceServiceSpec(
        predictor=kserve.V1beta1PredictorSpec(
            model=kserve.V1beta1ModelSpec(
                storage_uri=art.uri,
                model_format=kserve.V1beta1ModelFormat(
                    name=art.model_format_name, version=art.model_format_version
                ),
            )
        )
    ),
)
ks_client = kserve.KServeClient()
ks_client.create(isvc)

部署完成后,KServe controller 将从指定的 S3 URI 拉取模型,并启动 inference server。