1. Introduction
Dans cet atelier de programmation, vous allez créer un modèle de machine learning (ML) dans BigQuery et obtenir des prédictions à partir de ce modèle à l'aide du SDK ABAP pour Google Cloud.
Vous allez utiliser les services Google Cloud suivants:
- BigQuery
- Cloud Shell
Ce que vous allez faire
Vous allez créer les éléments suivants:
- Un modèle BigQuery Machine Learning (ML).
- Un compte de service disposant du rôle Utilisateur de job BigQuery pour appeler l'API BigQuery.
- Un programme ABAP permettant d'appeler l'API BigQuery et d'obtenir des prédictions à partir du modèle ML.
2. Conditions requises
- Un navigateur (Chrome ou Firefox, par exemple)
- Un projet Google Cloud pour lequel la facturation est activée ou créez un compte d'essai sans frais de 90 jours pour Google Cloud Platform.
- Interface utilisateur graphique SAP (Windows ou Java) installée sur votre système. Si l'interface utilisateur SAP est déjà installée sur votre ordinateur portable, connectez-vous à SAP à l'aide de l'adresse IP externe de la VM comme adresse du serveur d'applications. Si vous utilisez un Mac, vous pouvez également installer la GUI SAP pour Java disponible sur ce lien.
3. Avant de commencer
- Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud (par exemple,
abap-sdk-poc
). - Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet. Ignorez cette étape si vous utilisez un compte avec essai sans frais de 90 jours.
- Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud.
- Dans la console Cloud, cliquez sur Activer Cloud Shell en haut à droite:
- Exécutez les commandes suivantes dans Cloud Shell pour vous authentifier pour votre compte et définir le projet par défaut sur
abap-sdk-poc
. La zoneus-west4-b
est utilisée comme exemple. Si nécessaire, veuillez modifier le projet et la zone dans les commandes suivantes en fonction de vos préférences.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- Vous devez avoir accès à un système SAP sur lequel le SDK ABAP pour Google Cloud est installé.
- Vous devez terminer l'atelier de programmation 1 (Installer la version d'essai de la plate-forme ABAP 1909 sur Google Cloud Platform et installer le SDK ABAP pour Google Cloud) et l'atelier de programmation 2 (Configurer l'authentification du SDK ABAP à l'aide de jetons pour SAP hébergé sur une VM Compute Engine) avant de poursuivre cet atelier de programmation.
- Si vous avez terminé les ateliers de programmation 1 et 2, vous avez alors reçu un système ABAP Platform Trial 1909 sur Google Cloud, ainsi que la configuration requise pour l'authentification et la connectivité.
- Si vous n'avez pas terminé les ateliers de programmation 1 et 2, vous ne disposerez pas de l'infrastructure et de la connectivité requises pour suivre les étapes de cet atelier. Vous devez donc suivre les ateliers de programmation 1 et 2 avant de commencer celui-ci.
4. Activer la version 2 de l'API BigQuery dans votre projet Google Cloud
- Dans la console Cloud, cliquez sur Activer Cloud Shell en haut à droite:
- Exécutez les commandes suivantes dans Cloud Shell pour activer l'API BigQuery:
gcloud services enable bigquery.googleapis.com
Si l'exécution réussit, un message comme celui ci-dessous devrait s'afficher.
L'API BigQuery devrait maintenant être activée dans votre projet Google Cloud.
5. Créer un compte de service pour sécuriser l'accès à BigQuery
Pour obtenir des prédictions de ML de manière sécurisée à partir d'un modèle BigQuery ML, vous devez créer un compte de service avec les rôles Utilisateur de tâche BigQuery et Lecteur de données BigQuery, qui permettront à votre programme d'exécuter des requêtes (en tant que tâches) dans le projet et de lire les données des tables. Ce rôle n'accorde que les autorisations nécessaires pour créer des tâches et lire des données, ce qui réduit les risques de sécurité.
Créer un compte de service
Pour créer un compte de service avec le rôle requis, procédez comme suit:
- Exécutez la commande suivante dans le terminal Cloud Shell :
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
- Ajoutez maintenant les rôles requis au compte de service créé à l'étape précédente:
gcloud projects add-iam-policy-binding abap-sdk-poc --member='serviceAccount:abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com' --role='roles/bigquery.jobUser'
gcloud projects add-iam-policy-binding abap-sdk-poc --member='serviceAccount:abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com' --role='roles/bigquery.dataViewer'
La commande ci-dessus utilise abap-sdk-poc
comme espace réservé pour le projet Google Cloud. Remplacez abap-sdk-poc
par l'ID de votre projet.
- Pour vérifier que le rôle a bien été ajouté, accédez à la page IAM. Le compte de service que vous avez créé doit être listé avec le rôle qui lui a été attribué.
6. Créer un modèle BigQuery Machine Learning
Dans cet atelier de programmation, nous allons créer un modèle de k-moyennes pour regrouper l'ensemble de données sur les locations de vélos à Londres. Vous pouvez appliquer l'algorithme k-moyennes pour regrouper vos données en clusters. Contrairement au machine learning supervisé, qui permet d'effectuer des analyses prédictives, l'apprentissage non supervisé permet d'obtenir des analyses descriptives. L'objectif est de comprendre vos données afin de prendre des décisions en conséquence.
Créer votre ensemble de données
Pour créer un ensemble de données BigQuery dans lequel stocker votre modèle de ML, procédez comme suit:
- Dans la console Google Cloud, accédez à la page "BigQuery". Accéder à la page "BigQuery"
- Dans le volet Explorateur, cliquez sur le nom de votre projet.
- Cliquez sur
Afficher les actions > Créer un ensemble de données.
- Sur la page Créer un ensemble de données, procédez comme suit :
- Dans le champ ID de l'ensemble de données, saisissez
bqml_tutorial
. - Pour Type d'emplacement, sélectionnez Multirégional, puis UE (plusieurs régions dans l'Union européenne). L'ensemble de données public "London Bicycle Hires" est stocké dans l'emplacement multirégional de l'UE. Votre ensemble de données doit être stocké dans le même emplacement.
- Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.
Créer un modèle de k-moyennes
Maintenant que votre ensemble de données est configuré, l'étape suivante consiste à créer un modèle de k-moyennes à l'aide des données. Vous pouvez créer et entraîner un modèle de k-moyennes à l'aide de l'instruction CREATE MODEL avec l'option model_type=kmeans
.
Pour exécuter la requête et créer un modèle de k-moyennes, procédez comme suit:
- Accédez à la page BigQuery. Accéder à BigQuery
- Dans le volet de l'éditeur, exécutez l'instruction SQL suivante :
CREATE OR REPLACE MODEL `bqml_tutorial.london_station_clusters` OPTIONS(model_type='kmeans', num_clusters=4) AS WITH hs AS ( SELECT h.start_station_name AS station_name, IF (EXTRACT(DAYOFWEEK FROM h.start_date) = 1 OR EXTRACT(DAYOFWEEK FROM h.start_date) = 7, "weekend", "weekday") AS isweekday, h.duration, ST_DISTANCE(ST_GEOGPOINT(s.longitude, s.latitude), ST_GEOGPOINT(-0.1, 51.5))/1000 AS distance_from_city_center FROM `bigquery-public-data.london_bicycles.cycle_hire` AS h JOIN `bigquery-public-data.london_bicycles.cycle_stations` AS s ON h.start_station_id = s.id WHERE h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP) AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ), stationstats AS ( SELECT station_name, isweekday, AVG(duration) AS duration, COUNT(duration) AS num_trips, MAX(distance_from_city_center) AS distance_from_city_center FROM hs GROUP BY station_name, isweekday) SELECT * EXCEPT(station_name, isweekday) FROM stationstats
- Dans le panneau de navigation, dans la section Ressources, développez le nom de votre projet, cliquez sur bqml_tutorial, puis sur london_station_clusters.
- Cliquez sur l'onglet Schéma. Le schéma du modèle répertorie les trois attributs de station que BigQuery ML a utilisés pour effectuer le clustering. Le schéma doit se présenter comme suit:
- Cliquez sur l'onglet Évaluation. Cet onglet affiche les visualisations des clusters identifiés par le modèle de k-moyennes. Sous Caractéristiques numériques, les graphiques à barres affichent jusqu'à 10 caractéristiques numériques les plus importantes pour chaque centroïde. Le menu déroulant permet de sélectionner les caractéristiques à afficher.
7. Obtenir des prédictions BigQuery ML à l'aide du SDK ABAP pour Google Cloud
Maintenant que vous avez configuré les conditions préalables côté Google Cloud, vous êtes prêt à suivre les étapes dans votre système SAP pour obtenir des prédictions à partir du modèle de ML à l'aide du SDK ABAP pour Google Cloud.
Créer une configuration de clé client
Pour la configuration de l'authentification et de la connectivité associée, le SDK ABAP pour Google Cloud utilise les tables /GOOG/CLIENT_KEY
et /GOOG/SERVIC_MAP.
.
Pour gérer la configuration dans la table /GOOG/CLIENT_KEY
, procédez comme suit:
- Dans l'IUG de SAP, saisissez le code de transaction SPRO.
- Cliquez sur SAP Reference IMG.
- Cliquez sur SDK ABAP pour Google Cloud > Paramètres de base > Configurer la clé client.
- Conservez les valeurs suivantes pour les champs listés, et laissez tous les autres champs vides:
Champ | Valeur |
Nom de la clé Google Cloud | BIGQUERY_ML |
Nom du compte de service Google Cloud | abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com |
Champ d'application Google Cloud | https://www.googleapis.com/auth/cloud-platform |
ID du projet | abap-sdk-poc |
Classe d'autorisation | /GOOG/CL_AUTH_GOOGLE |
Créer un rapport ABAP pour obtenir des prédictions à partir du modèle BigQuery ML
Pour créer un rapport ABAP, procédez comme suit:
- Dans l'interface utilisateur graphique de SAP, accédez au code de transaction
SE38
et créez un programme de rapport nomméZDEMO_BIGQUERY_ML_PREDICT.
. - Dans le pop-up qui s'affiche, fournissez les informations indiquées dans l'image suivante:
- Dans la fenêtre pop-up suivante, sélectionnez Objet local ou indiquez un nom de package, le cas échéant.
- Dans l'éditeur ABAP, ajoutez le code suivant:
REPORT zdemo_bigquery_ml_predict. types: begin of lty_query_result, centroid_id type i, station_name type string, isweekday type string, num_trips type i, distance_from_city type string, end of lty_query_result, ltt_query_result type standard table of lty_query_result. DATA: lv_project_id TYPE string, ls_input TYPE /goog/cl_bigquery_v2=>ty_103, ls_output TYPE lty_query_result, lt_output TYPE ltt_query_result. CONSTANTS: lc_newline TYPE c VALUE cl_abap_char_utilities=>newline. TRY. "Initialize Bigquery object, pass the client key name that you have configured in /GOOG/CLIENT_KEY table DATA(lo_bq) = NEW /goog/cl_bigquery_v2( iv_key_name = 'BIGQUERY_ML' ). "Populate relevant parameters lv_project_id = lo_bq->gv_project_id. ls_input-default_dataset-project_id = 'abap-sdk-poc'. ls_input-default_dataset-dataset_id = 'bqml_tutorial'. "This query gets predictions from ls_input-query = | WITH | && lc_newline && | hs AS ( | && lc_newline && | SELECT | && lc_newline && | h.start_station_name AS station_name, | && lc_newline && | IF | && lc_newline && | (EXTRACT(DAYOFWEEK | && lc_newline && | FROM | && lc_newline && | h.start_date) = 1 | && lc_newline && | OR EXTRACT(DAYOFWEEK | && lc_newline && | FROM | && lc_newline && | h.start_date) = 7, | && lc_newline && | "weekend", | && lc_newline && | "weekday") AS isweekday, | && lc_newline && | h.duration, | && lc_newline && | ST_DISTANCE(ST_GEOGPOINT(s.longitude, | && lc_newline && | s.latitude), | && lc_newline && | ST_GEOGPOINT(-0.1, | && lc_newline && | 51.5))/1000 AS distance_from_city_center | && lc_newline && | FROM | && lc_newline && | `bigquery-public-data.london_bicycles.cycle_hire` AS h | && lc_newline && | JOIN | && lc_newline && | `bigquery-public-data.london_bicycles.cycle_stations` AS s | && lc_newline && | ON | && lc_newline && | h.start_station_id = s.id | && lc_newline && | WHERE | && lc_newline && | h.start_date BETWEEN CAST('2015-01-01 00:00:00' AS TIMESTAMP) | && lc_newline && | AND CAST('2016-01-01 00:00:00' AS TIMESTAMP) ), | && lc_newline && | stationstats AS ( | && lc_newline && | SELECT | && lc_newline && | station_name, | && lc_newline && | isweekday, | && lc_newline && | AVG(duration) AS duration, | && lc_newline && | COUNT(duration) AS num_trips, | && lc_newline && | MAX(distance_from_city_center) AS distance_from_city_center | && lc_newline && | FROM | && lc_newline && | hs | && lc_newline && | GROUP BY | && lc_newline && | station_name, isweekday ) | && lc_newline && | SELECT | && lc_newline && | * EXCEPT(nearest_centroids_distance) | && lc_newline && | FROM | && lc_newline && | ML.PREDICT( MODEL `bqml_tutorial.london_station_clusters`, | && lc_newline && | ( | && lc_newline && | SELECT | && lc_newline && | * | && lc_newline && | FROM | && lc_newline && | stationstats | && lc_newline && | WHERE | && lc_newline && | REGEXP_CONTAINS(station_name, 'Kennington'))) |. "Call API method: bigquery.jobs.query CALL METHOD lo_bq->query_jobs EXPORTING iv_p_project_id = lv_project_id is_input = ls_input IMPORTING es_output = DATA(ls_response) ev_ret_code = DATA(lv_ret_code) ev_err_text = DATA(lv_err_text) es_err_resp = DATA(ls_err_resp). IF lo_bq->is_success( lv_ret_code ). "API Call successful, loop through the data & display the result IF ls_response-job_complete = abap_true. LOOP AT ls_response-rows ASSIGNING FIELD-SYMBOL(<ls_row>). LOOP AT <ls_row>-f ASSIGNING FIELD-SYMBOL(<ls_value>). ASSIGN <ls_value>-v->* TO FIELD-SYMBOL(<ls_field_value>). CASE sy-tabix. WHEN 1. ls_output-centroid_id = <ls_field_value>. WHEN 2. ls_output-station_name = <ls_field_value>. WHEN 3. ls_output-isweekday = <ls_field_value>. WHEN 4. ls_output-num_trips = <ls_field_value>. WHEN 5. ls_output-distance_from_city = <ls_field_value>. ENDCASE. ENDLOOP. APPEND ls_output TO lt_output. CLEAR ls_output. ENDLOOP. IF lt_output IS NOT INITIAL. cl_demo_output=>new( )->begin_section( 'ML.Predict Query Details' )->write_text( ls_input-query )->write_text( 'Dataset: bigquery-public-data.london_bicycles' )->end_section( )->begin_section( 'ML.Predict Query Results' )->write_data( lt_output )->end_section( )->display( ). ENDIF. ENDIF. ELSE. "Display error message in case the API call fails MESSAGE lv_err_text TYPE 'E'. ENDIF. "Close HTTP Connection lo_bq->close( ). CATCH /goog/cx_sdk INTO DATA(lo_exception). MESSAGE lo_exception->get_text( ) TYPE 'E'. ENDTRY.
- Enregistrez et activez le rapport.
- Exécutez le rapport (F8).
Si l'exécution réussit, un rapport s'affiche, comme illustré ci-dessous:
8. Félicitations
Vous avez réalisé un excellent travail en terminant l'atelier de programmation "Obtenir des prédictions à partir d'un modèle de machine learning (ML) BigQuery à l'aide du SDK ABAP pour Google Cloud".
Vous avez récupéré les prédictions d'un modèle de machine learning BigQuery directement dans votre système SAP. Vous avez débloqué un nouveau niveau d'intégration entre ABAP et les services Google Cloud. Découvrez d'autres ateliers de programmation passionnants sur le SDK ABAP pour Google Cloud:
- Utiliser l'API Translation avec le SDK ABAP pour Google Cloud
- Importer un objet volumineux dans un bucket Cloud Storage à l'aide de la fragmentation
- Récupérer des identifiants/secrets à partir de Secret Manager avec le SDK ABAP pour Google Cloud
- Appeler Vertex AI test-bison à partir d'ABAP
9. Effectuer un nettoyage
Si vous ne souhaitez pas poursuivre les ateliers de programmation supplémentaires liés au SDK ABAP pour Google Cloud, veuillez procéder au nettoyage.
Supprimer le projet
- Supprimez le projet Google Cloud:
gcloud projects delete abap-sdk-poc
Supprimer des ressources individuelles
- Supprimez l'instance de calcul:
gcloud compute instances delete abap-trial-docker
- Supprimez les règles de pare-feu:
gcloud compute firewall-rules delete sapmachine
- Supprimez le compte de service :
gcloud iam service-accounts delete \
abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com