اجرای آموزش مدل سفارشی بر روی خطوط لوله Vertex

۱. مرور کلی

در این آزمایش، شما یاد خواهید گرفت که چگونه یک کار آموزش مدل سفارشی را با استفاده از Kubeflow Pipelines SDK روی Vertex Pipelines اجرا کنید.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

  • استفاده از Kubeflow Pipelines SDK برای ساخت خطوط لوله یادگیری ماشینی مقیاس‌پذیر
  • یک کار آموزشی مدل Scikit-learn سفارشی ایجاد و کانتینرایز کنید که از مجموعه داده‌های مدیریت‌شده توسط Vertex AI استفاده می‌کند و در یک خط لوله روی Vertex AI Training اجرا خواهد شد.
  • اجرای یک کار پیش‌بینی دسته‌ای در Vertex Pipelines
  • استفاده از کامپوننت‌های از پیش ساخته شده برای تعامل با سرویس‌های هوش مصنوعی Vertex، که از طریق کتابخانه google_cloud_pipeline_components ارائه می‌شوند.

هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۵ دلار است.

۲. مقدمه‌ای بر هوش مصنوعی ورتکس

این آزمایشگاه از Vertex AI ، پلتفرم مدیریت‌شده‌ی سرتاسری یادگیری ماشین ما در Google Cloud، استفاده می‌کند. Vertex AI، پیشنهادات یادگیری ماشین گوگل را در سراسر Google Cloud به یک تجربه‌ی توسعه‌ی یکپارچه تبدیل می‌کند. Vertex AI علاوه بر خدمات آموزش و استقرار مدل، شامل انواع محصولات MLOps، از جمله Vertex Pipelines (تمرکز این آزمایشگاه)، Model Monitoring، Feature Store و موارد دیگر نیز می‌شود. می‌توانید تمام پیشنهادات محصولات Vertex AI را در نمودار زیر مشاهده کنید.

بررسی اجمالی محصولات ورتکس

اگر نظری دارید، لطفاً به صفحه پشتیبانی مراجعه کنید.

چرا خطوط لوله یادگیری ماشین مفید هستند؟

قبل از اینکه وارد بحث شویم، ابتدا بیایید بفهمیم که چرا باید از یک خط لوله استفاده کنید. تصور کنید که در حال ساخت یک گردش کار یادگیری ماشین هستید که شامل پردازش داده‌ها، آموزش یک مدل، تنظیم هایپرپارامتر، ارزیابی و استقرار مدل است. هر یک از این مراحل ممکن است وابستگی‌های متفاوتی داشته باشند که اگر کل گردش کار را به عنوان یک سیستم یکپارچه در نظر بگیرید، ممکن است دشوار شود. همانطور که شروع به مقیاس‌بندی فرآیند یادگیری ماشین خود می‌کنید، ممکن است بخواهید گردش کار یادگیری ماشین خود را با سایر اعضای تیم خود به اشتراک بگذارید تا آنها بتوانند آن را اجرا کرده و کد ارائه دهند. بدون یک فرآیند قابل اعتماد و قابل تکرار، این کار می‌تواند دشوار شود. با خطوط لوله، هر مرحله در فرآیند یادگیری ماشین شما، کانتینر مخصوص به خود را دارد. این به شما امکان می‌دهد مراحل را به طور مستقل توسعه دهید و ورودی و خروجی هر مرحله را به روشی قابل تکرار پیگیری کنید. همچنین می‌توانید اجرای خط لوله خود را بر اساس سایر رویدادهای محیط ابری خود، مانند شروع اجرای خط لوله در صورت وجود داده‌های آموزشی جدید، برنامه‌ریزی یا فعال کنید.

خطوط لوله tl;dr : به شما کمک می‌کنند تا گردش‌های کاری یادگیری ماشین خود را ساده‌سازی و بازتولید کنید .

۳. راه‌اندازی محیط ابری

برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل‌های اینجا را دنبال کنید.

مرحله ۱: شروع Cloud Shell

در این آزمایش، شما در یک جلسه Cloud Shell کار خواهید کرد، که یک مفسر فرمان است که توسط یک ماشین مجازی که در فضای ابری گوگل اجرا می‌شود، میزبانی می‌شود. شما می‌توانید به راحتی این بخش را به صورت محلی روی رایانه خود اجرا کنید، اما استفاده از Cloud Shell به همه امکان دسترسی به یک تجربه قابل تکرار در یک محیط سازگار را می‌دهد. پس از آزمایش، می‌توانید این بخش را دوباره روی رایانه خود امتحان کنید.

مجوز دادن به پوسته ابری

فعال کردن پوسته ابری

از بالا سمت راست کنسول ابری، روی دکمه زیر کلیک کنید تا Cloud Shell فعال شود :

فعال کردن پوسته ابری

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

راه اندازی پوسته ابری

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

آغازگر پوسته ابری

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما پر شده است. این ماشین یک دایرکتوری خانگی ۵ گیگابایتی دائمی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر یا کروم‌بوک انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است.

برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:

gcloud auth list

شما باید چیزی شبیه به این را در خروجی دستور ببینید:

خروجی Cloud Shell

دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:

gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

Cloud Shell چند متغیر محیطی دارد، از جمله GOOGLE_CLOUD_PROJECT که شامل نام پروژه ابری فعلی ما است. ما از این در جاهای مختلف این تمرین استفاده خواهیم کرد. می‌توانید با اجرای دستور زیر آن را مشاهده کنید:

echo $GOOGLE_CLOUD_PROJECT

مرحله ۲: فعال کردن APIها

در مراحل بعدی، خواهید دید که این سرویس‌ها کجا مورد نیاز هستند (و چرا)، اما فعلاً این دستور را اجرا کنید تا به پروژه خود دسترسی به سرویس‌های Compute Engine، Container Registry و Vertex AI بدهید:

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

این باید یک پیام موفقیت‌آمیز مشابه این ایجاد کند:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

مرحله ۳: ایجاد یک فضای ذخیره‌سازی ابری

برای اجرای یک کار آموزشی در Vertex AI، به یک سطل ذخیره‌سازی برای ذخیره دارایی‌های مدل ذخیره شده خود نیاز داریم. سطل باید منطقه‌ای باشد. ما در اینجا us-central استفاده می‌کنیم، اما شما می‌توانید از یک منطقه دیگر استفاده کنید (فقط آن را در طول این آزمایش جایگزین کنید). اگر از قبل سطلی دارید، می‌توانید از این مرحله صرف نظر کنید.

برای ایجاد یک باکت، دستورات زیر را در ترمینال Cloud Shell خود اجرا کنید:

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

در مرحله بعد، به حساب کاربری سرویس محاسباتی خود دسترسی به این سطل را می‌دهیم. این کار تضمین می‌کند که Vertex Pipelines مجوزهای لازم برای نوشتن فایل‌ها در این سطل را دارد. برای افزودن این مجوز، دستور زیر را اجرا کنید:

gcloud projects describe $GOOGLE_CLOUD_PROJECT > project-info.txt
PROJECT_NUM=$(cat project-info.txt | sed -nre 's:.*projectNumber\: (.*):\1:p')
SVC_ACCOUNT="${PROJECT_NUM//\'/}-compute@developer.gserviceaccount.com"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member serviceAccount:$SVC_ACCOUNT --role roles/storage.objectAdmin

مرحله ۴: ایجاد یک نمونه از Vertex AI Workbench

از بخش Vertex AI در کنسول ابری خود، روی Workbench کلیک کنید:

منوی هوش مصنوعی ورتکس

از آنجا، در دفترچه‌های مدیریت‌شده توسط کاربر ، روی دفترچه یادداشت جدید کلیک کنید:

ایجاد دفترچه یادداشت جدید

سپس نوع نمونه TensorFlow Enterprise 2.3 (with LTS) را بدون GPU انتخاب کنید:

نمونه TFE

از گزینه‌های پیش‌فرض استفاده کنید و سپس روی «ایجاد» کلیک کنید.

مرحله ۵: دفترچه یادداشت خود را باز کنید

پس از ایجاد نمونه، گزینه Open JupyterLab را انتخاب کنید:

دفترچه یادداشت را باز کنید

۴. تنظیمات Vertex Pipelines

برای استفاده از Vertex Pipelines باید چند کتابخانه اضافی نصب کنیم:

  • Kubeflow Pipelines : این SDK است که ما برای ساخت pipeline خود استفاده خواهیم کرد. Vertex Pipelines از اجرای pipelineهای ساخته شده با Kubeflow Pipelines یا TFX پشتیبانی می‌کند.
  • اجزای خط تولید گوگل کلود : این کتابخانه اجزای از پیش ساخته شده‌ای را ارائه می‌دهد که تعامل با سرویس‌های هوش مصنوعی ورتکس را از مراحل خط تولید شما آسان‌تر می‌کند.

مرحله ۱: ایجاد دفترچه یادداشت پایتون و نصب کتابخانه‌ها

ابتدا، از منوی Launcher در نمونه Notebook خود (که می‌توانید با کلیک روی آیکون + در سمت چپ بالای Notebook خود به آن دسترسی پیدا کنید)، با انتخاب Python 3 یک Notebook ایجاد کنید:

ایجاد دفترچه یادداشت پایتون ۳

شما می‌توانید با کلیک روی علامت + در سمت چپ بالای نمونه نوت‌بوک خود، به منوی لانچر دسترسی پیدا کنید.

برای نصب هر دو سرویسی که در این آزمایش استفاده خواهیم کرد، ابتدا پرچم کاربر را در یک سلول نوت‌بوک تنظیم کنید:

USER_FLAG = "--user"

سپس دستور زیر را از نوت بوک خود اجرا کنید:

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0 --upgrade
!pip3 install {USER_FLAG} kfp==1.8.9 google-cloud-pipeline-components==0.2.0

پس از نصب این بسته‌ها، باید هسته را مجدداً راه‌اندازی کنید:

import os

if not os.getenv("IS_TESTING"):
    # Automatically restart kernel after installs
    import IPython

    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)

در نهایت، بررسی کنید که بسته‌ها را به درستی نصب کرده‌اید. نسخه KFP SDK باید >=1.8 باشد:

!python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
!python3 -c "import google_cloud_pipeline_components; print('google_cloud_pipeline_components version: {}'.format(google_cloud_pipeline_components.__version__))"

مرحله ۲: شناسه پروژه و باکت خود را تنظیم کنید

در طول این آزمایش، شما به شناسه پروژه ابری خود و باکتی که قبلاً ایجاد کرده‌اید، ارجاع خواهید داد. در مرحله بعد، برای هر یک از آنها متغیرهایی ایجاد خواهیم کرد.

اگر شناسه پروژه خود را نمی‌دانید، می‌توانید با اجرای دستور زیر آن را بدست آورید:

import os
PROJECT_ID = ""

# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
    shell_output=!gcloud config list --format 'value(core.project)' 2>/dev/null
    PROJECT_ID = shell_output[0]
    print("Project ID: ", PROJECT_ID)

در غیر این صورت، آن را اینجا تنظیم کنید:

if PROJECT_ID == "" or PROJECT_ID is None:
    PROJECT_ID = "your-project-id"  # @param {type:"string"}

سپس یک متغیر برای ذخیره نام سطل خود ایجاد کنید. اگر آن را در این آزمایش ایجاد کرده‌اید، موارد زیر کار خواهد کرد. در غیر این صورت، باید آن را به صورت دستی تنظیم کنید:

BUCKET_NAME="gs://" + PROJECT_ID + "-bucket"

مرحله ۳: وارد کردن کتابخانه‌ها

برای وارد کردن کتابخانه‌هایی که در طول این آزمایشگاه کد استفاده خواهیم کرد، موارد زیر را اضافه کنید:

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline

from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

مرحله ۴: تعریف ثابت‌ها

آخرین کاری که قبل از ساخت pipeline باید انجام دهیم، تعریف چند متغیر ثابت است. PIPELINE_ROOT مسیر ذخیره‌سازی ابری است که مصنوعات ایجاد شده توسط pipeline ما در آن نوشته می‌شوند. ما در اینجا us-central1 به عنوان منطقه استفاده می‌کنیم، اما اگر هنگام ایجاد bucket خود از منطقه دیگری استفاده کرده‌اید، متغیر REGION را در کد زیر به‌روزرسانی کنید:

PATH=%env PATH
%env PATH={PATH}:/home/jupyter/.local/bin
REGION="us-central1"

PIPELINE_ROOT = f"{BUCKET_NAME}/pipeline_root/"
PIPELINE_ROOT

پس از اجرای کد بالا، باید دایرکتوری ریشه خط لوله خود را مشاهده کنید. این مکان ذخیره‌سازی ابری است که مصنوعات خط لوله شما در آن نوشته خواهد شد. این فرمت به صورت gs://YOUR-BUCKET-NAME/pipeline_root/ خواهد بود.

۵. پیکربندی یک مدل آموزشی سفارشی

قبل از اینکه خط لوله خود را راه‌اندازی کنیم، باید کد مربوط به کار آموزش مدل سفارشی خود را بنویسیم. برای آموزش مدل، از مجموعه داده‌های لوبیای خشک UCI Machine Learning استفاده خواهیم کرد، از: KOKLU, M. and OZKAN, IA, (2020), "Multiclass Classification of Dry Beans Using Computer Vision and Machine Learning Techniques." در Computers and Electronics in Agriculture, 174, 105507. DOI .

اولین مرحله‌ی خط لوله‌ی ما، ایجاد یک مجموعه داده‌ی مدیریت‌شده در Vertex AI با استفاده از یک جدول BigQuery است که شامل نسخه‌ی از داده‌های این لوبیاها است. این مجموعه داده به عنوان ورودی به کار آموزشی ما ارسال خواهد شد. در کد آموزشی خود، به متغیر محیطی برای دسترسی به این مجموعه داده‌ی مدیریت‌شده دسترسی خواهیم داشت.

در اینجا نحوه تنظیم شغل آموزشی سفارشی خود را آورده‌ایم:

  • یک مدل DecisionTreeClassifier از Scikit-learn بنویسید تا انواع bean را در داده‌های ما طبقه‌بندی کند.
  • کد آموزشی را در یک کانتینر داکر بسته‌بندی کنید و آن را به رجیستری کانتینر منتقل کنید

از آنجا، ما می‌توانیم یک کار آموزش هوش مصنوعی Vertex را مستقیماً از خط تولید خود شروع کنیم. بیایید شروع کنیم!

مرحله ۱: کد آموزشی خود را در یک کانتینر داکر تعریف کنید

از نمونه‌ی نوت‌بوک‌هایتان، لانچر را باز کنید و ترمینال را انتخاب کنید:

ترمینال را باز کنید

سپس دستور زیر را اجرا کنید تا یک دایرکتوری ایجاد شود که کد کانتینر شده خود را در آن اضافه کنید:

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

پس از اجرای این دستورات، باید دایرکتوری به نام traincontainer/ را در سمت چپ ایجاد شده ببینید (ممکن است برای دیدن آن لازم باشد روی نماد refresh کلیک کنید). موارد زیر را در دایرکتوری traincontainer/ خود مشاهده خواهید کرد:

+ Dockerfile
+ trainer/
    + train.py

اولین قدم ما در کانتینرایز کردن کد، ایجاد یک Dockerfile است. در Dockerfile خود، تمام دستورات مورد نیاز برای اجرای ایمیج خود را قرار خواهیم داد. این فایل، تمام کتابخانه‌هایی را که استفاده می‌کنیم نصب می‌کند و نقطه ورود کد آموزشی ما را تنظیم می‌کند. Dockerfile که تازه ایجاد کرده‌اید را باز کنید و موارد زیر را اضافه کنید:

FROM gcr.io/deeplearning-platform-release/sklearn-cpu.0-23
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

RUN pip install sklearn google-cloud-bigquery joblib pandas google-cloud-storage

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

برای ذخیره فایل‌ها هنگام ویرایش آنها در نمونه نوت‌بوک خود، می‌توانید ctrl+s استفاده کنید.

سپس، فایل train.py را باز کنید. اینجا جایی است که کد آموزشی خود را اضافه خواهیم کرد. کد زیر را در train.py کپی کنید. این فایل داده‌ها را از مجموعه داده مدیریت‌شده ما بازیابی می‌کند، آن را در یک قاب داده Pandas قرار می‌دهد، یک مدل Scikit-learn را آموزش می‌دهد و مدل آموزش‌دیده را در فضای ذخیره‌سازی ابری آپلود می‌کند:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from google.cloud import bigquery
from google.cloud import storage
from joblib import dump

import os
import pandas as pd

bqclient = bigquery.Client()
storage_client = storage.Client()

def download_table(bq_table_uri: str):
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix):]

    table = bigquery.TableReference.from_string(bq_table_uri)
    rows = bqclient.list_rows(
        table,
    )
    return rows.to_dataframe(create_bqstorage_client=False)

# These environment variables are from Vertex AI managed datasets
training_data_uri = os.environ["AIP_TRAINING_DATA_URI"]
test_data_uri = os.environ["AIP_TEST_DATA_URI"]

# Download data into Pandas DataFrames, split into train / test
df = download_table(training_data_uri)
test_df = download_table(test_data_uri)
labels = df.pop("Class").tolist()
data = df.values.tolist()
test_labels = test_df.pop("Class").tolist()
test_data = test_df.values.tolist()

# Define and train the Scikit model
skmodel = DecisionTreeClassifier()
skmodel.fit(data, labels)
score = skmodel.score(test_data, test_labels)
print('accuracy is:',score)

# Save the model to a local file
dump(skmodel, "model.joblib")

# Upload the saved model file to GCS
bucket = storage_client.get_bucket("YOUR_GCS_BUCKET")
model_directory = os.environ["AIP_MODEL_DIR"]
storage_path = os.path.join(model_directory, "model.joblib")
blob = storage.blob.Blob.from_string(storage_path, client=storage_client)
blob.upload_from_filename("model.joblib")

سپس، به نوت‌بوک خود برگردید و دستور زیر را اجرا کنید تا YOUR_GCS_BUCKET از اسکریپت بالا را با نام مخزن ذخیره‌سازی ابری خود جایگزین کنید:

BUCKET = BUCKET_NAME[5:] # Trim the 'gs://' before adding to train script
!sed -i -r 's@YOUR_GCS_BUCKET@'"$BUCKET"'@' traincontainer/trainer/train.py

در صورت تمایل می‌توانید این کار را به صورت دستی نیز انجام دهید. در این صورت، هنگام به‌روزرسانی اسکریپت، مطمئن شوید که gs:// را در نام باکت خود وارد نکرده‌اید.

اکنون کد آموزشی ما در یک کانتینر داکر قرار دارد و ما آماده اجرای آموزش در فضای ابری هستیم.

مرحله 2: قرار دادن کانتینر در رجیستری کانتینر

با تکمیل کد آموزشی، آماده‌ایم تا آن را به رجیستری کانتینر گوگل ارسال کنیم. بعداً وقتی کامپوننت آموزشی خط لوله خود را پیکربندی کردیم، خطوط لوله ورتکس را به این کانتینر ارجاع خواهیم داد.

به ترمینال خود برگردید و از ریشه دایرکتوری traincontainer/ ، یک متغیر با آدرس URL مربوط به تصویر کانتینر خود در رجیستری کانتینر تعریف کنید.

PROJECT_ID=$(gcloud config get-value project)
IMAGE_URI="gcr.io/$PROJECT_ID/scikit:v1"

سپس، با اجرای دستور زیر، کانتینر خود را بسازید:

docker build ./ -t $IMAGE_URI

در نهایت، کانتینر را به رجیستری کانتینرها منتقل کنید:

docker push $IMAGE_URI

برای تأیید وجود کانتینر، به بخش ثبت کانتینر در کنسول ابری خود بروید. چیزی شبیه به این خواهد بود:

رجیستری کانتینر

۶. پیکربندی یک کار پیش‌بینی دسته‌ای

آخرین مرحله از خط لوله ما، اجرای یک کار پیش‌بینی دسته‌ای خواهد بود. برای اینکه این کار انجام شود، باید یک فایل CSV در فضای ذخیره‌سازی ابری ارائه دهیم که شامل مثال‌هایی باشد که می‌خواهیم پیش‌بینی‌ها را روی آنها انجام دهیم. ما این فایل CSV را در دفترچه یادداشت خود ایجاد کرده و با استفاده از ابزار خط فرمان gsutil آن را در فضای ذخیره‌سازی ابری کپی می‌کنیم.

کپی کردن نمونه‌های پیش‌بینی دسته‌ای به فضای ذخیره‌سازی ابری

فایل زیر شامل ۳ مثال از هر کلاس در مجموعه داده beans ما است. مثال زیر شامل ستون Class نمی‌شود زیرا مدل ما این ستون را پیش‌بینی خواهد کرد. برای ایجاد این فایل CSV به صورت محلی در دفترچه یادداشت خود، دستور زیر را اجرا کنید:

%%writefile batch_examples.csv
Area,Perimeter,MajorAxisLength,MinorAxisLength,AspectRation,Eccentricity,ConvexArea,EquivDiameter,Extent,Solidity,roundness,Compactness,ShapeFactor1,ShapeFactor2,ShapeFactor3,ShapeFactor4
23288,558.113,207.567738,143.085693,1.450653336,0.7244336162,23545,172.1952453,0.8045881703,0.9890847314,0.9395021523,0.8295857874,0.008913077034,0.002604069884,0.6882125787,0.9983578734
23689,575.638,205.9678003,146.7475015,1.403552348,0.7016945718,24018,173.6714472,0.7652721693,0.9863019402,0.8983750474,0.8431970773,0.00869465998,0.002711119968,0.7109813112,0.9978994889
23727,559.503,189.7993849,159.3717704,1.190922235,0.5430731512,24021,173.8106863,0.8037601626,0.9877607094,0.952462433,0.9157600082,0.007999299741,0.003470231343,0.8386163926,0.9987269085
31158,641.105,212.0669751,187.1929601,1.132879009,0.4699241567,31474,199.1773023,0.7813134733,0.989959967,0.9526231013,0.9392188582,0.0068061806,0.003267009878,0.8821320637,0.9993488983
32514,649.012,221.4454899,187.1344232,1.183349841,0.5346736437,32843,203.4652564,0.7849831,0.9899826447,0.9700068737,0.9188051492,0.00681077351,0.002994124691,0.8442029022,0.9989873701
33078,659.456,235.5600775,178.9312328,1.316483846,0.6503915309,33333,205.2223615,0.7877214708,0.9923499235,0.9558229607,0.8712102818,0.007121351881,0.002530662194,0.7590073551,0.9992209221
33680,683.09,256.203255,167.9334938,1.525623324,0.7552213942,34019,207.081404,0.80680321,0.9900349805,0.9070392732,0.8082699962,0.007606985006,0.002002710402,0.6533003868,0.9966903078
33954,716.75,277.3684803,156.3563259,1.773951126,0.825970469,34420,207.9220419,0.7994819873,0.9864613597,0.8305492781,0.7496238998,0.008168948587,0.001591181142,0.5619359911,0.996846984
36322,719.437,272.0582306,170.8914975,1.591993952,0.7780978465,36717,215.0502424,0.7718560075,0.9892420405,0.8818487005,0.7904566678,0.007490177594,0.001803782407,0.6248217437,0.9947124371
36675,742.917,285.8908964,166.8819538,1.713132487,0.8119506999,37613,216.0927123,0.7788277766,0.9750618137,0.8350248381,0.7558572692,0.0077952528,0.001569528272,0.5713202115,0.9787472145
37454,772.679,297.6274753,162.1493177,1.835514817,0.8385619338,38113,218.3756257,0.8016695205,0.9827093118,0.7883332637,0.7337213257,0.007946480356,0.001420623993,0.5383469838,0.9881438654
37789,766.378,313.5680678,154.3409867,2.031657789,0.8704771226,38251,219.3500608,0.7805870567,0.9879218844,0.8085170916,0.6995293312,0.008297866252,0.001225659709,0.4893412853,0.9941740339
47883,873.536,327.9986493,186.5201272,1.758516115,0.822571799,48753,246.9140116,0.7584464543,0.9821549443,0.7885506623,0.7527897207,0.006850002074,0.00135695419,0.5666923636,0.9965376533
49777,861.277,300.7570338,211.6168613,1.42123379,0.7105823885,50590,251.7499649,0.8019106536,0.9839296304,0.843243269,0.8370542883,0.00604208839,0.001829706116,0.7006598815,0.9958014989
49882,891.505,357.1890036,179.8346914,1.986207449,0.8640114945,51042,252.0153467,0.7260210171,0.9772736178,0.7886896753,0.7055518063,0.007160679276,0.001094585314,0.4978033513,0.9887407248
53249,919.923,325.3866286,208.9174205,1.557489212,0.7666552108,54195,260.3818974,0.6966846347,0.9825445152,0.7907120655,0.8002231025,0.00611066177,0.001545654241,0.6403570138,0.9973491406
61129,964.969,369.3481688,210.9473449,1.750902193,0.8208567513,61796,278.9836198,0.7501135067,0.9892064211,0.8249553283,0.7553404711,0.006042110436,0.001213219664,0.5705392272,0.9989583843
61918,960.372,353.1381442,224.0962377,1.575832543,0.7728529173,62627,280.7782864,0.7539207091,0.9886790043,0.8436218213,0.7950947556,0.005703319619,0.00140599258,0.6321756704,0.9962029945
141953,1402.05,524.2311633,346.3974998,1.513380332,0.7505863011,143704,425.1354762,0.7147107987,0.9878152313,0.9074598849,0.8109694843,0.003692991084,0.0009853172185,0.6576715044,0.9953071199
145285,1440.991,524.9567463,353.0769977,1.486805285,0.7400216694,146709,430.0960442,0.7860466375,0.9902937107,0.8792413513,0.8192980608,0.003613289371,0.001004269363,0.6712493125,0.9980170255
146153,1476.383,526.1933264,356.528288,1.475881001,0.7354662103,149267,431.3789276,0.7319360978,0.9791380546,0.8425962592,0.8198107159,0.003600290972,0.001003163512,0.6720896099,0.991924286

سپس، فایل را در فضای ذخیره‌سازی ابری خود کپی کنید:

!gsutil cp batch_examples.csv $BUCKET_NAME

ما در مرحله بعدی، هنگام تعریف pipeline خود، به این فایل ارجاع خواهیم داد.

۷. ساخت خط لوله با اجزای از پیش ساخته شده

اکنون که کد آموزشی ما در فضای ابری قرار دارد، آماده‌ایم تا آن را از خط لوله خود فراخوانی کنیم. خط لوله‌ای که تعریف خواهیم کرد از سه کامپوننت از پیش ساخته شده از کتابخانه google_cloud_pipeline_components که قبلاً نصب کردیم، استفاده خواهد کرد. این کامپوننت‌های از پیش تعریف شده، کدی را که باید برای راه‌اندازی خط لوله خود بنویسیم، ساده می‌کنند و به ما امکان می‌دهند از سرویس‌های هوش مصنوعی Vertex مانند آموزش مدل و پیش‌بینی دسته‌ای استفاده کنیم.

کاری که خط لوله سه مرحله‌ای ما انجام خواهد داد به شرح زیر است:

  • ایجاد یک مجموعه داده مدیریت‌شده در Vertex AI
  • با استفاده از کانتینر سفارشی که تنظیم کرده‌ایم، یک کار آموزشی را روی Vertx AI اجرا کنید
  • اجرای یک کار پیش‌بینی دسته‌ای روی مدل طبقه‌بندی آموزش‌دیده‌ی Scikit-learn

مرحله ۱: خط لوله خود را تعریف کنید

از آنجا که ما از اجزای از پیش ساخته شده استفاده می‌کنیم، می‌توانیم کل خط لوله خود را در تعریف خط لوله تنظیم کنیم. موارد زیر را به یک سلول نوت بوک اضافه کنید:

@pipeline(name="automl-beans-custom",
                  pipeline_root=PIPELINE_ROOT)
def pipeline(
    bq_source: str = "bq://sara-vertex-demos.beans_demo.large_dataset",
    bucket: str = BUCKET_NAME,
    project: str = PROJECT_ID,
    gcp_region: str = REGION,
    bq_dest: str = "",
    container_uri: str = "",
    batch_destination: str = ""
):
    dataset_create_op = gcc_aip.TabularDatasetCreateOp(
        display_name="tabular-beans-dataset",
        bq_source=bq_source,
        project=project,
        location=gcp_region
    )

    training_op = gcc_aip.CustomContainerTrainingJobRunOp(
        display_name="pipeline-beans-custom-train",
        container_uri=container_uri,
        project=project,
        location=gcp_region,
        dataset=dataset_create_op.outputs["dataset"],
        staging_bucket=bucket,
        training_fraction_split=0.8,
        validation_fraction_split=0.1,
        test_fraction_split=0.1,
        bigquery_destination=bq_dest,
        model_serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest",
        model_display_name="scikit-beans-model-pipeline",
        machine_type="n1-standard-4",
    )
    batch_predict_op = gcc_aip.ModelBatchPredictOp(
        project=project,
        location=gcp_region,
        job_display_name="beans-batch-predict",
        model=training_op.outputs["model"],
        gcs_source_uris=["{0}/batch_examples.csv".format(BUCKET_NAME)],
        instances_format="csv",
        gcs_destination_output_uri_prefix=batch_destination,
        machine_type="n1-standard-4"
    )

مرحله ۲: کامپایل و اجرای پایپ‌لاین

با تعریف خط لوله، آماده کامپایل آن هستید. دستور زیر یک فایل JSON ایجاد می‌کند که برای اجرای خط لوله از آن استفاده خواهید کرد:

compiler.Compiler().compile(
    pipeline_func=pipeline, package_path="custom_train_pipeline.json"
)

سپس، یک متغیر TIMESTAMP ایجاد کنید. ما از این در شناسه شغل خود استفاده خواهیم کرد:

from datetime import datetime

TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")

سپس کار پایپ‌لاین خود را تعریف کنید و چند پارامتر مختص پروژه را به آن اضافه کنید:

pipeline_job = aiplatform.PipelineJob(
    display_name="custom-train-pipeline",
    template_path="custom_train_pipeline.json",
    job_id="custom-train-pipeline-{0}".format(TIMESTAMP),
    parameter_values={
        "project": PROJECT_ID,
        "bucket": BUCKET_NAME,
        "bq_dest": "bq://{0}".format(PROJECT_ID),
        "container_uri": "gcr.io/{0}/scikit:v1".format(PROJECT_ID),
        "batch_destination": "{0}/batchpredresults".format(BUCKET_NAME)
    },
    enable_caching=True,
)

در نهایت، کار را اجرا کنید تا یک اجرای خط لوله جدید ایجاد شود:

pipeline_job.submit()

پس از اجرای این سلول، باید گزارش‌هایی را با پیوندی برای مشاهده‌ی اجرای خط لوله در کنسول خود مشاهده کنید:

گزارش‌های کار خط لوله

به آن لینک بروید. همچنین می‌توانید با باز کردن داشبورد Pipelines خود به آن دسترسی پیدا کنید. پس از تکمیل، Pipeline شما باید به این شکل باشد:

خط لوله معرفی تکمیل شده

اجرای این خط لوله ۵ تا ۱۰ دقیقه طول می‌کشد، اما می‌توانید قبل از اتمام آن به مرحله بعدی بروید. در ادامه درباره آنچه در هر یک از این مراحل خط لوله اتفاق می‌افتد، اطلاعات بیشتری کسب خواهید کرد.

۸. درک اجرای خط لوله (pipeline)

بیایید عمیق‌تر به هر یک از سه مرحله‌ی خط تولید خود بپردازیم.

مرحله اول پایپ‌لاین: ایجاد یک مجموعه داده مدیریت‌شده

اولین قدم در خط لوله ما، ایجاد یک مجموعه داده مدیریت‌شده در Vertex AI است. اگر روی لینک مجموعه داده زیر در بخش خطوط لوله کنسول خود کلیک کنید:

پیوند به مجموعه داده‌ها از خط لوله

مجموعه داده‌های خود را در Vertex AI مشاهده خواهید کرد که شامل لینکی به منبع داده در BigQuery به همراه اطلاعات مربوط به ستون‌های مختلف در مجموعه داده‌های شما است. پس از آپلود یک مجموعه داده مدیریت‌شده در Vertex AI، می‌توان از آن برای آموزش یک مدل AutoML یا سفارشی استفاده کرد.

برای کارهای مدل‌سازی سفارشی که از مجموعه داده‌های مدیریت‌شده استفاده می‌کنند، Vertex AI متغیرهای محیطی ویژه‌ای را به کارهای آموزشی شما ارسال می‌کند و تقسیم داده‌های شما به مجموعه‌های آموزشی و آزمایشی را مدیریت می‌کند. ما از این در مرحله بعدی خط تولید خود استفاده خواهیم کرد.

مرحله دوم خط لوله: آموزش یک مدل در Vertex AI Training

در حالی که کار آموزشی سفارشی شما در حال اجرا است، می‌توانید برای مشاهده مستقیم گزارش‌ها در کنسول Vertex Pipelines کلیک کنید:

گزارش‌های آموزشی سفارشی

همچنین می‌توانید جزئیات مربوط به کار آموزشی سفارشی را در داشبورد آموزش Vertex AI خود مشاهده کنید. پس از اتمام کار آموزشی، یک منبع مدل در Vertex AI ایجاد می‌شود. سپس می‌توانیم این مدل را برای پیش‌بینی‌های آنلاین در یک نقطه پایانی مستقر کنیم یا یک کار پیش‌بینی دسته‌ای ایجاد کنیم که در مرحله بعدی خط تولید خود انجام خواهیم داد.

مرحله سوم خط لوله: اجرای یک کار پیش‌بینی دسته‌ای روی مدل ما

در نهایت، خط لوله ما پیش‌بینی‌های مربوط به مثال‌هایی را که از طریق یک فایل CSV ارسال کرده‌ایم، دریافت می‌کند. هنگامی که کار پیش‌بینی دسته‌ای تکمیل شد، Vertex AI یک فایل CSV را در مکانی که در Cloud Storage مشخص کرده‌ایم، می‌نویسد. هنگامی که این مرحله خط لوله شروع به اجرا می‌کند، می‌توانید به بخش پیش‌بینی‌های دسته‌ای کنسول Vertex AI خود بروید تا کار ایجاد شده را ببینید.

برای مشاهده آدرس اینترنتی ذخیره‌سازی ابری پیش‌بینی‌های دسته‌ای خود، پس از اتمام کار، روی آن کلیک کنید:

کار پیش‌بینی دسته‌ای

روی آن لینک کلیک کنید تا به دایرکتوری Cloud Storage بروید، جایی که می‌توانید نتایج پیش‌بینی را پیدا کنید، و سپس برای دانلود یکی از فایل‌های prediction.results کلیک کنید. در فایل، باید ردیف‌هایی را ببینید که شبیه به موارد زیر هستند:

{"instance": [33954.0, 716.75, 277.3684803, 156.3563259, 1.773951126, 0.825970469, 34420.0, 207.9220419, 0.7994819873, 0.9864613597, 0.8305492781, 0.7496238998, 0.008168948587, 0.001591181142, 0.5619359911, 0.996846984], "prediction": "HOROZ"}

این شامل مقادیر ویژگی برای یک نمونه خاص، به همراه کلاسی که مدل ما پیش‌بینی کرده است، می‌شود. برای این مثال، مدل ما فکر می‌کند که این یک بین "HOROZ" بوده است.

با این کار، آزمایشگاه را تمام کردید!

🎉 تبریک می‌گویم! 🎉

شما یاد گرفتید که چگونه از Vertex AI برای موارد زیر استفاده کنید:

  • استفاده از Kubeflow Pipelines SDK برای ساخت خطوط لوله سرتاسری با اجزای سفارشی
  • خطوط لوله خود را روی Vertex Pipelines اجرا کنید و اجرای خطوط لوله را با SDK آغاز کنید.
  • نمودار Vertex Pipelines خود را در کنسول مشاهده و تحلیل کنید
  • از اجزای خط لوله از پیش ساخته شده برای افزودن سرویس‌های هوش مصنوعی Vertex به خط لوله خود استفاده کنید
  • زمانبندی کارهای تکراری خط لوله

برای کسب اطلاعات بیشتر در مورد بخش‌های مختلف Vertex، مستندات آن را بررسی کنید.

۹. پاکسازی

برای اینکه هزینه‌ای از شما کسر نشود، توصیه می‌شود منابع ایجاد شده در طول این آزمایش را حذف کنید.

مرحله ۱: نمونه Notebooks خود را متوقف یا حذف کنید

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

مثال را متوقف کنید

مرحله ۲: سطل ذخیره‌سازی ابری خود را حذف کنید

برای حذف Storage Bucket، با استفاده از منوی ناوبری در Cloud Console خود، به Storage بروید، Bucket خود را انتخاب کنید و روی Delete کلیک کنید:

حذف فضای ذخیره‌سازی