Exemple d'opération d'objet Cloud Pak for Data en Python (client WML, project_lib)

introduction

Lors de la création d'un modèle avec Notebook (Jupyter Notebook) dans le projet d'analyse de Cloud Pak for Data (ci-après CP4D), watson-machine-learning-client comme bibliothèque pour importer des données, stocker le modèle, déployer le modèle créé, etc. -Il y a V4 (ci-après client WML) [^ 1] et project_lib [^ 2]. Les deux sont inclus par défaut dans l'environnement Python standard Notebook de CP4D. Dans cet article, je vais vous montrer comment utiliser ces bibliothèques en détail.

[^ 1]: Pour plus de détails, consultez le Guide de référence du client WML watson-machine-learning-client (V4) et CP4D v2. 5 Consultez le manuel du produit Déployer à l'aide du client Python (https://www.ibm.com/support/knowledgecenter/en/SSQNUZ_2.5.0/wsj/wmls/wmls-deploy-python.html). Veuillez noter que le guide de référence du client WML peut être mis à jour de temps à autre.

[^ 2]: Pour plus d'informations, consultez le manuel du produit CP4D v2.5 [Utilisation de project-lib pour Python](https://www.ibm.com/support/knowledgecenter/en/SSQNUZ_2.5.0/wsj/analyze-data] /project-lib-python.html)

Étant donné que le client WML s'authentifie également en spécifiant l'URL, il fonctionnera même dans un environnement Python en dehors de CP4D. Il peut également être utilisé comme méthode de manipulation d'objets pour les modèles et les déploiements dans CP4D à partir de programmes batch externes.

(Opération version confirmée)

Comment vérifier avec la commande pip dans Notebook

python


!pip show watson-machine-learning-client-V4

output


Name: watson-machine-learning-client-V4
Version: 1.0.64
Summary: Watson Machine Learning API Client
Home-page: http://wml-api-pyclient-v4.mybluemix.net
Author: IBM
Author-email: [email protected], [email protected], [email protected]
License: BSD
Location: /opt/conda/envs/Python-3.6-WMLCE/lib/python3.6/site-packages
Requires: urllib3, pandas, tabulate, requests, lomond, tqdm, ibm-cos-sdk, certifi
Required-by: 
!pip show project_lib

output


Name: project-lib
Version: 1.7.1
Summary: programmatic interface for accessing project assets in IBM Watson Studio
Home-page: https://github.ibm.com/ax/project-lib-python
Author: IBM Watson Studio - Notebooks Team
Author-email: None
License: UNKNOWN
Location: /opt/conda/envs/Python-3.6-WMLCE/lib/python3.6/site-packages
Requires: requests
Required-by: 

Liste des principales opérations sur CP4D et bibliothèques utilisées

Vous pouvez générer et enregistrer des actifs de données, des modèles, des fonctions, des déploiements, etc. Vous pouvez également exécuter le déploiement que vous avez créé.

Opérations sur projets d'analyse

L'actif de données utilise principalement project_lib et le système de modèle utilise le client WML.

Principales opérations Bibliothèque à utiliser
Lire des données à partir d'actifs de données[^3] project_lib ou
pandas.read_avec csv'/project_data/data_asset/nom de fichier'Lire directement
Exporter les données du fichier vers les actifs de données[^4] project_lib
Liste des actifs de données WML client
Enregistrer le modèle WML client
Liste des modèles WML client
Fonction de sauvegarde WML client
Liste des fonctions WML client

[^ 3]: Pour charger les données, cliquez sur le bouton de données (écrit comme 0100) en haut à droite de l'écran Notebook, puis cliquez sur le nom de l'actif de données correspondant> Insérer dans le code> pandas DataFrame dans le Notebook. Le code est automatiquement inséré dans la cellule. Par défaut, il semble que le code de pandas.read_csv soit inséré dans le cas d'un fichier, et le code de project_lib soit inséré dans le cas d'une table DB.

[^ 4]: C'est également possible avec le client WML, mais comme il a été confirmé que le fichier stocké est enregistré dans une zone différente de l'actif de données d'origine et que le nom du fichier est incorrect lors du téléchargement, le client WML a été confirmé. Nous vous déconseillons de le stocker dans des actifs de données. Je n'écrirai pas non plus comment faire cela dans cet article. </ span>

Opérations sur l'espace de déploiement (déploiement analytique)

Tous utilisent le client WML.

Principales opérations Bibliothèque à utiliser
Exporter les données du fichier vers les actifs de données WML client
Liste des actifs de données WML client
Enregistrer le modèle WML client
Liste des modèles WML client
une fonction(une fonction)sauvegarder[^5] WML client
une fonction(une fonction)Affichage de la liste[^5] WML client
Créer un déploiement WML client
Répertorier les déploiements WML client
Effectuer le déploiement WML client

[^ 5]: Sur l'écran de l'espace de déploiement, la fonction est exprimée en "fonction". J'ai le sentiment que la traduction japonaise n'est pas unifiée et qu'elle n'est pas bonne.

Importation et initialisation du client WML

Importer le client WML

from watson_machine_learning_client import WatsonMachineLearningAPIClient

Initialisation du client WML (authentification)

Initialisez le client WML avec la destination de connexion et les informations d'identification. Il existe deux façons d'obtenir des informations d'identification.

  1. Utilisez la valeur de la variable d'environnement OS USER_ACCESS_TOKEN
  2. Utilisez le nom d'utilisateur et le mot de passe CP4D

1 est une méthode qui peut être utilisée avec Notebook sur CP4D. Si vous utilisez le client WML dans un environnement en dehors de CP4D, c'est 2. En guise de note,

Dans le cas de la méthode 1



import os
token = os.environ['USER_ACCESS_TOKEN']
url = "https://cp4d.host.name.com"
wml_credentials = {
    "token" : token,
    "instance_id" : "openshift",
    "url": url,
    "version": "3.0.0"
}
client = WatsonMachineLearningAPIClient(wml_credentials)

Dans le cas de la méthode 2


#Spécifiez le nom d'utilisateur et le mot de passe de l'utilisateur CP4D qui est réellement utilisé pour l'authentification
url = "https://cp4d.host.name.com"
wml_credentials = {
   "username":"xxxxxxxx",
   "password": "xxxxxxxx",
   "instance_id": "openshift",
   "url" : url,
   "version": "3.0.0"
}
client = WatsonMachineLearningAPIClient(wml_credentials)

Basculer entre le projet d'analyse et l'espace de déploiement

Définissez si la cible de l'opération du traitement suivant est le projet d'analyse (default_project) ou l'espace de déploiement (default_space). L'état initial est défini dans le projet d'analyse. *** Lors du changement de la cible de l'opération, assurez-vous d'effectuer cette opération de commutation (point de dépendance). *** ***

Comment trouver chaque ID

Pour l'ID du projet d'analyse, utilisez celui contenu dans la variable d'environnement OS PROJECT_ID.

Définir l'ID du projet d'analyse


project_id = os.environ['PROJECT_ID']

Pour l'ID de l'espace de déploiement, recherchez-le à l'avance dans «GUID de l'espace» dans «Paramètres» de l'espace de déploiement sur l'écran CP4D, ou utilisez le GUID affiché dans client.repository.list_spaces () par la méthode suivante.

Découvrez l'ID de l'espace de déploiement


client.repository.list_spaces()

output


------------------------------------  --------------------  ------------------------
GUID                                  NAME                  CREATED
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  DepSpaceName          2020-05-25T09:13:04.919Z
------------------------------------  --------------------  ------------------------

Définissez l'ID de l'espace de déploiement


space_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Changer la cible de l'opération

Basculer la cible de l'opération vers le projet d'analyse


client.set.default_project(project_id)

Basculer la cible de l'opération vers l'espace de déploiement


client.set.default_space(space_id)

Manipulation des actifs de données

Liste des actifs de données (projet d'analyse)

Utilisez le client WML.

#Passer à un projet d'analyse (uniquement si vous devez basculer)
client.set.default_project(project_id)

#Afficher la liste des actifs de données
client.data_assets.list()

Répertorier les actifs de données (espace de déploiement)

Utilisez le client WML.

#Basculer vers l'espace de déploiement (uniquement si vous devez basculer)
client.set.default_space(space_id)

#Afficher la liste des actifs de données
client.data_assets.list()

Lecture de données à partir d'actifs de données (projet d'analyse)

Cliquez sur le bouton de données (écrit comme 0100) en haut à droite de l'écran du bloc-notes et cliquez sur le nom de l'actif de données approprié> Insérer dans le code> pandas DataFrame pour insérer automatiquement le code dans la cellule du bloc-notes. C'est facile à utiliser.

Pour les fichiers tels que CSV, pandas.read_csv insère automatiquement le code pour lire les données. La partie X de df_data_X augmentera automatiquement lorsque vous répéterez l'opération d'insertion.

Insérer le code(Pour les fichiers)


import pandas as pd
df_data_1 = pd.read_csv('/project_data/data_asset/filename.csv')
df_data_1.head()

Il existe un exemple de code pour lire les données de fichier à l'aide de project_lib dans le manuel du produit, mais c'est le code.

project_Lire des fichiers avec lib


from project_lib import Project
project = Project.access()

my_file = project.get_file("filename.csv")

my_file.seek(0)
import pandas as pd
df = pd.read_csv(my_file)

Pour les tables DB, le code utilisant project_lib est automatiquement inséré dans "Insérer dans le code" ci-dessus. Puisqu'il a `` # @ hidden_cell '' dans la tête, vous pouvez choisir de ne pas inclure cette cellule lors du partage d'un cahier. [^ 6]

[^ 6]: Manuel du produit CP4D v2.5 [Masquage des cellules de code sensibles dans le bloc-notes](https://www.ibm.com/support/knowledgecenter/ja/SSQNUZ_2.5.0/wsj/analyze-data /hide_code.html)

Insérer le code(Table DB2 SCHEMANAME.Exemple de TBL1)


# @hidden_cell
# This connection object is used to access your data and contains your credentials.
# You might want to remove those credentials before you share your notebook.

from project_lib import Project
project = Project.access()
TBL1_credentials = project.get_connected_data(name="TBL1")

import jaydebeapi, pandas as pd
TBL1_connection = jaydebeapi.connect('com.ibm.db2.jcc.DB2Driver',
    '{}://{}:{}/{}:user={};password={};'.format('jdbc:db2',
    TBL1_credentials['host'],
    TBL1_credentials.get('port', '50000'),
    TBL1_credentials['database'],
    TBL1_credentials['username'],
    TBL1_credentials['password']))

query = 'SELECT * FROM SCHEMANAME.TBL1'
data_df_1 = pd.read_sql(query, con=TBL1_connection)
data_df_1.head()

# You can close the database connection with the following code.
# TBL1_connection.close()
# To learn more about the jaydebeapi package, please read the documentation: https://pypi.org/project/JayDeBeApi/

Stockage des données dans les actifs de données (projet d'analyse)

Comment enregistrer une trame de données pandas sous forme de fichier CSV. Utilisez project_lib.

from project_lib import Project
project = Project.access()

project.save_data("filename.csv", df_data_1.to_csv(),overwrite=True)

Stockage des données dans les actifs de données (espace de déploiement)

De même, comment enregistrer le fichier CSV dans l'espace de déploiement. Les actifs de données dans l'espace de déploiement sont utilisés comme données d'entrée lors de l'exécution par lots du déploiement. Utilisez le client WML.

#Sortez une fois la trame de données pandas sous forme de fichier CSV. Par défaut/home/wsuser/Stocké sous le travail
df_data_1.to_csv("filename.csv")

#Basculer vers l'espace de déploiement (uniquement si vous devez basculer)
client.set.default_space(space_id)

#Enregistrer en tant qu'actif de données
asset_details = client.data_assets.create(name="filename.csv",file_path="/home/wsuser/work/filename.csv")

L'ID et href de l'actif de données sauvegardé sont inclus dans la valeur de retour asset_details de create. L'ID et href sont utilisés lors du traitement par lots du déploiement dans l'espace de déploiement.

#valeur de retour de create(Méta-information)Confirmation de
asset_details

output


{'metadata': {'space_id': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  'guid': 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy',
  'href': '/v2/assets/zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz?space_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
  'asset_type': 'data_asset',
  'created_at': '2020-05-25T09:23:06Z',
  'last_updated_at': '2020-05-25T09:23:06Z'},
 'entity': {'data_asset': {'mime_type': 'text/csv'}}}

Retirez-le comme suit.

Valeur de retour actif_Obtenir des méta-informations à partir des détails


asset_id = client.data_assets.get_uid(asset_details)
asset_href = client.data_assets.get_href(asset_details)

Valeur de retour actif_Obtenir des méta-informations à partir des détails (une autre façon)


asset_id = asset_details['metadata']['guid']
asset_href = asset_details['metadata']['href']

Manipulation de modèle

Créer un modèle comme préparation

Par exemple, créez un modèle de forêt aléatoire sckikt-learn à l'aide des exemples de données Iris.

#Charger des exemples de données Iris
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['iris_type'] = iris.target_names[iris.target]

#Créer un modèle dans une forêt aléatoire
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

X = df.drop('iris_type', axis=1)
y = df['iris_type']
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)

clf = RandomForestClassifier(max_depth=2, random_state=0, n_estimators=10)
model = clf.fit(X_train, y_train)
    
#Vérifiez la précision du modèle
from sklearn.metrics import confusion_matrix, accuracy_score
y_test_predicted = model.predict(X_test)    
print("confusion_matrix:")
print(confusion_matrix(y_test,y_test_predicted))
print("accuracy:", accuracy_score(y_test,y_test_predicted))

Le `` modèle '' ci-dessus est le modèle entraîné.

Sauvegarde du modèle (projet d'analyse)

L'enregistrement du modèle dans un projet d'analyse est possible, mais pas une opération obligatoire pour le déploiement. Utilisez le client WML.

#Passer à un projet d'analyse (uniquement si vous devez basculer)
client.set.default_project(project_id)

#Décrire les méta-informations du modèle
model_name = "sample_iris_model"
meta_props={
    client.repository.ModelMetaNames.NAME: model_name,
    client.repository.ModelMetaNames.RUNTIME_UID: "scikit-learn_0.22-py3.6",
    client.repository.ModelMetaNames.TYPE: "scikit-learn_0.22",
    client.repository.ModelMetaNames.INPUT_DATA_SCHEMA:{
        "id":"iris model",
        "fields":[
            {'name': 'sepal length (cm)', 'type': 'double'},
            {'name': 'sepal width (cm)', 'type': 'double'},
            {'name': 'petal length (cm)', 'type': 'double'},
            {'name': 'petal width (cm)', 'type': 'double'}
        ]
    },
    client.repository.ModelMetaNames.OUTPUT_DATA_SCHEMA: {
        "id":"iris model",
        "fields": [
            {'name': 'iris_type', 'type': 'string','metadata': {'modeling_role': 'prediction'}}
        ]
    }
}

#Enregistrez le modèle. La valeur de retour contient les métadonnées du modèle créé
model_artifact = client.repository.store_model(model, meta_props=meta_props, training_data=X, training_target=y)
Supplément: méta-informations à inclure dans le modèle

Il n'est pas obligatoire de spécifier INPUT_DATA_SCHEMA et OUTPUT_DATA_SCHEMA dans les méta-informations meta_props à inclure dans le modèle, mais il est obligatoire si vous souhaitez spécifier l'exécution du test au format de formulaire sur l'écran des détails du déploiement après *** déploiement. Le format spécifié ici sera le format d'entrée du formulaire (point de dépendance) ***.

Comment vérifier le RUNTIME_UID qui peut être spécifié
La partie affichée dans GUID peut être spécifiée comme RUNTIME_UID dans meta_props.

python


# https://wml-api-pyclient-dev-v4.mybluemix.net/#runtimes
client.runtimes.list(limit=200)

output(CP4Dv2.En cas de 5)


    --------------------------  --------------------------  ------------------------  --------
    GUID                        NAME                        CREATED                   PLATFORM
    do_12.10                    do_12.10                    2020-05-03T08:35:16.679Z  do
    do_12.9                     do_12.9                     2020-05-03T08:35:16.648Z  do
    pmml_4.3                    pmml_4.3                    2020-05-03T08:35:16.618Z  pmml
    pmml_4.2.1                  pmml_4.2.1                  2020-05-03T08:35:16.590Z  pmml
    pmml_4.2                    pmml_4.2                    2020-05-03T08:35:16.565Z  pmml
    pmml_4.1                    pmml_4.1                    2020-05-03T08:35:16.537Z  pmml
    pmml_4.0                    pmml_4.0                    2020-05-03T08:35:16.510Z  pmml
    pmml_3.2                    pmml_3.2                    2020-05-03T08:35:16.478Z  pmml
    pmml_3.1                    pmml_3.1                    2020-05-03T08:35:16.450Z  pmml
    pmml_3.0                    pmml_3.0                    2020-05-03T08:35:16.422Z  pmml
    ai-function_0.1-py3.6       ai-function_0.1-py3.6       2020-05-03T08:35:16.378Z  python
    ai-function_0.1-py3         ai-function_0.1-py3         2020-05-03T08:35:16.350Z  python
    hybrid_0.2                  hybrid_0.2                  2020-05-03T08:35:16.322Z  hybrid
    hybrid_0.1                  hybrid_0.1                  2020-05-03T08:35:16.291Z  hybrid
    xgboost_0.90-py3.6          xgboost_0.90-py3.6          2020-05-03T08:35:16.261Z  python
    xgboost_0.82-py3.6          xgboost_0.82-py3.6          2020-05-03T08:35:16.235Z  python
    xgboost_0.82-py3            xgboost_0.82-py3            2020-05-03T08:35:16.204Z  python
    xgboost_0.80-py3.6          xgboost_0.80-py3.6          2020-05-03T08:35:16.173Z  python
    xgboost_0.80-py3            xgboost_0.80-py3            2020-05-03T08:35:16.140Z  python
    xgboost_0.6-py3             xgboost_0.6-py3             2020-05-03T08:35:16.111Z  python
    spss-modeler_18.2           spss-modeler_18.2           2020-05-03T08:35:16.083Z  spss
    spss-modeler_18.1           spss-modeler_18.1           2020-05-03T08:35:16.057Z  spss
    spss-modeler_17.1           spss-modeler_17.1           2020-05-03T08:35:16.029Z  spss
    scikit-learn_0.22-py3.6     scikit-learn_0.22-py3.6     2020-05-03T08:35:16.002Z  python
    scikit-learn_0.20-py3.6     scikit-learn_0.20-py3.6     2020-05-03T08:35:15.965Z  python
    scikit-learn_0.20-py3       scikit-learn_0.20-py3       2020-05-03T08:35:15.939Z  python
    scikit-learn_0.19-py3.6     scikit-learn_0.19-py3.6     2020-05-03T08:35:15.912Z  python
    scikit-learn_0.19-py3       scikit-learn_0.19-py3       2020-05-03T08:35:15.876Z  python
    scikit-learn_0.17-py3       scikit-learn_0.17-py3       2020-05-03T08:35:15.846Z  python
    spark-mllib_2.4             spark-mllib_2.4             2020-05-03T08:35:15.816Z  spark
    spark-mllib_2.3             spark-mllib_2.3             2020-05-03T08:35:15.788Z  spark
    spark-mllib_2.2             spark-mllib_2.2             2020-05-03T08:35:15.759Z  spark
    tensorflow_1.15-py3.6       tensorflow_1.15-py3.6       2020-05-03T08:35:15.731Z  python
    tensorflow_1.14-py3.6       tensorflow_1.14-py3.6       2020-05-03T08:35:15.705Z  python
    tensorflow_1.13-py3.6       tensorflow_1.13-py3.6       2020-05-03T08:35:15.678Z  python
    tensorflow_1.11-py3.6       tensorflow_1.11-py3.6       2020-05-03T08:35:15.646Z  python
    tensorflow_1.13-py3         tensorflow_1.13-py3         2020-05-03T08:35:15.619Z  python
    tensorflow_1.13-py2         tensorflow_1.13-py2         2020-05-03T08:35:15.591Z  python
    tensorflow_0.11-horovod     tensorflow_0.11-horovod     2020-05-03T08:35:15.562Z  native
    tensorflow_1.11-py3         tensorflow_1.11-py3         2020-05-03T08:35:15.533Z  python
    tensorflow_1.10-py3         tensorflow_1.10-py3         2020-05-03T08:35:15.494Z  python
    tensorflow_1.10-py2         tensorflow_1.10-py2         2020-05-03T08:35:15.467Z  python
    tensorflow_1.9-py3          tensorflow_1.9-py3          2020-05-03T08:35:15.435Z  python
    tensorflow_1.9-py2          tensorflow_1.9-py2          2020-05-03T08:35:15.409Z  python
    tensorflow_1.8-py3          tensorflow_1.8-py3          2020-05-03T08:35:15.383Z  python
    tensorflow_1.8-py2          tensorflow_1.8-py2          2020-05-03T08:35:15.356Z  python
    tensorflow_1.7-py3          tensorflow_1.7-py3          2020-05-03T08:35:15.326Z  python
    tensorflow_1.7-py2          tensorflow_1.7-py2          2020-05-03T08:35:15.297Z  python
    tensorflow_1.6-py3          tensorflow_1.6-py3          2020-05-03T08:35:15.270Z  python
    tensorflow_1.6-py2          tensorflow_1.6-py2          2020-05-03T08:35:15.243Z  python
    tensorflow_1.5-py2-ddl      tensorflow_1.5-py2-ddl      2020-05-03T08:35:15.209Z  python
    tensorflow_1.5-py3-horovod  tensorflow_1.5-py3-horovod  2020-05-03T08:35:15.181Z  python
    tensorflow_1.5-py3.6        tensorflow_1.5-py3.6        2020-05-03T08:35:15.142Z  python
    tensorflow_1.5-py3          tensorflow_1.5-py3          2020-05-03T08:35:15.109Z  python
    tensorflow_1.5-py2          tensorflow_1.5-py2          2020-05-03T08:35:15.079Z  python
    tensorflow_1.4-py2-ddl      tensorflow_1.4-py2-ddl      2020-05-03T08:35:15.048Z  python
    tensorflow_1.4-py3-horovod  tensorflow_1.4-py3-horovod  2020-05-03T08:35:15.019Z  python
    tensorflow_1.4-py3          tensorflow_1.4-py3          2020-05-03T08:35:14.987Z  python
    tensorflow_1.4-py2          tensorflow_1.4-py2          2020-05-03T08:35:14.945Z  python
    tensorflow_1.3-py2-ddl      tensorflow_1.3-py2-ddl      2020-05-03T08:35:14.886Z  python
    tensorflow_1.3-py3          tensorflow_1.3-py3          2020-05-03T08:35:14.856Z  python
    tensorflow_1.3-py2          tensorflow_1.3-py2          2020-05-03T08:35:14.829Z  python
    tensorflow_1.2-py3          tensorflow_1.2-py3          2020-05-03T08:35:14.799Z  python
    tensorflow_1.2-py2          tensorflow_1.2-py2          2020-05-03T08:35:14.771Z  python
    pytorch-onnx_1.2-py3.6      pytorch-onnx_1.2-py3.6      2020-05-03T08:35:14.742Z  python
    pytorch-onnx_1.1-py3.6      pytorch-onnx_1.1-py3.6      2020-05-03T08:35:14.712Z  python
    pytorch-onnx_1.0-py3        pytorch-onnx_1.0-py3        2020-05-03T08:35:14.682Z  python
    pytorch-onnx_1.2-py3.6-edt  pytorch-onnx_1.2-py3.6-edt  2020-05-03T08:35:14.650Z  python
    pytorch-onnx_1.1-py3.6-edt  pytorch-onnx_1.1-py3.6-edt  2020-05-03T08:35:14.619Z  python
    pytorch_1.1-py3.6           pytorch_1.1-py3.6           2020-05-03T08:35:14.590Z  python
    pytorch_1.1-py3             pytorch_1.1-py3             2020-05-03T08:35:14.556Z  python
    pytorch_1.0-py3             pytorch_1.0-py3             2020-05-03T08:35:14.525Z  python
    pytorch_1.0-py2             pytorch_1.0-py2             2020-05-03T08:35:14.495Z  python
    pytorch_0.4-py3-horovod     pytorch_0.4-py3-horovod     2020-05-03T08:35:14.470Z  python
    pytorch_0.4-py3             pytorch_0.4-py3             2020-05-03T08:35:14.434Z  python
    pytorch_0.4-py2             pytorch_0.4-py2             2020-05-03T08:35:14.405Z  python
    pytorch_0.3-py3             pytorch_0.3-py3             2020-05-03T08:35:14.375Z  python
    pytorch_0.3-py2             pytorch_0.3-py2             2020-05-03T08:35:14.349Z  python
    torch_lua52                 torch_lua52                 2020-05-03T08:35:14.322Z  lua
    torch_luajit                torch_luajit                2020-05-03T08:35:14.295Z  lua
    caffe-ibm_1.0-py3           caffe-ibm_1.0-py3           2020-05-03T08:35:14.265Z  python
    caffe-ibm_1.0-py2           caffe-ibm_1.0-py2           2020-05-03T08:35:14.235Z  python
    caffe_1.0-py3               caffe_1.0-py3               2020-05-03T08:35:14.210Z  python
    caffe_1.0-py2               caffe_1.0-py2               2020-05-03T08:35:14.180Z  python
    caffe_frcnn                 caffe_frcnn                 2020-05-03T08:35:14.147Z  Python
    caffe_1.0-ddl               caffe_1.0-ddl               2020-05-03T08:35:14.117Z  native
    caffe2_0.8                  caffe2_0.8                  2020-05-03T08:35:14.088Z  Python
    darknet_0                   darknet_0                   2020-05-03T08:35:14.059Z  native
    theano_1.0                  theano_1.0                  2020-05-03T08:35:14.032Z  Python
    mxnet_1.2-py2               mxnet_1.2-py2               2020-05-03T08:35:14.002Z  python
    mxnet_1.1-py2               mxnet_1.1-py2               2020-05-03T08:35:13.960Z  python
    --------------------------  --------------------------  ------------------------  --------

Il existe d'autres méta-informations qui peuvent être incluses dans meta_props, et il est généralement recommandé de les ajouter autant que possible car elles peuvent enregistrer dans quelles conditions le modèle créé a été créé.

Méta-informations qui peuvent être décrites dans meta_props
client.repository.ModelMetaNames.get()

output


['CUSTOM',
 'DESCRIPTION',
 'DOMAIN',
 'HYPER_PARAMETERS',
 'IMPORT',
 'INPUT_DATA_SCHEMA',
 'LABEL_FIELD',
 'METRICS',
 'MODEL_DEFINITION_UID',
 'NAME',
 'OUTPUT_DATA_SCHEMA',
 'PIPELINE_UID',
 'RUNTIME_UID',
 'SIZE',
 'SOFTWARE_SPEC_UID',
 'SPACE_UID',
 'TAGS',
 'TRAINING_DATA_REFERENCES',
 'TRAINING_LIB_UID',
 'TRANSFORMED_LABEL_FIELD',
 'TYPE']

Enregistrer le modèle (espace de déploiement)

Utilisez le client WML pour enregistrer le modèle dans l'espace de déploiement. Vous pouvez également enregistrer le modèle dans le projet d'analyse par l'opération ci-dessus, puis cliquer sur "Promouvoir" du modèle sur l'écran CP4D pour copier et enregistrer le modèle du projet d'analyse dans l'espace de déploiement. Devenir.

#Basculer vers l'espace de déploiement (uniquement si vous devez basculer)
client.set.default_space(space_id)

#Décrire les méta-informations du modèle
model_name = "sample_iris_model"
meta_props={
    client.repository.ModelMetaNames.NAME: model_name,
    client.repository.ModelMetaNames.RUNTIME_UID: "scikit-learn_0.22-py3.6",
    client.repository.ModelMetaNames.TYPE: "scikit-learn_0.22",
    client.repository.ModelMetaNames.INPUT_DATA_SCHEMA:{
        "id":"iris model",
        "fields":[
            {'name': 'sepal length (cm)', 'type': 'double'},
            {'name': 'sepal width (cm)', 'type': 'double'},
            {'name': 'petal length (cm)', 'type': 'double'},
            {'name': 'petal width (cm)', 'type': 'double'}
        ]
    },
    client.repository.ModelMetaNames.OUTPUT_DATA_SCHEMA: {
        "id":"iris model",
        "fields": [
            {'name': 'iris_type', 'type': 'string','metadata': {'modeling_role': 'prediction'}}
        ]
    }
}

#Enregistrez le modèle. La valeur de retour contient les métadonnées du modèle créé
model_artifact = client.repository.store_model(model, meta_props=meta_props, training_data=X, training_target=y)

En complément, les méta-informations à inclure dans meta_props sont les mêmes que ["Supplement: Meta information to be included in the model"](# Supplement-Meta information to be included in the model), veuillez donc vous y référer.

L'ID du modèle enregistré est contenu dans la valeur de retour model_artifact. Vous aurez besoin de l'ID lorsque vous créez le déploiement. Extrayez l'ID comme indiqué ci-dessous.

Obtenir l'ID à partir de la valeur de retour


model_id = client.repository.get_model_uid(model_artifact)

Obtenir l'ID de la valeur de retour (une autre méthode)


model_id = model_artifact['metadata']['guid']

Liste des modèles (projet d'analyse)

#Passer à un projet d'analyse (uniquement si vous devez basculer)
client.set.default_project(project_id)

#Afficher une liste de modèles
client.repository.list_models()

Modèles de liste (espace de déploiement)

Utilisez le client WML.

#Basculer vers l'espace de déploiement (uniquement si vous devez basculer)
client.set.default_space(space_id)

#Afficher une liste de modèles
client.repository.list_models()

Opérations de déploiement (espace de déploiement uniquement)

Utilisez le client WML. Il existe deux types de déploiement, le type Batch et le type Online. L'ID du modèle à déployer est donné à créer à créer.

Création d'un déploiement (type en ligne)

Déploiement de type en ligne


dep_name = "sample_iris_online"
meta_props = {
    client.deployments.ConfigurationMetaNames.NAME: dep_name,
    client.deployments.ConfigurationMetaNames.ONLINE: {}
}

deployment_details = client.deployments.create(model_id, meta_props=meta_props)

Le déploiement prend moins d'une minute, mais si vous voyez la sortie suivante, le déploiement est réussi.

output


#######################################################################################

Synchronous deployment creation for uid: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' started

#######################################################################################
    
initializing
ready
        
------------------------------------------------------------------------------------------------
Successfully finished deployment creation, deployment_uid='yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
------------------------------------------------------------------------------------------------

L'ID du déploiement créé peut être récupéré à partir de la valeur de retour comme suit.

#ID du déploiement de type EN LIGNE
dep_id_online = deployment_details['metadata']['guid']

Création d'un déploiement (type Batch)

Déploiement de type batch


dep_name = "sample_iris_batch"
meta_props = {
    client.deployments.ConfigurationMetaNames.NAME: dep_name,
    client.deployments.ConfigurationMetaNames.BATCH: {},
    client.deployments.ConfigurationMetaNames.COMPUTE: {
        "name": "S",
        "nodes": 1
    }
}

deployment_details = client.deployments.create(model_id, meta_props=meta_props)

Si «Successfully» s'affiche, le déploiement est réussi. L'ID du déploiement créé peut être récupéré à partir de la valeur de retour comme suit.

#ID du déploiement de type BATCH
dep_id_batch = deployment_details['metadata']['guid']

Répertorier les déploiements

Cela utilise également le client WML.

#Afficher une liste de déploiements
client.deployments.list()

Exécution du déploiement (type en ligne)

Lors de l'exécution d'un déploiement en ligne, vous créez des données d'entrée (format JSON) pour le scoring, les lancez au déploiement dans REST et recevez le résultat de la prédiction. Commencez par créer des exemples de données d'entrée.

Générer des exemples de données d'entrée pour l'exécution de la notation


# sample data for scoring (setosa)
scoring_x = pd.DataFrame(
    data = [[5.1,3.5,1.4,0.2]],
    columns=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']
)

values = scoring_x.values.tolist()
fields = scoring_x.columns.values.tolist()
scoring_payload = {client.deployments.ScoringMetaNames.INPUT_DATA: [{'fields': fields, 'values': values}]}
scoring_payload

output


{'input_data': [{'fields': ['sepal length (cm)',
    'sepal width (cm)',
    'petal length (cm)',
    'petal width (cm)'],
   'values': [[5.1, 3.5, 1.4, 0.2]]}]}

Il existe deux façons d'effectuer un déploiement en ligne: le client WML et les requêtes.

Effectuer un scoring en ligne avec WMLclient


prediction = client.deployments.score(dep_id_online, scoring_payload)
prediction

output


{'predictions': [{'fields': ['prediction', 'probability'],
   'values': [[0, [0.8131726303900102, 0.18682736960998966]]]}]}

Un exemple d'exécution de requêtes peut être utilisé en copiant à partir de l'extrait de code sur l'écran des détails de déploiement de l'écran CP4D. mltoken est un jeton d'authentification API, `` jeton '' obtenu à partir de la variable d'environnement OS USER_ACCESS_TOKEN dans [Initialisation du client WML (authentification)](# authentification d'initialisation du client WML) au début de cet article. Vous pouvez utiliser «tel quel. Lors de l'exécution à partir d'un environnement extérieur à CP4D, [Obtention d'un jeton au porteur dans le manuel du produit CP4D](https://www.ibm.com/support/knowledgecenter/ja/SSQNUZ_2.5.0/wsj/analyze-data/ Exécutez ml-authentication-local.html) et obtenez-le à l'avance.

import urllib3, requests, json

# token = "XXXXXXXXXXXXXXXXXX"
# url = "https://cp4d.host.name.com"
header = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token}
dep_url = url + "/v4/deployments/" + dep_id_online + "/predictions"

response = requests.post(dep_url, json=scoring_payload, headers=header)
prediction = json.loads(response.text)
prediction

output


{'predictions': [{'fields': ['prediction', 'probability'],
   'values': [['setosa', [0.9939393939393939, 0.006060606060606061, 0.0]]]}]}

Si votre domaine CP4D utilise un certificat auto-signé et que requests.post échoue la vérification de certificat, vous pouvez temporairement l'éviter en utilisant les options verify = False '' '' dans requests.post. À utiliser à vos risques et périls.

Exécution du déploiement (type Batch)

Lors de l'exécution d'un déploiement de type Batch, le fichier CSV qui sera les données d'entrée est enregistré à l'avance dans l'actif de données de l'espace de déploiement, et le href de cet actif de données est spécifié.

Préparation des données d'entrée


#Conversion CSV des 5 premières lignes de données d'entraînement Iris X comme exemple
X.head(5).to_csv("iris_test.csv")

#Basculer vers l'espace de déploiement (uniquement si vous devez basculer)
client.set.default_space(space_id)

#Inscription aux actifs de données
asset_details = client.data_assets.create(name="iris_test.csv",file_path="/home/wsuser/work/iris_test.csv")
asset_href = client.data_assets.get_href(asset_details)

Exécution de la notation par lots


#Créer des méta-informations pour la tâche d'exécution
job_payload_ref = {
    client.deployments.ScoringMetaNames.INPUT_DATA_REFERENCES: [{
        "location": {
            "href": asset_href
        },
        "type": "data_asset",
        "connection": {}
    }],
    client.deployments.ScoringMetaNames.OUTPUT_DATA_REFERENCE: {
        "location": {
            "name": "iris_test_out_{}.csv".format(dep_id_batch),
            "description": "testing csv file"
        },
        "type": "data_asset",
        "connection": {}
    }
}

#Exécution par lots(create_Sera exécuté lorsque vous travaillez)
job = client.deployments.create_job(deployment_id=dep_id_batch, meta_props=job_payload_ref)
job_id = client.deployments.get_job_uid(job)

Vous pouvez vérifier l'état du résultat de l'exécution avec le code suivant. Si vous souhaitez l'intégrer dans votre programme, il est conseillé d'exécuter la boucle jusqu'à ce que l'état soit complet.

#Vérifier l'état des travaux d'exécution par lots
client.deployments.get_job_status(job_id)

output


#Si vous courez
{'state': 'queued', 'running_at': '', 'completed_at': ''}

#Lorsque l'exécution est terminée
{'state': 'completed',
 'running_at': '2020-05-28T05:43:22.287357Z',
 'completed_at': '2020-05-28T05:43:22.315966Z'}

c'est tout. Vous pouvez également enregistrer et déployer des fonctions Python, mais je les ajouterai ou les écrirai dans un autre article si j'en ai l'occasion.


(Ajouté le 1er juin 2020) Le référentiel Git suivant contient un exemple de bloc-notes de modèles et de déploiements pouvant être utilisés avec CP4D v3.0. https://github.ibm.com/GREGORM/CPDv3DeployML

Recommended Posts

Exemple d'opération d'objet Cloud Pak for Data en Python (client WML, project_lib)
Déployez des fonctions avec Cloud Pak for Data
Éliminez les caractères japonais brouillés dans les graphiques matplotlib avec Cloud Pak for Data Notebook
Afficher la bougie de données FX (forex) en Python
Enregistrez les données pandas dans des actifs de données au format Excel avec Cloud Pak for Data (Watson Studio)
Créez votre propre Big Data en Python pour validation
Nettoyer l'espace de déploiement Cloud Pak for Data
Générez Word Cloud à partir de données de cas d'essai avec python3
Orienté objet en python
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Code Python pour l'écriture de données CSV dans le stockage d'objets DSX
Obtenez des données de l'API d'analyse avec le client API Google pour python
Gérer les données ambiantes en Python
Python pour l'analyse des données Chapitre 4
Méthodes d'objet chaîne en Python
Afficher les données UTM-30LX en Python
Comparaison d'objets nuls en Python
Techniques de tri en Python
Python pour l'analyse des données Chapitre 2
À propos de "for _ in range ():" de python
Python pour l'analyse des données Chapitre 3
Installer Networkx dans l'environnement Python 3.7 pour une utilisation dans les livres de science des données sur les logiciels malveillants
Fichier journal de sortie avec Job (Notebook) de Cloud Pak for Data
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment