Configurer Python¶
Écrivez requirements.txt et configurez notre environnement virtuel Python.
%%writefile requirements.txt
scikit-learn
dill
pandas
sklearn
seldon-core
requests
matplotlib
!if [ ! -d "./venv" ]; then python -m venv venv; fi
!source ./venv/bin/activate
!if [ ! -d "/home/jovyan/.config/pip" ]; then mkdir /home/jovyan/.config/pip; fi
Seldon ne fonctionne que dans l'environnement de développement ETAA; modifiez pip.conf
pour récupérer les packages sur internet.
%%writefile /home/jovyan/.config/pip/pip.conf
[global]
index-url = https://jfrog.aaw.cloud.statcan.ca/artifactory/api/pypi/pypi-remote/simple
%%capture
%pip install -r requirements.txt
Nous pouvons ajouter le noyau au lanceur JupyterLab pour une réutilisation facile.
!python -m ipykernel install --user --name=sklearn_iris_jsondata
Déployer le modèle¶
Écrivez un fichier YAML SeldonDeployment pour le modèle conteneurisé.
%%writefile sklearn_iris_jsondata_deployment.yaml
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: seldon-deployment-example
namespace: bryanpaget
spec:
name: sklearn-iris-deployment
annotations:
sidecar.istio.io/inject: "false"
predictors:
- componentSpecs:
- spec:
containers:
- image: seldonio/sklearn-iris:0.3
imagePullPolicy: IfNotPresent
name: sklearn-iris-classifier
graph:
children: []
endpoint:
type: REST
name: sklearn-iris-classifier
type: MODEL
name: sklearn-iris-predictor
replicas: 1
Déployez SeldonDeployment.
!kubectl create -f sklearn_iris_jsondata_deployment.yaml
!kubectl rollout status deploy \
$(kubectl get deploy -l seldon-deployment-id=seldon-deployment-example \
-o jsonpath='{.items[0].metadata.name}')
Le service est-il disponible ?
for i in range(60):
state = !kubectl get sdep seldon-deployment-example -o jsonpath='{.status.state}'
state = state[0]
print(state)
if state == "Available":
break
time.sleep(1)
assert state == "Available"
Modèle de test¶
Avec l'environnement virtuel configuré et activé, importez les bibliothèques Python nécessaires.
import json
import pandas as pd
Le classificateur d'iris prend un ensemble de quatre mesures, dans ce cas [5.964, 1.006, 2.081, 1.031]
, et il renvoie un ensemble de probabilités, une pour chacun des trois types de fleurs d'iris. Vous pouvez en savoir plus sur les données d'iris ici. Envoyons quelques données au modèle.
res = !curl -v seldon-deployment-example-sklearn-iris-predictor.bryanpaget.svc.cluster.local:8000/api/v0.1/predictions \
-H 'Content-Type: application/json' \
-d '{"data": {"ndarray": [[5.964, 1.006, 2.081, 1.031]]}}'
Résultats¶
Ce sont les résultats en JSON brut.
parsed = json.loads(res[-1])
print(json.dumps(parsed, indent=4, sort_keys=True))
Cette fonction de traçage révèle un graphique à barres avec l'inférence du classificateur.
def display_iris_classifier_results(res):
""" Prend les résultats de classification du classificateur d'iris et les trace dans un graphique à barres pour une visualisation facile des probabilités de classe.
Arguments :
res (string) : résultats du modèle d'iris servi par Seldon.
"""
results = res[-1]
results = json.loads(results)
names = results["data"]["names"]
predictions = results["data"]["ndarray"][0]
model = results["meta"]["requestPath"]
model = model.popitem()
model, version = model[0], model[1]
df = pd.DataFrame({"Class": names, "Probability": predictions})
df.plot(
kind="bar",
title=model.replace("-", " ").title(),
xlabel="Classification",
ylabel="Probability",
legend=False
)
display_iris_classifier_results(res)
Nettoyer¶
Nettoyez en supprimant le déploiement.
!kubectl delete -f sklearn_iris_jsondata_deployment.yaml