Model Accuracy
Iris is the genus of flower which contains 3 species: setosa, versicolor, and virginica. This demo is based on iris classification model based on flower properties like sepal length, sepal width, petal length, and petal width. The species are also the classes that will be used for the classification. Here we will:
Set up a metrics server for the pre-existing iris classifier deployment
Send a request to get an iris classification
Send feedback requests to gather accuracy metrics
This demo requires Knative installation on the cluster as the metrics server will be installed as a kservice. Also, the metrics server only works with classification models in this version.
These model metrics are only supported for pre-existing Seldon Core 1 deployments with the Seldon inference protocol. Seldon now recommends adopting the industry-standard Open Inference Protocol (OIP) in preference to the Seldon protocol. Seldon has a separate module to support the calculation of model performance metrics with the Open Inference Protocol. Please contact your customer success representative to learn more.
Setup Metrics Server
Use the pre-existing iris classifier deployment with the Seldon inference protocol
From the
Dashboard
page, click onAdd
in the Metrics Server panel:Detector Name:
multiclass
Storage URI:
adserver.cm_models.multiclass_numeric.MultiClassNumeric
Storage Secret: Leave empty as we are using a public bucket
Reply URL: Leave as default value,
http://seldon-request-logger.seldon-logs
metrics server
Make Predictions
Run a single prediction using the ndarray payload format. Make a couple of these requests at random using the predict tool in the UI.
Go to the Predict page.
Paste in the following JSON data for the prediction, and click the
Predict
button:{ "data": { "names": [ "Sepal length", "Sepal width", "Petal length", "Petal Width" ], "ndarray": [ [ 6.8, 2.8, 4.8, 1.4 ] ] } }
Inspect the response, to see that the class with the highest confidence is the second of the iris dataset,
versicolor
.{ "data": { "names": [ "t:0", "t:1", "t:2" ], "ndarray": [ [ 0.008074020139119268, 0.7781601484223357, 0.21376583143854502 ] ] }, "meta": { "requestPath": { "iris-accuracy-container": "seldonio/sklearnserver:1.18.2" } } }
Send Feedback
As we saw the prediction response was versicolor
(the second class of iris). In numeric form the response is,
{
"data": {
"ndarray": [
1
]
}
}
A feedback request consists of the returned value in a response (response.data
on line 5) and a truth value (truth.data
on line 12), for that data. For example, a true-positive feedback request looks like this:
{
"response": {
"data": {
"ndarray": [
1
]
}
},
"truth": {
"data": {
"ndarray": [
1
]
}
}
}
We'll send several feedback requests to the metrics server, that we set-up earlier, for various scenarios.
Set-up the environment variable(s) for the request:
export CLUSTER_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
(Recommended) You may also need to set-up for the
Authorization
header:Return to the predict page, and paste in the prediction, as you did above
Click the
Copy as curl
button, and copy the value that looks likeBearer <authorization header>
Copying aithorization header Set the environment variable:
export AUTH_TOKEN="<paste the authorization value>"
Scenario 1: True-positive:
Request without
Authorization
header:curl -k \ -H "Content-Type: application/json" \ https://$CLUSTER_IP/seldon/seldon/iris-accuracy/api/v0.1/feedback \ -d '{"response":{"data":{"ndarray":[1]}},"truth":{"data":{"ndarray":[1]}}}'
Request with
Authorization
header:curl -k \ -H "Content-Type: application/json" \ -H "Authorization: $AUTH_TOKEN" \ https://$CLUSTER_IP/seldon/seldon/iris-accuracy/api/v0.1/feedback \ -d '{"response":{"data":{"ndarray":[1]}},"truth":{"data":{"ndarray":[1]}}}'
Response:
{ "data": { "tensor": { "shape": [ 0 ] } }, "meta": { "requestPath": { "iris-accuracy-container": 1.18.2 } } }
Scenario 2: False-positive:
The difference from the previous scenario is the in the
truth
value:- -d '{"response":{"data":{"ndarray":[1]}},"truth":{"data":{"ndarray":[1]}}}' + -d '{"response":{"data":{"ndarray":[1]}},"truth":{"data":{"ndarray":[0]}}}'
Request without
Authorization
header:curl -k \ -H "Content-Type: application/json" \ https://$CLUSTER_IP/seldon/seldon/iris-accuracy/api/v0.1/feedback \ -d '{"response":{"data":{"ndarray":[1]}},"truth":{"data":{"ndarray":[0]}}}'
Request with
Authorization
header:curl -k \ -H "Content-Type: application/json" \ -H "Authorization: $AUTH_TOKEN" \ https://$CLUSTER_IP/seldon/seldon/iris-accuracy/api/v0.1/feedback \ -d '{"response":{"data":{"ndarray":[1]}},"truth":{"data":{"ndarray":[0]}}}'
Response:
{ "data": { "tensor": { "shape": [ 0 ] } }, "meta": { "requestPath": { "iris-accuracy-container": 1.18.2 } } }
Monitor accuracy metrics on the Monitor Screen
Having done a prediction, metrics will begin to become available.
Go to the monitor screen's
Prediction Accuracy
tab to view all the metrics.Set the time range to view the metrics, using the "From Time" and "To Time" selectors.
You can see metrics like accuracy, precision, recall and specificity here. Notice the drop in accuracy metrics after the false feedback was received.
Submit batch feedback using Batch Processor component
Now we will submit a feedback as a batch using the Batch Processor component.
We will use two files, each containing 10k feedback instances:
90% success rate feedback file
40% success rate feedback file
We need to upload the files to MinIO's
data
bucket. For details on interacting with MinIO UI please see Batch Demo.Once the files are in the MinIO bucket, go to the
Batch Jobs
screen using either the navigation bar on the left side or with the button on the model dashboard. For each offeedback-input-90.txt
andfeedback-input-40.txt
files, submit a batch job. Wait for the first to complete before proceeding to the next. Submit batch request using the following form values:Input Data Location:
minio://data/feedback-input-40.txt
Output Data Location:
minio://data/output-data-40-{{workflow.name}}.txt
Number of Workers:
15
Number of Retries:
3
Batch Size:
1
Minimum Batch Wait Interval (sec):
0
Method:
Feedback
Transport Protocol:
REST
Input Data Type:
Raw Data
Object Store Secret Name:
minio-bucket-envvars
Resources:
Leave defaults
metrics server Now go to the monitor view and observe how metrics value evolve over time.
Troubleshooting
If you experience issues with this demo, see the troubleshooting docs and also the Knative or Elasticsearch sections.
Last updated
Was this helpful?