قراءة توقّعات الذكاء الاصطناعي في BigQuery في SAP باستخدام حزمة تطوير البرامج (SDK) لـ ABAP في Google Cloud

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستنشئ نموذج تعلُّم آلة (ML) في BigQuery وستحصل على توقّعات من هذا النموذج باستخدام ABAP SDK for Google Cloud.

ستستفيد من خدمات Google Cloud التالية:

  • BigQuery
  • Cloud Shell

ما ستنشئه

ستنشئ ما يلي:

  • أحد نماذج تعلُّم الآلة (ML) في BigQuery
  • حساب خدمة لديه دور "مستخدم المهمة في BigQuery" لاستدعاء BigQuery API
  • برنامج ABAP لاستدعاء BigQuery API والحصول على توقّعات من نموذج تعلُّم الآلة

2. المتطلّبات

  • متصفّح، مثل Chrome أو Firefox
  • مشروع Google Cloud تم تفعيل الفوترة فيه أو إنشاء حساب فترة تجريبية مجانية لمدة 90 يومًا على Google Cloud Platform
  • يجب أن يكون SAP GUI (Windows أو Java) مثبّتًا على نظامك. إذا كان SAP GUI مثبَّتًا على الكمبيوتر المحمول، يمكنك الاتصال بنظام SAP باستخدام عنوان IP الخارجي للجهاز الافتراضي كعنوان IP لخادم التطبيقات. إذا كنت تستخدم جهاز Mac، يمكنك أيضًا تثبيت SAP GUI for Java المتاح في هذا الرابط.

3- قبل البدء

6757b2fb50ddcc2d.png

  • نفِّذ الأوامر التالية في 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
  • يجب أن يكون لديك إذن الوصول إلى نظام SAP مثبَّت عليه حزمة تطوير البرامج (SDK) المستندة إلى لغة ABAP في Google Cloud.
  • يجب إكمال الدرس التطبيقي 1 (تثبيت الإصدار التجريبي من منصة ABAP‏ 1909 على Google Cloud Platform وتثبيت حزمة تطوير البرامج (SDK) لمنصة ABAP على Google Cloud) والدرس التطبيقي 2 (إعداد مصادقة حزمة تطوير البرامج (SDK) لمنصة ABAP باستخدام الرموز المميزة لخدمة SAP المستضافة على جهاز Compute Engine الظاهري) قبل المتابعة إلى هذا الدرس التطبيقي.
  • إذا أكملت الدرس العملي 1 والدرس العملي 2، سيتم توفير نظام تجريبي لمنصة ABAP الإصدار 1909 على Google Cloud، بالإضافة إلى عملية الإعداد المطلوبة للمصادقة وإمكانية الاتصال.
  • إذا لم تكن قد أكملت الدرس العملي 1 والدرس العملي 2، لن تتوفّر لديك كل البنية الأساسية وإمكانية الاتصال اللازمة لتنفيذ الخطوات الواردة في هذا الدرس العملي. لذلك، يجب إكمال الدرس العملي 1 والدرس العملي 2 قبل المتابعة إلى هذا الدرس العملي.

4. تفعيل BigQuery API V2 في مشروعك على Google Cloud

  1. من Cloud Console، انقر على تفعيل Cloud Shell في أعلى يسار الصفحة:

6757b2fb50ddcc2d.png

  1. نفِّذ الأوامر التالية في Cloud Shell لتفعيل BigQuery API:
gcloud services enable bigquery.googleapis.com

عند التنفيذ بنجاح، من المفترض أن تظهر لك رسالة كما هو موضّح أدناه

b5f52859df2c2f56.png

من المفترض أن تكون واجهة برمجة تطبيقات BigQuery مفعّلة الآن في مشروعك على Google Cloud.

5- إنشاء حساب خدمة للوصول الآمن إلى BigQuery

للحصول على توقّعات تعلُّم الآلة بشكل آمن من نموذج BigQuery ML، عليك إنشاء حساب خدمة يتضمّن دورَي مستخدم وظائف BigQuery ومُشاهد البيانات في BigQuery، ما سيسمح لبرنامجك بتنفيذ طلبات البحث (كوظائف) داخل المشروع وقراءة البيانات من الجداول. يمنح هذا الدور الإذن اللازم فقط لإنشاء المهام وقراءة البيانات، ما يقلّل من المخاطر الأمنية.

إنشاء حساب خدمة

لإنشاء حساب خدمة يتضمّن الدور المطلوب، اتّبِع الخطوات التالية:

  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 كعنصر نائب لمشروع Google Cloud. استبدِل abap-sdk-poc برقم تعريف مشروعك.

  1. للتأكّد من إضافة الدور، انتقِل إلى صفحة IAM. يجب أن يظهر حساب الخدمة الذي أنشأته مع الدور الذي تمّ تعيينه له.

6. إنشاء نموذج BigQuery Machine Learning

في هذا الدرس التطبيقي حول الترميز، سننشئ نموذجًا تصنيفيًا لتجميع مجموعة بيانات تأجير الدراجات في لندن. يمكنك تطبيق خوارزمية k-means لتجميع بياناتك في مجموعات. على عكس تعلُّم الآلة المُوجّه الذي يركّز على التحليلات التنبؤية، يركّز التعلُّم غير المُوجّه على التحليلات الوصفية. ويتمحور حول فهم بياناتك حتى تتمكّن من اتّخاذ قرارات مستندة إلى البيانات.

إنشاء مجموعة البيانات

لإنشاء مجموعة بيانات BigQuery لتخزين نموذج تعلُّم الآلة، اتّبِع الخطوات التالية:

  1. في وحدة تحكّم Google Cloud، انتقِل إلى صفحة BigQuery. الانتقال إلى صفحة BigQuery
  2. في جزء المستكشف، انقر على اسم مشروعك.
  3. انقر على 5cf3b742649f1e2c.png عرض الإجراءات > إنشاء مجموعة بيانات.

3fbc072041bfa313.png

  1. في صفحة إنشاء مجموعة بيانات، اتّبِع الخطوات التالية:
  • في حقل معرّف مجموعة البيانات، أدخِل bqml_tutorial.
  • بالنسبة إلى نوع الموقع الجغرافي، اختَر عدة مناطق، ثم اختَر الاتحاد الأوروبي (مناطق متعدّدة في الاتحاد الأوروبي). يتم تخزين مجموعة البيانات العامة London Bicycle Hires في المناطق المتعدّدة في الاتحاد الأوروبي. يجب أن تكون مجموعة البيانات في الموقع الجغرافي نفسه.
  • اترك الإعدادات التلقائية المتبقية كما هي، وانقر على إنشاء مجموعة بيانات. صفحة إنشاء مجموعة البيانات

إنشاء نموذج k-means

بعد إعداد مجموعة البيانات، تتمثّل الخطوة التالية في إنشاء نموذج k-means باستخدام البيانات. يمكنك إنشاء نموذج k-means وتدريبه باستخدام عبارة CREATE MODEL مع الخيار model_type=kmeans.

لتنفيذ طلب البحث وإنشاء نموذج 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. انقر على علامة التبويب المخطط. يسرد مخطط النموذج سمات المحطات الثلاث التي استخدمتها BigQuery ML لإجراء التجميع. يجب أن يبدو المخطط على النحو التالي:

5f1feb313bd0f6a5.png

  1. انقر على علامة التبويب التقييم. تعرض علامة التبويب هذه عروضًا مرئية للمجموعات التي حدّدها نموذج k-means. ضمن الميزات الرقمية، تعرض الرسوم البيانية الشريطية ما يصل إلى 10 من أهم قيم الميزات الرقمية لكل مركز. يمكنك اختيار الميزات التي تريد عرضها بشكل مرئي من القائمة المنسدلة.

8f9b53971e33dc08.png

7. الحصول على توقّعات BigQuery ML باستخدام حزمة تطوير البرامج (SDK) للغة ABAP في Google Cloud

بعد إعداد المتطلبات الأساسية على Google Cloud، يمكنك إكمال الخطوات في نظام SAP للحصول على توقّعات من نموذج تعلُّم الآلة باستخدام حزمة تطوير البرامج (SDK) الخاصة بلغة ABAP على Google Cloud.

إنشاء إعدادات مفتاح العميل

بالنسبة إلى الإعدادات المتعلّقة بالمصادقة والاتصال، تستخدم حزمة تطوير البرامج (SDK) للغة ABAP في Google Cloud الجدولَين /GOOG/CLIENT_KEY و/GOOG/SERVIC_MAP..

للحفاظ على الإعدادات في جدول /GOOG/CLIENT_KEY، اتّبِع الخطوات التالية:

  1. في SAP GUI، أدخِل رمز المعاملة SPRO.
  2. انقر على SAP Reference IMG.
  3. انقر على ABAP SDK for Google Cloud > الإعدادات الأساسية > إعداد مفتاح العميل

25871e639293b9ee.png

  1. احتفِظ بالقيم التالية في الحقول المدرَجة، واترك جميع الحقول الأخرى فارغة:

الحقل

القيمة

اسم مفتاح 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

رقم تعريف المشروع

abap-sdk-poc

فئة التفويض

/GOOG/CL_AUTH_GOOGLE

إنشاء تقرير ABAP للحصول على توقّعات من نموذج BigQuery ML

لإنشاء تقرير ABAP، اتّبِع الخطوات التالية:

  1. في واجهة SAP GUI، انتقِل إلى رمز المعاملة 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.png

6405542a597ed09f.png

8. تهانينا

أحسنت إكمال برنامج codelab بعنوان "الحصول على توقّعات من نموذج BigQuery Machine Learning (ML) باستخدام حزمة تطوير البرامج (SDK) للغة ABAP على Google Cloud".

لقد استرجعت بنجاح توقّعات نموذج BigQuery Machine Learning، مباشرةً من داخل نظام SAP. لقد أتحنا مستوى جديدًا من التكامل بين ABAP وخدمات Google Cloud. يمكنك استكشاف آفاق جديدة من خلال دروس تطبيقية أخرى رائعة حول حزمة تطوير البرامج (SDK) ABAP لخدمة Google Cloud:

  • استخدام Translation API مع حزمة تطوير البرامج (SDK) ABAP على Google Cloud
  • تحميل ملف كبير إلى حزمة Cloud Storage باستخدام تقسيم الملفات
  • استرداد بيانات الاعتماد/الأسرار من Secret Manager باستخدام حزمة تطوير البرامج (SDK) للغة ABAP في Google Cloud
  • استدعاء Vertex AI test-bison من ABAP

9- تَنظيم

إذا كنت لا تريد مواصلة استخدام دروس البرمجة الإضافية المتعلّقة بحزمة تطوير البرامج (SDK) للغة ABAP على 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