پیش‌بینی‌های BigQuery ML را در SAP با استفاده از ABAP SDK برای Google Cloud بخوانید

۱. مقدمه

در این آزمایشگاه کد، شما یک مدل یادگیری ماشین (ML) را در BigQuery ایجاد خواهید کرد و با استفاده از ABAP SDK برای Google Cloud ، از این مدل پیش‌بینی دریافت خواهید کرد.

شما از سرویس‌های ابری گوگل زیر استفاده خواهید کرد:

  • بیگ‌کوئری
  • پوسته ابری

آنچه خواهید ساخت

شما موارد زیر را ایجاد خواهید کرد:

  • یک مدل یادگیری ماشین (ML) در BigQuery.
  • یک حساب کاربری سرویس با نقش کاربری BigQuery Job برای فراخوانی BigQuery API.
  • یک برنامه ABAP برای فراخوانی BigQuery API و دریافت پیش‌بینی‌ها از مدل ML.

۲. الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس .
  • یک پروژه گوگل کلود با قابلیت پرداخت فعال یا ایجاد یک حساب آزمایشی ۹۰ روزه رایگان برای پلتفرم گوگل کلود.
  • رابط کاربری گرافیکی SAP (ویندوز یا جاوا) روی سیستم شما نصب شده باشد. اگر رابط کاربری گرافیکی SAP از قبل روی لپ‌تاپ شما نصب شده است، با استفاده از آدرس IP خارجی ماشین مجازی به عنوان IP سرور برنامه به SAP متصل شوید. اگر از مک استفاده می‌کنید، می‌توانید رابط کاربری گرافیکی SAP برای جاوا را که در این لینک موجود است، نصب کنید.

۳. قبل از شروع

6757b2fb50ddcc2d.png

  • دستورات زیر را در Cloud Shell اجرا کنید تا حساب کاربری شما احراز هویت شود و پروژه پیش‌فرض را روی abap-sdk-poc تنظیم کنید. Zone us-west4-b به عنوان مثال استفاده شده است. در صورت نیاز، لطفاً پروژه و Zone را در دستورات زیر بر اساس ترجیح خود تغییر دهید.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
  • شما باید به یک سیستم SAP که ABAP SDK برای Google Cloud روی آن نصب شده باشد، دسترسی داشته باشید.
  • قبل از ادامه‌ی این آزمایشگاه کد، باید آزمایشگاه کد ۱ ( نصب نسخه آزمایشی ۱۹۰۹ پلتفرم ABAP روی پلتفرم ابری گوگل و نصب کیت توسعه نرم‌افزار ABAP برای گوگل ابری) و آزمایشگاه کد ۲ ( پیکربندی احراز هویت SDK ABAP با استفاده از توکن‌ها برای SAP میزبانی‌شده روی ماشین مجازی موتور محاسباتی ) را تکمیل کنید.
  • اگر codelab 1 و codelab 2 را تکمیل کرده باشید، این به شما یک سیستم آزمایشی پلتفرم ABAP 1909 روی Google Cloud به همراه تنظیمات لازم برای احراز هویت و اتصال ارائه می‌دهد.
  • اگر codelab 1 و codelab 2 را تکمیل نکرده‌اید، تمام زیرساخت‌ها و اتصالات مورد نیاز برای انجام مراحل ارائه شده در این codelab را نخواهید داشت. بنابراین، قبل از ادامه‌ی این codelab، باید codelab 1 و codelab 2 را تکمیل کنید.

۴. فعال کردن BigQuery API V2 در پروژه گوگل کلود شما

  1. از کنسول ابری، روی فعال کردن پوسته ابری در گوشه بالا سمت راست کلیک کنید:

6757b2fb50ddcc2d.png

  1. برای فعال کردن BigQuery API، دستورات زیر را در Cloud Shell اجرا کنید:
gcloud services enable bigquery.googleapis.com

در صورت اجرای موفقیت‌آمیز، باید پیامی مطابق شکل زیر نمایش داده شود.

b5f52859df2c2f56.png

اکنون باید BigQuery API را در پروژه Google Cloud خود فعال کرده باشید.

۵. برای دسترسی امن به BigQuery، یک حساب کاربری سرویس ایجاد کنید

برای دریافت ایمن پیش‌بینی‌های یادگیری ماشین از یک مدل یادگیری ماشین BigQuery، باید یک حساب کاربری سرویس با نقش‌های BigQuery Job User و BigQuery Data Viewer ایجاد کنید که به برنامه شما اجازه می‌دهد تا پرس‌وجوها (به عنوان شغل) را در پروژه اجرا کند و داده‌ها را از جداول بخواند. این نقش فقط مجوزهای لازم برای ایجاد شغل و خواندن داده‌ها را اعطا می‌کند و خطرات امنیتی را به حداقل می‌رساند.

ایجاد حساب کاربری سرویس

برای ایجاد یک حساب کاربری سرویس با نقش مورد نیاز، مراحل زیر را انجام دهید:

  1. دستور زیر را در ترمینال Cloud Shell اجرا کنید:
gcloud iam service-accounts create abap-sdk-bigquery-jobuser --display-name="Service Account for BigQuery Job user"
  1. اکنون نقش‌های مورد نیاز را به حساب سرویس ایجاد شده در مرحله قبل اضافه کنید:
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'

دستور بالا abap-sdk-poc به عنوان یک متغیر برای پروژه ابری گوگل استفاده می‌کند. abap-sdk-poc با شناسه پروژه خود جایگزین کنید.

  1. برای تأیید اضافه شدن نقش، به صفحه IAM بروید. حساب کاربری سرویسی که ایجاد کرده‌اید باید به همراه نقشی که به آن اختصاص داده شده است، فهرست شده باشد.

۶. ایجاد یک مدل یادگیری ماشین BigQuery

در این آزمایشگاه کد، ما یک مدل k-means برای خوشه‌بندی مجموعه داده‌های اجاره دوچرخه لندن ایجاد خواهیم کرد. شما می‌توانید الگوریتم k-means را برای گروه‌بندی داده‌های خود در خوشه‌ها اعمال کنید. برخلاف یادگیری ماشینی نظارت‌شده، که مربوط به تجزیه و تحلیل پیش‌بینی‌کننده است، یادگیری بدون نظارت مربوط به تجزیه و تحلیل توصیفی است. این در مورد درک داده‌های شما است تا بتوانید تصمیمات مبتنی بر داده بگیرید.

مجموعه داده خود را ایجاد کنید

برای ایجاد یک مجموعه داده BigQuery برای ذخیره مدل ML خود، مراحل زیر را انجام دهید:

  1. در کنسول گوگل کلود، به صفحه BigQuery بروید. به صفحه BigQuery بروید
  2. در پنل Explorer ، روی نام پروژه خود کلیک کنید.
  3. کلیک 5cf3b742649f1e2c.png مشاهده اقدامات > ایجاد مجموعه داده .

3fbc072041bfa313.png

  1. در صفحه ایجاد مجموعه داده ، موارد زیر را انجام دهید:
  • برای شناسه مجموعه داده ، bqml_tutorial را وارد کنید.
  • برای نوع مکان ، گزینه چند منطقه‌ای (Multi-region ) و سپس اتحادیه اروپا (EU) (چندین منطقه در اتحادیه اروپا) را انتخاب کنید. مجموعه داده‌های عمومی London Bicycle Hires در منطقه چند منطقه‌ای اتحادیه اروپا ذخیره می‌شود. مجموعه داده‌های شما باید در همان مکان باشد.
  • تنظیمات پیش‌فرض باقی‌مانده را بدون تغییر باقی بگذارید و روی ایجاد مجموعه داده کلیک کنید. ایجاد صفحه مجموعه داده.

ایجاد یک مدل k-means

اکنون که مجموعه داده شما تنظیم شده است، گام بعدی ایجاد یک مدل k-means با استفاده از داده‌ها است. می‌توانید با استفاده از دستور CREATE MODEL و با استفاده از گزینه model_type=kmeans ، یک مدل k-means ایجاد و آموزش دهید.

برای اجرای پرس‌وجو و ایجاد مدل k-means، مراحل زیر را انجام دهید:

  1. به صفحه BigQuery بروید. به BigQuery بروید
  2. در پنل ویرایشگر، دستور 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
  1. در پنل ناوبری، در بخش منابع ، نام پروژه خود را باز کنید، روی bqml_tutorial کلیک کنید و سپس روی london_station_clusters کلیک کنید.
  2. روی برگه Schema کلیک کنید. طرحواره مدل، سه ویژگی ایستگاه را که BigQuery ML برای انجام خوشه‌بندی استفاده کرده است، فهرست می‌کند. این طرحواره باید شبیه شکل زیر باشد:

5f1feb313bd0f6a5.png

  1. روی برگه ارزیابی (Evaluation) کلیک کنید. این برگه، تجسم‌هایی از خوشه‌های شناسایی‌شده توسط مدل k-means را نمایش می‌دهد. در زیر ویژگی‌های عددی (Numeric features )، نمودارهای میله‌ای تا 10 مورد از مهم‌ترین مقادیر ویژگی‌های عددی را برای هر مرکزوار نمایش می‌دهند. می‌توانید از منوی کشویی، ویژگی‌هایی را که می‌خواهید تجسم کنید، انتخاب کنید.

8f9b53971e33dc08.png

۷. با استفاده از ABAP SDK برای Google Cloud، پیش‌بینی‌های BigQuery ML را دریافت کنید

اکنون که پیش‌نیازها را در سمت Google Cloud تنظیم کرده‌اید، آماده‌اید تا مراحلی را در سیستم SAP خود برای دریافت پیش‌بینی‌ها از مدل ML با استفاده از ABAP SDK برای Google Cloud انجام دهید.

ایجاد پیکربندی کلید کلاینت

برای پیکربندی مربوط به احراز هویت و اتصال، ABAP SDK برای Google Cloud از جداول /GOOG/CLIENT_KEY و /GOOG/SERVIC_MAP.

برای حفظ پیکربندی در جدول /GOOG/CLIENT_KEY ، مراحل زیر را انجام دهید:

  1. در رابط کاربری گرافیکی SAP، کد تراکنش SPRO را وارد کنید.
  2. روی SAP Reference IMG کلیک کنید.
  3. روی ABAP SDK برای Google Cloud > تنظیمات اولیه > پیکربندی کلید کلاینت کلیک کنید

25871e639293b9ee.png

  1. مقادیر زیر را در فیلدهای ذکر شده حفظ کنید، سایر فیلدها را خالی بگذارید:

میدان

ارزش

نام کلید گوگل کلود

بزرگ کردن پرس و جو

نام حساب کاربری سرویس ابری گوگل

abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com

محدوده فضای ابری گوگل

https://www.googleapis.com/auth/cloud-platform

شناسه پروژه

abap-sdk-poc

کلاس مجوز

/GOOG/CL_AUTH_GOOGLE

ساخت گزارش ABAP برای دریافت پیش‌بینی‌ها از مدل BigQuery ML

برای ساخت گزارش ABAP، مراحل زیر را انجام دهید:

  1. در رابط کاربری گرافیکی SAP خود، به کد تراکنش SE38 بروید و یک برنامه گزارش با نام ZDEMO_BIGQUERY_ML_PREDICT.
  2. در پنجره باز شده، جزئیات را مطابق تصویر زیر وارد کنید:

4cb32d50427df294.png

  1. در پنجره‌ی باز شده‌ی بعدی، یا Local Object را انتخاب کنید یا نام بسته‌ی مورد نظر خود را وارد کنید.
  2. در ویرایشگر 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.
  1. گزارش را ذخیره و فعال کنید.
  2. گزارش را اجرا کنید (F8).

در صورت اجرای موفقیت‌آمیز، باید خروجی گزارشی مانند تصویر زیر مشاهده کنید:

739e5685511fc9fc.png6405542a597ed09f.png

۸. تبریک

کار فوق‌العاده‌ای که در آزمایشگاه کد «دریافت پیش‌بینی‌ها از یک مدل یادگیری ماشین (ML) در BigQuery با استفاده از ABAP SDK برای Google Cloud» انجام دادید!

شما با موفقیت پیش‌بینی‌های یک مدل یادگیری ماشین BigQuery را مستقیماً از درون سیستم SAP خود بازیابی کرده‌اید! شما سطح جدیدی از ادغام بین ABAP و سرویس‌های ابری گوگل را باز کرده‌اید. افق‌های خود را با سایر آزمایشگاه‌های کد هیجان‌انگیز ABAP SDK برای Google Cloud گسترش دهید:

  • استفاده از API ترجمه با ABAP SDK برای Google Cloud
  • با استفاده از قطعه‌بندی، یک شیء بزرگ را در یک مخزن ذخیره‌سازی ابری بارگذاری کنید
  • بازیابی اطلاعات احراز هویت/اسرار از Secret Manager با ABAP SDK برای Google Cloud
  • با Vertex AI test-bison از ABAP تماس بگیرید

۹. تمیز کردن

اگر نمی‌خواهید به کار با آزمایشگاه‌های کد اضافی مربوط به ABAP SDK برای Google Cloud ادامه دهید، لطفاً پاکسازی را ادامه دهید.

پروژه را حذف کنید

  • پروژه Google Cloud را حذف کنید:
gcloud projects delete abap-sdk-poc

حذف منابع تکی

  1. نمونه محاسبه را حذف کنید:
gcloud compute instances delete abap-trial-docker
  1. حذف قوانین فایروال:
gcloud compute firewall-rules delete sapmachine
  1. حذف حساب کاربری سرویس:
gcloud iam service-accounts delete \
    abap-sdk-bigquery-jobuser@abap-sdk-poc.iam.gserviceaccount.com