Model Monitoring - KServe

https://kserve.github.io/website/0.10/modelserving/detect/alibi_detect/alibi_detect/

使用Alibi异常值/漂移检测器部署推理服务

为了信任模型预测并可靠地对其采取行动,通过各种不同类型的检测器来监控传入请求的分布是至关重要的。KServe将Alibi Detect与以下组件集成在一起:

  • 漂移检测器检查传入请求的分布何时偏离参考分布,例如训练数据的参考分布。
  • 异常值检测器标记不遵循训练分布的单个实例。

所使用的体系结构如下所示,并将KServe中可用的有效载荷日志记录与KNative中这些有效载荷的异步处理联系起来,以检测异常值。
在这里插入图片描述

CIFAR10异常值检测器

CIFAR10异常值检测器。运行notebook demo进行测试。
notebook需要KNative Eventing>=0.18。

CIFAR10漂移探测器

CIFAR10漂移探测器。运行notebook demo进行测试。
notebook需要KNative Eventing>=0.18。

使用AIF360对推理服务进行偏差检测

这是一个如何在KServe上使用AI Fairness 360(AIF360)获得偏差度量的示例。LF人工智能孵化项目AI Fairness 360是一个可扩展的开源工具包,可以帮助用户在整个人工智能应用生命周期中检查、报告和减轻机器学习模型中的歧视和偏见。

我们将使用由加州大学欧文分校机器学习库维护的德国学分数据集。德国信贷数据集包含债权人是否允许贷款申请人获得贷款的数据以及申请人的数据。这些数据包括申请人的信用记录、储蓄和就业的相关数据,以及申请人的一些人口统计数据,如年龄、性别和婚姻状况。债权人可以使用信用记录、储蓄和就业等数据来准确预测申请人偿还贷款的概率,但不应使用年龄和性别等数据来决定是否应向申请人提供贷款。

我们希望能够检查这些“受保护类”是否在模型的预测中使用。在这个例子中,我们将向模型提供一些预测,并根据模型做出的预测计算指标。我们将使用KServe有效负载日志记录功能来收集度量。这些指标将深入了解模型是否偏向于或反对任何受保护的类。在这个例子中,我们将研究我们部署的模型对年龄>25岁的人与年龄<=25岁的人的偏见,并看看债权人是否不公平地对待了这两者。

可以在此处找到用于部署示例的示例资源。

创建推理服务

应用CRD
kubectl

kubectl apply -f bias.yaml

期望输出

$ inferenceservice.serving.kserve.io/german-credit created

部署消息转储程序(有效负载日志的后端接收器示例)

应用消息转储程序CRD,它将收集在推理服务上运行预测时创建的日志。在生产设置中,可以使用Kafka来接收有效负载日志,而不是消息转储程序
kubectl

kubectl apply -f message-dumper.yaml

期望输出

service.serving.knative.dev/message-dumper created

运行预测

第一步是确定入口IP和端口,并设置INGRESS_HOST和INGRESS_PORT

MODEL_NAME=german-credit
SERVICE_HOSTNAME=$(kubectl get inferenceservice ${MODEL_NAME} -o jsonpath='{.status.url}' | cut -d "/" -f 3)
python simulate_predicts.py http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/$MODEL_NAME:predict ${SERVICE_HOSTNAME}

处理度量计算的有效载荷日志

运行json_from_logs.py,它将创建一个AIF可以解释的有效负载。首先,从消息转储程序(message-dumper)中获取事件日志,然后解析这些日志以匹配输入和输出。然后,输入/输出对都被组合成输入列表和输出列表以供AIF解释。应该在这个文件夹中创建一个data.json文件,其中包含json负载。

python json_from_logs.py

运行解释

最后,现在我们已经收集了我们模型的一些预测及其相应的输入,我们将把它们发送到AIF服务器,以计算偏差度量。

python query_bias.py http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/$MODEL_NAME:explain ${SERVICE_HOSTNAME} input.json

解释结果

现在让我们来看看其中一个指标。在这个例子中,不同影响表示特权阶层(年龄>25)的申请人获得贷款的概率与非特权阶层(年纪<=25)的申请者获得贷款的可能性P(Y=1|D=privileged)/P(Y=1|D=unprivileged)之间的比率。由于在下面的样本输出中,不同的影响小于1,因此年龄大于25岁的申请人获得贷款的概率显著高于年龄小于或等于25岁的申请者获得贷款的可能性。这本身并不能证明该模型存在偏见,但确实暗示可能存在一些偏见,可能需要更深入的研究。

python query_bias.py http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/$MODEL_NAME:explain ${SERVICE_HOSTNAME} input.json

期望输出

Sending bias query...
TIME TAKEN:  0.21137404441833496
<Response [200]>
base_rate :  0.9329608938547486
consistency :  [0.982122905027933]
disparate_impact :  0.52
num_instances :  179.0
num_negatives :  12.0
num_positives :  167.0
statistical_parity_difference :  -0.48

数据集

本例中使用的数据集是由加州大学欧文分校机器学习库维护的德国信贷数据集。
Dua,D.和Graff,C.(2019).UCI机器学习库[http://archive.ics.uci.edu/ml]。加利福尼亚州欧文:加利福尼亚大学信息与计算机科学学院。

使用ART获得MNIST分类的对抗性示例

这是一个示例,展示了对抗性修改的输入如何欺骗模型进行错误预测,以突出模型对对抗性攻击的脆弱性。它正在KServe上使用对抗性稳健性工具箱(Adversarial Robustness Toolbox,ART)。ART提供了一些工具,使开发人员能够针对对抗性威胁评估、防御和验证ML模型和应用程序。除了提供对抗性攻击的能力外,它还提供了防御算法

我们将使用MNIST数据集,这是一个手写数字的数据集,并找到可能使模型错误预测分类的对抗性示例,从而显示模型对对抗性攻击的脆弱性。

可以在此处找到用于部署示例的示例资源

使用v1beta1 API部署推理服务

kubectl apply -f art.yaml

然后查找 url

kubectl get inferenceservice
NAME         URL                                               READY   DEFAULT TRAFFIC   CANARY TRAFFIC   AGE
artserver   http://artserver.somecluster/v1/models/artserver   True    100                                40m

说明

第一步是确定入口IP和端口,并设置INGRESS_HOST和INGRESS_PORT

MODEL_NAME=artserver
SERVICE_HOSTNAME=$(kubectl get inferenceservice ${MODEL_NAME} -o jsonpath='{.status.url}' | cut -d "/" -f 3)
python query_explain.py http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/${MODEL_NAME}:explain ${SERVICE_HOSTNAME}

一段时间后,您应该会看到一个包含解释的弹出窗口,类似于下图。如果没有显示弹出窗口,并且出现消息“无法找到对抗性示例”,则无法及时为给定的图像找到对抗性实例。如果弹出窗口确实显示,则左侧的图像是原始图像,右侧的图像是对抗性示例。两个图像上方的标签表示模型对每个单独图像进行的分类。
在这里插入图片描述
本例中使用的平方攻击方法Square Attack method在每次迭代时创建一个随机更新,如果它使错误分类的可能性更大(更具体地说,如果它改进了目标函数),则将该更新添加到对抗性输入中。一旦将足够多的随机更新添加在一起并且模型错误分类,则将返回并显示所产生的对抗性输入。

要尝试另一个MNIST示例,请在查询末尾添加一个0-9999之间的整数。所选择的整数将是要在MNIST数据集中选择的图像的索引。或者,要尝试使用自定义数据的文件,请将文件路径添加到末尾。请记住,数据格式必须为{“instances”: [,

python query_explain.py http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/${MODEL_NAME}:explain ${SERVICE_HOSTNAME} 100
python query_explain.py http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/${MODEL_NAME}:explain ${SERVICE_HOSTNAME} ./input.json

停止推理服务

kubectl delete -f art.yaml

构建开发ART讲解器Docker Image

如果您想为ART讲解器构建开发映像,请按照以下说明进行操作

疑难解答

<504> Gateway Timeout <504> -解释程序可能花费了太长时间,并且没有足够快地发回响应。要么没有分配足够的资源,要么需要减少解释者可以采集的样本数量。要解决此问题,请转到art.yaml并增加资源。

如果您看到Configuration “artserver default”没有任何现成的修订版,则容器可能需要很长时间才能下载。如果您运行kubectl get revision,发现您的修订版卡在ContainerCreating中,请尝试删除推理服务并重新部署。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值