Skip to main content

教程

在本教程中,您将通过以下步骤了解模型的生命周期——从训练到服务:

本教程还涵盖了以下clearml-serving功能:

  • 自动模型部署
  • Canary Endpoint
  • Model Performance Monitoring

先决条件

在执行以下步骤之前,请确保您已完成clearml-serving初始设置

步骤

步骤 1: 训练模型

使用示例脚本训练模型。从本地clearml-serving仓库的根目录开始。

  1. 创建一个Python虚拟环境
  2. 安装脚本需求:pip3 install -r examples/sklearn/requirements.txt
  3. 执行训练脚本: python3 examples/sklearn/train_model.py.

在执行过程中,ClearML 会自动注册 sklearn 模型并将其上传到模型仓库。 有关显式模型注册的信息,请参阅 手动注册和部署新模型

步骤 2: 注册模型

在服务服务上注册新模型:

clearml-serving --id <service_id> model add --engine sklearn --endpoint "test_model_sklearn" --preprocess "examples/sklearn/preprocess.py" --name "train sklearn model - sklearn-model" --project "serving examples"
Service ID

确保你已经执行了clearml-serving初始设置,在其中你创建了一个服务服务。 服务服务的ID是注册模型以及执行clearml-servingmetricsconfig命令所必需的。

note

预处理Python代码被打包并上传到Serving服务,供任何推理容器使用,并在更新时实时下载。

步骤 3: 启动推理容器

旋转推理容器:

  1. 如果需要,自定义容器 Dockerfile

  2. 构建容器:

    docker build --tag clearml-serving-inference:latest -f clearml_serving/serving/Dockerfile .
  3. 旋转推理容器:

    docker run -v ~/clearml.conf:/root/clearml.conf -p 8080:8080 -e CLEARML_SERVING_TASK_ID=<service_id> -e CLEARML_SERVING_POLL_FREQ=5 clearml-serving-inference:latest
  4. 测试新的模型推理端点:

    curl -X POST "http://127.0.0.1:8080/serve/test_model_sklearn" -H "accept: application/json" -H "Content-Type: application/json" -d '{"x0": 1, "x1": 2}'

现在您已经运行了一个推理容器,您可以直接使用CLI添加新的模型推理端点。推理容器将每5分钟自动同步一次。前几次请求可能会花费更长时间,因为推理容器需要下载模型文件和处理Python代码。一旦所有内容都被缓存,响应将几乎立即返回。

note

在ClearML网络用户界面中,查看模型仓库,位于您的ClearML账户/服务器上的“serving examples”项目下(免费托管自部署)。

推理服务状态、控制台输出和机器指标可在ClearML UI中的服务项目(默认:“DevOps”项目)中查看。

手动注册和部署新模型

将现有模型文件上传到模型库可以通过clearml RestAPI、python接口或clearml-serving CLI完成。

  1. 将模型文件上传到clearml-server文件存储并注册它。--path参数用于输入本地模型文件的路径(在步骤1中创建的本地模型位于./sklearn-model.pkl)。

    clearml-serving --id <service_id> model upload --name "manual sklearn model" --project "serving examples" --framework "scikitlearn" --path ./sklearn-model.pkl

    你现在在serving examples项目中有一个名为manual sklearn model的新模型。CLI输出打印了新模型的UID,你将使用它来注册一个新的端点。

    ClearML 网页界面中,新模型列在其项目的模型标签下。 您也可以直接从网页界面下载模型文件本身。

  2. 使用新模型注册一个新端点:

    clearml-serving --id <service_id> model add --engine sklearn --endpoint "test_model_sklearn" --preprocess "examples/sklearn/preprocess.py" --model-id <newly_created_model_id_here>
Model Storage

你也可以为模型提供一个不同的存储目的地,例如S3/GS/Azure,通过传递 --destination="s3://bucket/folder", s3://host_addr:port/bucket (对于非AWS的S3类似服务如MinIO), gs://bucket/folder, azure://.blob.core.windows.net/path/to/file。不需要为目的地参数提供唯一的路径,模型的位置将基于服务ID和模型名称生成一个唯一的路径。

附加选项

自动模型部署

ClearML 服务服务支持自动模型部署和升级,它与模型仓库和 API 连接。当配置了模型自动部署时,当你在 ClearML 模型仓库中发布标记一个新模型时,新模型版本将自动部署。这个自动化接口允许更简单的 CI/CD 模型部署过程,因为单个 API 会自动从服务服务中部署(或移除)模型。

自动模型部署示例

  1. 配置Serving Service上的模型自动更新:

    clearml-serving --id <service_id> model auto-update --engine sklearn --endpoint "test_model_sklearn_auto" --preprocess "preprocess.py" --name "train sklearn model" --project "serving examples" --max-versions 2`
  2. 部署推理容器(如果尚未部署)

  3. 在模型仓库中通过以下方式之一发布一个新模型:

    • 转到ClearML网页界面中的“serving examples”项目,点击模型标签,搜索“train sklearn model”,右键点击并选择“发布”

    • 使用RestAPI(参见详情

    • 使用Python接口:

      from clearml import Model
      Model(model_id="unique_model_id_here").publish()
  4. 新模型可在新的端点版本(1)上使用,测试方法如下:

    curl -X POST "http://127.0.0.1:8080/serve/test_model_sklearn_auto/1" -H "accept: application/json" -H "Content-Type: application/json" -d '{"x0": 1, "x1": 2}'

Canary 端点设置

金丝雀端点部署添加了一个新的端点,实际请求将被发送到一组预配置的端点,并带有预先提供的分布。例如,让我们创建一个新的端点“test_model_sklearn_canary”,你可以提供一个端点列表和概率(权重)。

clearml-serving --id <service_id> model canary --endpoint "test_model_sklearn_canary" --weights 0.1 0.9 --input-endpoints test_model_sklearn/2 test_model_sklearn/1

这意味着任何发送到 /test_model_sklearn_canary/ 的请求将有90%的概率被路由到 /test_model_sklearn/1/,以及10%的概率被路由到 /test_model_sklearn/2/

note

与任何其他服务配置一样,您可以在推理容器已经运行和部署的情况下配置Canary端点,它们将在下一个更新周期中更新(默认:每5分钟一次)。

您还可以准备一个“固定”的金丝雀端点,始终在最后两个部署的模型之间分配负载:

clearml-serving --id <service_id> model canary --endpoint "test_model_sklearn_canary" --weights 0.1 0.9 --input-endpoints-prefix test_model_sklearn/

这意味着你有两个模型推理端点:/test_model_sklearn/1//test_model_sklearn/2/。10%的概率(权重0.1)将匹配最后一个(按版本号排序)端点,即 /test_model_sklearn/2/,而90%将匹配 /test_model_sklearn/2/。当你添加一个新的模型端点版本,例如 /test_model_sklearn/3/,金丝雀分布将自动将90%的概率匹配到 /test_model_sklearn/2/,并将10%匹配到新的端点 /test_model_sklearn/3/

示例:

  1. 添加两个端点:

    clearml-serving --id <service_id> model add --engine sklearn --endpoint "test_model_sklearn" --preprocess "examples/sklearn/preprocess.py" --name "train sklearn model" --version 1 --project "serving examples"
    clearml-serving --id <service_id> model add --engine sklearn --endpoint "test_model_sklearn" --preprocess "examples/sklearn/preprocess.py" --name "train sklearn model" --version 2 --project "serving examples"
  2. 添加金丝雀端点:

    clearml-serving --id <service_id> model canary --endpoint "test_model_sklearn_canary" --weights 0.1 0.9 --input-endpoints test_model_sklearn/2 test_model_sklearn/1
  3. 测试Canary端点:

    curl -X POST "http://127.0.0.1:8080/serve/test_model" -H "accept: application/json" -H "Content-Type: application/json" -d '{"x0": 1, "x1": 2}'` 

模型监控与性能指标

Grafana 截图

ClearML服务实例会自动将服务统计信息(计数/延迟)发送到Prometheus,并且可以使用Grafana来可视化和创建实时仪表板。

默认的docker-compose安装已预先配置了Prometheus和Grafana。请注意,默认情况下,两个容器的数据不是持久化的。为了增加持久性,建议添加一个卷挂载。

您还可以在模型的输入/预测上添加许多自定义指标。一旦模型端点被注册,可以使用CLI添加自定义指标。

例如,假设模拟的scikit-learn模型部署在端点test_model_sklearn上,您可以记录请求的输入和输出(参见examples/sklearn/preprocess.py示例):

clearml-serving --id <serving_service_id_here> metrics add --endpoint test_model_sklearn --variable-scalar
x0=0,0.1,0.5,1,10 x1=0,0.1,0.5,1,10 y=0,0.1,0.5,0.75,1

这将创建一个分布直方图(通过=符号后的小于等于值列表指定桶),您可以在Grafana上可视化。

time-series values

您还可以使用--variable-value x2记录时间序列值,或使用--variable-enum animal=cat,dog,sheep记录离散结果(例如分类字符串)。可以在预处理和后处理中通过调用collect_custom_statistics_fn({'new_var': 1.337})添加额外的自定义变量。请参阅preprocess_template.py

随着新指标的记录,您可以创建一个可视化仪表板,用于显示调用的延迟和输出分布。

Grafana 模型性能示例

  1. 浏览到 http://localhost:3000
  2. 登录使用:admin/admin
  3. 创建一个新的仪表板
  4. 选择 Prometheus 作为数据源
  5. 添加一个查询:100 * increase(test_model_sklearn:_latency_bucket[1m]) / increase(test_model_sklearn:_latency_sum[1m])
  6. 将类型更改为热图,并在右侧的“数据格式”下选择“时间序列桶”。您现在拥有随时间变化的延迟分布。
  7. 对x0重复相同的过程,查询将是 100 * increase(test_model_sklearn:x0_bucket[1m]) / increase(test_model_sklearn:x0_sum[1m])
note

如果未指定,所有服务请求都将被记录,这可以通过CLEARML_DEFAULT_METRIC_LOG_FREQ环境变量进行更改。例如CLEARML_DEFAULT_METRIC_LOG_FREQ=0.2意味着只有20%的请求会被记录。您还可以使用clearml-serving CLI指定每个端点的记录频率。参见clearml-serving metrics

更多示例

查看使用其他支持框架的ClearML Serving示例: