教程
在本教程中,您将通过以下步骤了解模型的生命周期——从训练到服务:
- 使用sklearn 示例脚本训练模型
- 使用ClearML Serving服务模型
- 启动推理容器
本教程还涵盖了以下clearml-serving
功能:
- 自动模型部署
- Canary Endpoint
- Model Performance Monitoring
先决条件
在执行以下步骤之前,请确保您已完成clearml-serving
的初始设置。
步骤
步骤 1: 训练模型
使用示例脚本训练模型。从本地clearml-serving
仓库的根目录开始。
- 创建一个Python虚拟环境
- 安装脚本需求:
pip3 install -r examples/sklearn/requirements.txt
- 执行训练脚本:
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"
确保你已经执行了clearml-serving
的
初始设置,在其中你创建了一个服务服务。
服务服务的ID是注册模型以及执行clearml-serving
的metrics
和config
命令所必需的。
预处理Python代码被打包并上传到Serving服务,供任何推理容器使用,并在更新时实时下载。
步骤 3: 启动推理容器
旋转推理容器:
-
如果需要,自定义容器 Dockerfile
-
构建容器:
docker build --tag clearml-serving-inference:latest -f clearml_serving/serving/Dockerfile .
-
旋转推理容器:
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
-
测试新的模型推理端点:
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代码。一旦所有内容都被缓存,响应将几乎立即返回。
手动注册和部署新模型
将现有模型文件上传到模型库可以通过clearml
RestAPI、python接口或clearml-serving
CLI完成。
-
将模型文件上传到
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 网页界面中,新模型列在其项目的模型标签下。 您也可以直接从网页界面下载模型文件本身。
-
使用新模型注册一个新端点:
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>
你也可以为模型提供一个不同的存储目的地,例如S3/GS/Azure,通过传递
--destination="s3://bucket/folder"
, s3://host_addr:port/bucket
(对于非AWS的S3类似服务如MinIO), gs://bucket/folder
, azure://
。不需要为目的地参数提供唯一的路径,模型的位置将基于服务ID和模型名称生成一个唯一的路径。
附加选项
自动模型部署
ClearML 服务服务支持自动模型部署和升级,它与模型仓库和 API 连接。当配置了模型自动部署时,当你在 ClearML 模型仓库中发布
或标记
一个新模型时,新模型版本将自动部署。这个自动化接口允许更简单的 CI/CD 模型部署过程,因为单个 API 会自动从服务服务中部署(或移除)模型。
自动模型部署示例
-
配置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`
-
部署推理容器(如果尚未部署)
-
在模型仓库中通过以下方式之一发布一个新模型:
-
转到ClearML网页界面中的“serving examples”项目,点击模型标签,搜索“train sklearn model”,右键点击并选择“发布”
-
使用RestAPI(参见详情)
-
使用Python接口:
from clearml import Model
Model(model_id="unique_model_id_here").publish()
-
-
新模型可在新的端点版本(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/
。
与任何其他服务配置一样,您可以在推理容器已经运行和部署的情况下配置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/
。
示例:
-
添加两个端点:
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"
-
添加金丝雀端点:
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
-
测试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}'`
模型监控与性能指标
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上可视化。
您还可以使用--variable-value x2
记录时间序列值,或使用--variable-enum animal=cat,dog,sheep
记录离散结果(例如分类字符串)。可以在预处理和后处理中通过调用collect_custom_statistics_fn({'new_var': 1.337})
添加额外的自定义变量。请参阅preprocess_template.py。
随着新指标的记录,您可以创建一个可视化仪表板,用于显示调用的延迟和输出分布。
Grafana 模型性能示例
- 浏览到
http://localhost:3000
- 登录使用:admin/admin
- 创建一个新的仪表板
- 选择 Prometheus 作为数据源
- 添加一个查询:
100 * increase(test_model_sklearn:_latency_bucket[1m]) / increase(test_model_sklearn:_latency_sum[1m])
- 将类型更改为热图,并在右侧的“数据格式”下选择“时间序列桶”。您现在拥有随时间变化的延迟分布。
- 对x0重复相同的过程,查询将是
100 * increase(test_model_sklearn:x0_bucket[1m]) / increase(test_model_sklearn:x0_sum[1m])
如果未指定,所有服务请求都将被记录,这可以通过CLEARML_DEFAULT_METRIC_LOG_FREQ
环境变量进行更改。例如CLEARML_DEFAULT_METRIC_LOG_FREQ=0.2
意味着只有20%的请求会被记录。您还可以使用clearml-serving
CLI指定每个端点的记录频率。参见clearml-serving metrics。
更多示例
查看使用其他支持框架的ClearML Serving示例:
- scikit-learn - 随机数据
- scikit-learn 模型集成 - 随机数据
- XGBoost - 鸢尾花数据集
- LightGBM - 鸢尾花数据集
- PyTorch - MNIST 数据集
- TensorFlow/Keras - MNIST 数据集
- 模型管道 - 随机数据