1. はじめに
この Codelab では、BigQuery で機械学習(ML)モデルを作成し、ABAP SDK for Google Cloud を使用してこのモデルから予測を取得します。
次の Google Cloud サービスを利用します。
- BigQuery
- Cloud Shell
作成するアプリの概要
次のものを作成します。
- BigQuery 機械学習(ML)モデル。
- BigQuery API を呼び出すための BigQuery ジョブユーザーのロールを持つサービス アカウント。
- BigQuery API を呼び出して ML モデルから予測を取得する ABAP プログラム。
2. 要件
- ブラウザ(Chrome、Firefox など)
- 課金が有効になっている Google Cloud プロジェクト、または Google Cloud Platform の 90 日間無料トライアル アカウントを作成する。
- システムにインストール済みの SAP GUI(Windows または Java)。ノートパソコンに SAP GUI がすでにインストールされている場合は、アプリケーション サーバーの IP として VM の外部 IP アドレスを使用して SAP に接続します。Mac を使用している場合は、こちらのリンクから入手できる SAP GUI for Java をインストールすることもできます。
3. 始める前に
- Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクト(例:
abap-sdk-poc
)を選択または作成します。 - Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。90 日間無料トライアル アカウントを使用している場合は、この手順をスキップしてください。
- ここでは、Google Cloud で動作するコマンドライン環境である Cloud Shell を使用します。
- Cloud コンソールで、右上にある [Cloud Shell をアクティブにする] をクリックします。
- Cloud Shell で次のコマンドを実行して、アカウントを認証し、デフォルトのプロジェクトを
abap-sdk-poc
に設定します。ゾーンus-west4-b
は例として使用されています。必要に応じて、次のコマンドでプロジェクトとゾーンを必要に応じて変更してください。
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- ABAP SDK for Google Cloud がインストールされている SAP システムにアクセスできる必要があります。
- この Codelab に進む前に、Codelab 1(ABAP Platform Trial 1909 を Google Cloud Platform にインストールし、ABAP SDK for Google Cloud をインストールする)と Codelab 2(Compute Engine VM で SAP Hosted のトークンを使用して ABAP SDK 認証を構成する)を完了する必要があります。
- Codelab 1 と Codelab 2 を完了している場合は、認証と接続に必要な設定とともに、Google Cloud 上の ABAP Platform Trial 1909 システムがプロビジョニングされています。
- Codelab 1 と Codelab 2 を完了していない場合、この Codelab で提供するステップを実行するために必要なインフラストラクチャと接続がすべて揃っているわけではありません。したがって、この Codelab に進む前に、Codelab 1 と Codelab 2 を完了する必要があります。
4. Google Cloud プロジェクトで BigQuery API V2 を有効にする
- Cloud コンソールで、右上にある [Cloud Shell をアクティブにする] をクリックします。
- Cloud Shell で次のコマンドを実行して、BigQuery API を有効にします。
gcloud services enable bigquery.googleapis.com
正常に実行されると、次のようなメッセージが表示されます。
これで、Google Cloud プロジェクトで BigQuery API が有効になりました。
5. BigQuery に安全にアクセスするためのサービス アカウントを作成する
BigQuery ML モデルから ML 予測を安全に取得するには、BigQuery ジョブユーザーと BigQuery データ閲覧者のロールを持つサービス アカウントを作成する必要があります。これにより、プログラムはプロジェクト内でクエリを(ジョブとして)実行し、テーブルからデータを読み取れるようになります。このロールは、ジョブの作成とデータの読み取りに必要な権限のみを付与し、セキュリティ リスクを最小限に抑えます。
サービス アカウントを作成する
必要なロールを持つサービス アカウントを作成するには、次の操作を行います。
- Cloud Shell ターミナルで次のコマンドを実行します。
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
- 前の手順で作成したサービス アカウントに必要なロールを追加します。
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'
上記のコマンドでは、Google Cloud プロジェクトのプレースホルダとして abap-sdk-poc
を使用しています。abap-sdk-poc
は、実際のプロジェクト ID に置き換えます。
- ロールが追加されたことを確認するには、[IAM] ページに移動します。作成したサービス アカウントと、それに割り当てられているロールが表示されます。
6. BigQuery ML モデルの作成
この Codelab では、ロンドンのレンタル自転車のデータセットをクラスタ化するための K 平均法モデルを作成します。K 平均法アルゴリズムを適用して、データをクラスタにグループ化できます。予測分析を目的とする教師あり ML とは異なり、教師なし学習は記述分析です。データ主導の意思決定ができるように、データを理解することが重要なのです。
データセットを作成する
ML モデルを保存する BigQuery データセットを作成するには、次の手順を行います。
- Google Cloud コンソールで、[BigQuery] ページに移動します。[BigQuery] ページに移動
- [エクスプローラ] ペインで、プロジェクト名をクリックします。
[アクションを表示 >] をクリックします。データセットを作成する。
- [データセットを作成する] ページで、次の操作を行います。
- [データセット ID] に
bqml_tutorial
を入力します。 - [ロケーション タイプ] で [マルチリージョン] を選択し、[EU(EU の複数のリージョン)] を選択します。ロンドンのレンタル自転車の一般公開データセットは、EU のマルチリージョンに保存されています。データセットも同じロケーションに存在する必要があります。
- 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。
K 平均法モデルを作成する
データセットの設定が完了したら、そのデータを使用して K 平均法モデルを作成します。CREATE MODEL ステートメントを model_type=kmeans
オプション付きで使用すると、K 平均法モデルを作成してトレーニングできます。
クエリを実行して K 平均法モデルを作成するには、次の操作を行います。
- [BigQuery] ページに移動します。BigQuery に移動
- [エディタ] ペインで、次の SQL ステートメントを実行します。
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
- ナビゲーション パネルの [リソース] セクションでプロジェクト名を展開し、[bqml_tutorial] をクリックしてから [london_station_clusters] をクリックします。
- [スキーマ] タブをクリックします。モデルスキーマには、BigQuery ML がクラスタリングの実行に使用した 3 つのステーション属性がリストされています。スキーマは次のようになります。
- [評価] タブをクリックします。このタブには、K 平均法モデルによって識別されたクラスタの可視化が表示されます。[数値特徴] には、セントロイドごとに最大 10 個の重要な特徴値が棒グラフで表示されます。可視化する特徴をプルダウン メニューから選択できます。
7. ABAP SDK for Google Cloud を使用して BigQuery ML 予測を取得する
Google Cloud 側で前提条件を設定したので、ABAP SDK for Google Cloud を使用して ML モデルから予測を取得するための SAP システムの手順を完了する準備が整いました。
クライアント キーの構成を作成する
認証と接続に関連する構成の場合、ABAP SDK for Google Cloud はテーブル /GOOG/CLIENT_KEY
と /GOOG/SERVIC_MAP.
を使用します。
/GOOG/CLIENT_KEY
テーブルの構成を維持するには、次の操作を行います。
- SAP GUI で、トランザクション コード SPRO を入力します。
- [SAP 参照 IMG] をクリックします。
- [ABAP SDK for Google Cloud] >基本設定 >クライアント キーを構成する
- リストされている項目に対して次の値を維持し、他の項目はすべて空白のままにします。
フィールド | 値 |
Google Cloud キー名 | BIGQUERY_ML |
Google Cloud サービス アカウント名 | abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com |
Google Cloud のスコープ | https://www.googleapis.com/auth/cloud-platform |
プロジェクト ID | abap-sdk-poc |
認可クラス | /GOOG/CL_AUTH_GOOGLE |
ABAP レポートを作成して BigQuery ML モデルから予測を取得する
ABAP レポートを作成するには、次の操作を行います。
- SAP GUI でトランザクション コード
SE38
に移動し、ZDEMO_BIGQUERY_ML_PREDICT.
という名前のレポート プログラムを作成します。 - 表示されたポップアップで、次の画像に示す詳細情報を入力します。
- 次のポップアップで、[Local Object] を選択するか、必要に応じてパッケージ名を入力します。
- ABAP エディタで、次のコードを追加します。
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.
- レポートを保存して有効にします。
- レポートを実行します(F8)。
正常に実行されると、次のようなレポート出力が表示されます。
8. 完了
「Get Prediction from a BigQuery Machine Learning (ML) model using ABAP SDK for Google Cloud」を完了し、codelab!
SAP システム内から BigQuery ML モデルの予測を取得できました。ABAP と Google Cloud サービス間の統合を新たなレベルに引き上げました。他のエキサイティングな ABAP SDK for Google Cloud Codelab で視野を広げましょう。
- ABAP SDK for Google Cloud で Translation API を使用する
- チャンクを使用して Cloud Storage バケットに大きなオブジェクトをアップロードする
- ABAP SDK for Google Cloud を使用して Secret Manager から認証情報/Secret を取得する
- ABAP から Vertex AI test-bison を呼び出す
9. クリーンアップ
ABAP SDK for Google Cloud に関連する追加の Codelab の続行を希望されない場合は、クリーンアップに進んでください。
プロジェクトの削除
- Google Cloud プロジェクトを削除します。
gcloud projects delete abap-sdk-poc
リソースを個別に削除する
- Compute インスタンスを削除します。
gcloud compute instances delete abap-trial-docker
- ファイアウォール ルールを削除します。
gcloud compute firewall-rules delete sapmachine
- サービス アカウントを削除します。
gcloud iam service-accounts delete \
abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com