Certification DP-100 Designing and Implementing a Data Science Solution on Azure (2/4)

Suite à mon premier article sur le nouveau programme 2020 de cette certification Microsoft, je continue à décrire les différents outils présents dans le nouveau studio Azure Machine Learning, en suivant le plan donnée par le programme de la certification. Attention, le contenu peut ne pas être exhaustif comme le rappelle la mention “may include but is not limited to“.

Run experiments and train models

Create models by using Azure Machine Learning Designer

Le Concepteur (ou Designer en anglais) n’est accessible qu’avec la licence Enterprise et correspond à l’ancien portail Azure Machine Learning Studio. La documentation complète est disponible ici.

Nous cliquons ensuite sur le bouton « + » pour démarrer une nouvelle expérimentation. Mais il sera très intéressant regarder les différents exemples disponibles, en cliquant sur « afficher plus d’échantillons ».

May include but is not limited to:

• create a training pipeline by using Designer

La première chose à paramétrer est l’association de l’expérience avec une cible de calcul de type « cluster d’entrainement ».

Nous utiliserons ensuite les modules disponibles dans le menu latéral de gauche.

Ces modules nous permettront de construire un « pipeline » dont la structure classique est décrite par le schéma ci-dessous.

• ingest data in a Designer pipeline

La première étape consiste à désigner les données qui serviront à l’expérience. Nous choisissons pour cet exemple le jeu de données « German Credit Card UCI dataset » en réalisant un glisser-déposer du module de la catégorie Datasets > Samples.

Les jeux de données préalablement chargés à partir des magasins de données sont quant à eux disponibles dans Datasets > My Datasets.

Le module « Import Data » permet de se connecter directement à une URL via HTTP ou bien à un magasin de données.

Il est enfin possible de charger des données manuellement à l’aide du module « Enter Data Manually ».

Ces deux dernières méthodes ne sont pas recommandées, il est préférable de passer par la création propre d’un jeu de données dans le menu dédié.

Afin de bien appréhender le jeu de données, nous ajoutons temporairement un composant « Summarize Data », de la catégorie Statistical Functions. Les deux modules doivent être reliés l’un à l’autre, en glissant la sortie du précédent vers l’entrée du suivant.

Nous cliquons sur le bouton « Envoyer » pour exécuter ce premier pipeline.

Un nom doit être donné à l’expérience (entre 2 et 36 caractères, sans espace ni caractères spéciaux hormis les tirets haut et bas).

Au cours de l’exécution, une vue d’ensemble est disponible.

Depuis le menu Calcul, un graphique résume l’état des nœuds du cluster d’entrainement.

Une fois les étapes validées (coche verte sur chaque module), les sorties et journaux d’exécution sont accessibles. Le symbole du diagramme en barres donne accès aux indicateurs de centrage et de dispersion sur les différentes variables.

• use Designer modules to define a pipeline data flow

Nous recommandons d’utiliser l’édition des métadonnées pour identifier la variable jouant le rôle de label. Cette astuce permettra par la suite de conserver un paramétrage des modules utilisant la colonne de type « label ». Il sera également possible de désigner toutes les autres colonnes du jeu de données par « all features » dans les boîtes de dialogue de sélection.

Pour une variable binaire dans la cadre d’une classification, la variable est également déclarée comme catégorielle.

Nous construisons ensuite un pipeline classique de la sorte :

Une fois un modèle entrainé avec succès, un nouveau bouton apparaît en haut à droite de l’écran.

Nous créons un pipeline d’inférence en temps réel pour obtenir un service Web prédictif à partir de notre modèle. Des modules d’input ou d’output sont automatiquement ajoutés.

Il est alors nécessaire d’exécuter une nouvelle fois le pipeline pour ensuite publier le service d’inférence. Le bouton « déployer » est ensuite accessible.

Une fois le déploiement réussi avec succès, le point de terminaison (“endpoint“) est visible dans le menu dédié.

Nous retrouvons dans les écrans dédiés l’URL du point qui donnera accès aux prévisions. Il s’agit d’une API REST, sous la forme suivante :

http://XXX.XXX.XXX.XXX:80/api/v1/service/german-credit-classification-rea/score

Une fenêtre de test facilite la soumission de nouvelles données.

L’onglet “consommer” donne enfin des exemples de codes prêts à l’emploi en C#, Python ou R, ainsi qu’un mécanisme de sécurité basé sur des clés ou jetons d’authentification.

• use custom code modules in Designer

Des modules personnalisés peuvent être intégrés dans le pipeline, en langage R ou Python.

Les modules de script disposent d’entrées et de sorties, accessibles au travers de noms de variables réservés.

Ainsi, pour un script R personnalisé, le modèle de code généré est une structure de fonction :

# R version: 3.5.1

azureml_main <- function(dataframe1, dataframe2){
   print("R script run.")

 # If a zip file is connected to the third input port, it is
   # unzipped under "./Script Bundle". This directory is added
   # to sys.path.
 # Return datasets as a Named List

   return(list(dataset1=dataframe1, dataset2=dataframe2))
 }

Les entrées 1 & 2 sont identifiées respectivement sous les noms dataframe1 et dataframe2.

Les deux sorties sont par défaut nommées dataset1 et dataset2 et retournées sous forme d’une liste de deux éléments. Il est possible de modifier ces noms même si cela n’est pas conseillé.

Pour nommer les colonnes du jeu de données German Credit Card, nous utilisons le code R suivant :

azureml_main <- function(dataframe1, dataframe2){
   print("R script run.")

   colnames(dataframe1) = c("chk_acct", "duration", "credit_his", "purpose", "amount", "saving_acct", "present_emp", "installment_rate", "sex", "other_debtor", "present_resid", "property", "age", "other_install", "housing", "n_credits", "job", "n_people", "telephone", "foreign", "response")

 # Return datasets as a Named List
   return(list(dataset1=dataframe1, dataset2=dataframe2))

La troisième entrée du module est dédiée à un fichier zip contenant des librairies supplémentaires. Ces packages doivent être au préalable installer sur un poste local, généralement dans le répertoire :

C:\Users\[user]\Documents\R\win-library\3.2

Créer un dossier contenant les sous-dossiers des packages transformés en archives (.zip) puis réaliser une nouvelle archive .zip à partir de ce dossier. Importer ensuite l’archive obtenu comme un jeu de données. Le module obtenu sera raccordé à la troisième entrée du module Execute R/Python Script : Script Bundle (Zip).

Pour les scripts Python, nous disposons également d’un module permettant de créer un modèle d’apprentissage qui sera ensuite connecté à un module « Train Model ».

Le code Python à rédiger se base sur les packages pandas et scikit-learn et doit s’intégrer dans le modèle suivant :

import pandas as pd
from sklearn.linear_model import LogisticRegression

class AzureMLModel:

     # The init method is only invoked in module "Create Python Model",
     # and will not be invoked again in the following modules "Train Model" and "Score Model".
     # The attributes defined in the init method are preserved and usable in the train and predict method.
     def init(self):
         # self.model must be assigned
         self.model = LogisticRegression()
         self.feature_column_names = list()

     # Train model
     #   Param: a pandas.DataFrame
     #   Param: a pandas.Series
     def train(self, df_train, df_label):
         # self.feature_column_names record the names of columns used for training
         # It is recommended to set this attribute before training so that later the predict method
         # can use the columns with the same names as the train method
         self.feature_column_names = df_train.columns.tolist()
         self.model.fit(df_train, df_label)

     # Predict results
     #   Param: a pandas.DataFrame
     #   Must return a pandas.DataFrame
     def predict(self, df):
         # Predict using the same column names as the training
         return pd.DataFrame({'Scored Labels': self.model.predict(df[self.feature_column_names])})

Le modèle utilisé peut être remplacé dans la fonction __init__. Les variables en entrée du modèle peuvent être également listées dans cette fonction.

Certification DP-100 Designing and Implementing a Data Science Solution on Azure (1/4)

Cette certification Microsoft a vu son contenu complètement remis à jour au 22 janvier 2020. Le contenu tourne maintenant exclusivement autour de Azure Machine Learning Service. Mais ce service Azure et son portail d’accès (dit le « studio ») regorgent d’outils aussi bien graphiques (Designer, Automated ML) que destinés au code (SDK et la librairie azureml.core). Dans cet article, je vous propose mes notes préparatoires à cette certification, en conservant la terminologie d’origine et non la traduction française car la certification se passe en anglais.

A la question qui m’est fréquemment posée sur les conseils pour réussir les certifications Microsoft, je réponds toujours : de la pratique, de la pratique et encore de la pratique. Prenez également soin de noter les noms des différents services ainsi qu’une courte définition de leurs rôles respectifs.

Page d’accueil de la certification DP-100

Si vous n’avez jamais passé de certifications Microsoft, sachez qu’il s’agit essentiellement de QCM et que vous pourrez revenir en arrière sur la plupart des questions, à l’exception des « Yes/No questions ».

La formulation « May include but is not limited to» qui revient tout au long du programme de la certification met en garde sur le fait que certaines questions pourront sortir de cette liste.

Set up an Azure Machine Learning workspace (30-35%)

Create an Azure Machine Learning workspace

May include but is not limited to:

create an Azure Machine Learning workspace

Le workspace (ou espace de travail) désigne la ressource Azure qu’il est nécessaire de créer afin d’accéder aux fonctionnalités d’Azure ML Service et en particulier au portail encore appelé « studio ». Ce dernier est aussi accessible depuis l’URL https://ml.azure.com/ et attend votre identifiant et mot de passe reconnu par Azure Active Directory.

Le terme « studio » peut porter à confusion car la première ébauche du Designer s’est appelée Azure Machine Learning à sa création, puis Azure Machine Learning Studio. Il est encore possible de s’inscrire sur cette ressource renommée « classic » et accessible sur l’URL https://studio.azureml.net/ sans inscription préalable sur le portail Azure. Cette interface correspond aujourd’hui au Designer (Concepteur en français) qui s’est lui-même rapidement appelé « Visual interface ».

Azure Machine Learning Studio (classic)

Depuis la Marketplace Azure, dans la catégorie AI + Machine Learning, rechercher le service « Machine Learning ».

Ressource Azure Machine Learning

Aucun paramétrage particulier si ce n’est le choix de la licence entre Basic et Enterprise. Nous indiquerons plus tard les fonctionnalités uniquement disponibles en version Enterprise.

Création de la ressource

A noter que la création de cette ressource engendrera la création simultanée :

  • d’un compte de stockage (Azure Storage)
  • d’un coffre fort (Azure Key Vault)
  • d’un outil de monitoring (Azure Application Insights)

Par la suite, de nouveaux services pourront être ajoutés, pour l’exposition des services prédictifs :

  • Azure Container Instance
  • Azure Kubernetes Service
Lien vers le portail

configure workspace settings

Le menu latéral de l’interface Azure donne les entrées classiques d’une ressource. Le groupe de fonctionnalités Assets correspond à l’ensemble des manipulations qui pourront être faites depuis le portail dédié.

On définira en particulier l’accès des autres personnes à la ressource en configurant l’Access Control (IAM).

Access Control (IAM)

Il est également possible de télécharger un fichier de configuration JSON dont nous comprendrons l’intérêt lorsque nous réaliserons des interactions avec les fonctionnalités depuis un script.

Celui-ci contient les informations suivantes :

{
  "subscription_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX", 
  "resource_group": "YYYYYYYYY",
  "workspace_name": "ZZZZZZZZZ" 
}   

    Enfin, La page de la ressource Azure donne le lien vers le studio et lancera le portail dédié dans un nouvel onglet du navigateur.

Connexion au portail Azure Machine Learning studio

manage a workspace by using Azure Machine Learning Studio

A partir de cet item du programme, nous passons sur le portail (dit « studio »), à ce jour (février 2020) toujours en préversion. La barre latérale permet de naviguer dans les différentes parties du studio dont deux uniquement sont exclusives à la licence Enterprise : Automated ML et Designer.

Les seuls paramètres disponibles concernent la langue d’affichage et les formats régionaux. Pour préparer la certification, nous recommandons d’utiliser l’anglais pour l’interface.

Si l’on dispose de plusieurs ressources Azure ML Service, sur une ou plusieurs souscriptions, il sera possible de passer de l’une à l’autre sans quitter le portail.

Manage data objects in an Azure Machine Learning workspace

May include but is not limited to:

register and maintain data stores

Les data stores sont des sources de données répertoriées dans le but de mettre ensuite à disposition des datasets.

La création d’un nouveau datastore se fait à partir de l’écran ci-dessous, pour l’instant uniquement à partir de ressources Azure de type compte de stockage (Blob, file share ou Data Lake) ou service managé de bases de données (SQL DB, PostgreSQL ou MySQL).

Les informations habituelles d’authentification seront attendues. Il n’est pas possible à ce jour de pointer vers un coffre-fort de type Azure Key Vault déjà paramétré.

Pour le paramétrage d’un compte de stockage, il faudra descendre du niveau du container, c’est-à-dire le premier niveau d’organisation des données.

L’étape suivante de création d’un jeu de données sera indispensable pour donner réellement accès aux données depuis les interfaces de traitement.

create and manage datasets

Les datasets (jeux de données) sont également créés depuis le menu latéral.

Cliquer ici sur le bouton « Create dataset ».

Les datasets sont issus des data sources définis préalablement (« from datastore ») mais peuvent aussi venir d’autres sources :

  • Fichiers locaux
  • Fichiers disponibles au travers d’une URL Web
  • Jeux de données issus d’Azure Open Datasets

Cette initiative de Microsoft met à disposition des jeux de données Open Data, très utiles pour tester rapidement un algorithme et prendre en main l’interface. J’utilise dans les exemples ci-dessous le jeu de données « diabetes ».

Une fois le jeu de données chargé, de nombreuses fonctionnalités sont disponibles.

Les datasets sont tout d’abord versionnés, il est donc possible de revenir à une version précédemment chargée.

Le bouton Refresh réalise l’actualisation du jeu de données.

La génération du profil (« Generate profile ») demande une ressource de calcul de type « training cluster » (voir ci-après).

La génération du profil est considérée comme « le run d’une experiment », notion qui sera revue plus tard.

Une fois la préparation terminée, le menu Explore donne les informations suivantes par variables :

  • Distribution
  • Type (string, integer, etc.)
  • Min, Max
  • Count, Missing count, Empty count, Error count

La fonctionnalité Unregister supprime simplement le jeu de données de l’interface, mais le datastore correspond est conservé.

Le menu Consume est particulièrement pratique puisqu’il donne les lignes de script Python permettant de charger le jeu de données sous forme de pandas dataframe.

Le menu Explore donne également un aperçu des lignes du jeu de données.

Le menu Models ne sera renseigné que lorsqu’un premier modèle aura été entrainé à partir du jeu de données.

Enfin, il reste une fonctionnalité très prometteuse : Datasets monitor. Si j’interprète bien la documentation, il s’agira de détecter l’éventuelle dérive prédictive d’un modèle de Machine Learning (ce que l’on nomme parfois silent failure).

Le monitoring peut être défini à des fréquentes quotidienne, hebdomadaire ou mensuelle.

Les alertes sont envoyées à une adresse email en cas de dépassement d’un seuil défini arbitrairement.

Manage experiment compute contexts

May include but is not limited to:

create a compute instance

Les cibles de calcul sont indispensables pour le lancement de tout traitement, quelque-soit l’outil mis en œuvre (notebook, pipeline, endpoint…). C’est aussi ce qui induit sur la facturation du service Azure. Tant que le service Azure Machine Learning est en préversion, il n’existe pas de coefficient multiplicateur sur le montant associé à la ressource de calcul.

Les compute instances (instance de calcul) remplacent dorénavant les « notebooks VM » comme annoncé ici.

Une instance de calcul se paramètre de la manière suivante :

Les instances de calcul disposent d’environnements et d’outils déjà installés pour R et Python, et en particulier le SDK Python d’Azure Machine Learning. Nous évoquerons ce SDK au cours des prochains points de cette préparation. Nous trouvons ainsi un raccourci pour lancer RStudio et deux autres pour Jupyter et JupyterLab sur lesquelles le kernel Python 3 sera disponible.

Pensez à arrêter vos instances de calcul une fois que vous ne les utilisez plus, afin d’arrêter la facturation (hormis celle associée au disque).

determine appropriate compute specifications for a training workload

Le tableau suivant, issu de la documentation officielle Microsoft, donne les correspondances entre les cibles de calcul et les différentes approches permettant de réaliser du Machine Learning.

Nous reviendrons plus tard sur la notion de pipeline. Celle-ci peut être comprise comme la succession d’étapes nécessaires dans un projet de Machine Learning : préparation des données (sélection des variables, normalisation…), entrainement du modèle, calcul des métriques d’évaluation, etc.

Les cibles de calcul doivent être différenciées des cibles de déploiement dont le rôle sera de porter le modèle prédictif une fois que celui-ci aura été entrainé et validé.

create compute targets for experiments and training

Un training cluster est un environnement managé constitué d’un ou plusieurs nœuds, qui ne sont autres que des machines virtuelles, dont les caractéristiques seront choisies lors de la création du training cluster. La documentation complète est disponible ici.

Le nouveau cluster apparaît alors dans la liste des ressources de calcul disponibles.

A l’inverse d’une instance de calcul, le training cluster ne peut être éteint mais il passera par différents états. En cliquant sur le nom du cluster, nous accédons aux compute details qui donnent en particulier l’état du cluster :

  • Idle
  • Leaving
  • Preparing
  • Running
  • Preempted
  • Unsuable

L’état Idle (inactif) correspond à l’état lorsque le cluster est arrêté.

Enfin, le menu attached compute permet d’associer une ressource Azure déjà créée et de l’utiliser ainsi pour des tâches réalisées dans Azure Machine Learning. Seules les machines virtuelles Linux Ubuntu sont supportées. Il est ainsi possible d’exploiter l’image Data Science Virtual Machine, préconfigurée avec les principaux packages utilisés en Data Science, et récemment mise à jour (fin 2019).

Afin de terminer le tour de ce menu, nous évoquons les cibles de déploiement que sont les inference clusters. Ceux-ci servirontpour supporter les Web services Web prédictifs, une fois qu’un modèle aura été entrainé et déployé. Ces clusters sont basés sur le service managé Kubernetes d’Azure et créeront une ressource correspondante dans le groupe de ressources contenant l’espace de travail Azure Machine Learning. Nous aborderons ce point dans le 4e chapitre de la préparation à cette certification.

En version Dev-test, un seul nœud est proposé contre 3 minimum pour un cluster de production.

Nous terminons ici le premier chapitre du programme de la certification DP-100, nouvelle version. Celui-ci a permis de découvrir l’environnement de travail, les principales configurations et la mise à disposition des données, accompagnées par des ressources de calcul. Maintenant, il va être temps de coder !