Vertex AI: از روتین های پیش بینی سفارشی با Sklearn برای پیش پردازش و پس پردازش داده ها برای پیش بینی ها استفاده کنید.

1. بررسی اجمالی

در این آزمایشگاه، نحوه استفاده از روال‌های پیش‌بینی سفارشی در Vertex AI برای نوشتن منطق پیش‌پردازش و پس پردازش سفارشی را خواهید آموخت. در حالی که این نمونه از Scikit-learn استفاده می‌کند، روال‌های پیش‌بینی سفارشی می‌توانند با سایر چارچوب‌های Python ML مانند XGBoost، PyTorch و TensorFlow کار کنند.

چیزی که یاد می گیرید

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

  • منطق پیش‌بینی سفارشی را با روال‌های پیش‌بینی سفارشی بنویسید
  • ظرف سرو سفارشی و مدل را به صورت محلی تست کنید
  • ظرف سرو سفارشی را روی Vertex AI Predictions آزمایش کنید

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

2. مقدمه ای بر Vertex AI

این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می کند. Vertex AI پیشنهادات ML را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می کند. پیش از این، مدل‌های آموزش دیده با AutoML و مدل‌های سفارشی از طریق سرویس‌های جداگانه قابل دسترسی بودند. پیشنهاد جدید هر دو را به همراه سایر محصولات جدید در یک API واحد ترکیب می کند. همچنین می توانید پروژه های موجود را به Vertex AI منتقل کنید.

Vertex AI شامل بسیاری از محصولات مختلف برای پشتیبانی از گردش کار ML سرتاسر است. این آزمایشگاه بر روی پیش بینی ها و میز کار تمرکز خواهد کرد.

نمای کلی محصول Vertex

3. از Case Overview استفاده کنید

استفاده از مورد

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

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

مقدمه ای بر روال های پیش بینی سفارشی

کانتینرهای از پیش ساخته شده با هوش مصنوعی Vertex با انجام عملیات پیش‌بینی چارچوب یادگیری ماشین، درخواست‌های پیش‌بینی را انجام می‌دهند. قبل از روال‌های پیش‌بینی سفارشی، اگر می‌خواهید قبل از انجام پیش‌بینی، ورودی را از قبل پردازش کنید، یا پیش‌بینی مدل را قبل از برگرداندن نتیجه پس پردازش کنید، باید یک ظرف سفارشی بسازید.

ساختن یک کانتینر سرویس سفارشی نیاز به نوشتن یک سرور HTTP دارد که مدل آموزش دیده را بپیچد، درخواست‌های HTTP را به ورودی‌های مدل ترجمه کند و خروجی‌های مدل را به پاسخ‌ها ترجمه کند.

با روال‌های پیش‌بینی سفارشی، Vertex AI مؤلفه‌های مربوط به سرویس را برای شما فراهم می‌کند تا بتوانید روی مدل و تغییر داده‌های خود تمرکز کنید.

4. محیط خود را تنظیم کنید

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

مرحله 1: Compute Engine API را فعال کنید

به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید. برای ایجاد نمونه نوت بوک خود به این نیاز دارید.

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

به رجیستری Artifact بروید و اگر قبلاً وجود ندارد، Enable را انتخاب کنید. از این برای ایجاد یک ظرف سرو سفارشی استفاده خواهید کرد.

مرحله 3: Vertex AI API را فعال کنید

به بخش Vertex AI در Cloud Console خود بروید و روی Enable Vertex AI API کلیک کنید.

داشبورد Vertex AI

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

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

منوی Vertex AI

اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.

Notebook_api

پس از فعال شدن، روی INSTANCES کلیک کنید و سپس CREATE NEW را انتخاب کنید.

گزینه های پیش فرض را بپذیرید و روی ایجاد کلیک کنید.

وقتی نمونه آماده شد، روی OPEN JUPYTERLAB کلیک کنید تا نمونه باز شود.

5. کد آموزشی را بنویسید

مرحله 1: یک سطل ذخیره سازی ابری ایجاد کنید

شما مدل و مصنوعات در حال پیش پردازش را در یک سطل Cloud Storage ذخیره خواهید کرد. اگر قبلاً یک سطل در پروژه خود دارید که می خواهید از آن استفاده کنید، می توانید از این مرحله صرف نظر کنید.

از لانچر یک جلسه ترمینال جدید باز کنید.

Open_terminal

از ترمینال خود، موارد زیر را اجرا کنید تا یک متغیر env برای پروژه خود تعریف کنید و مطمئن شوید که your-cloud-project با شناسه پروژه خود جایگزین کنید:

PROJECT_ID='your-cloud-project'

در مرحله بعد، موارد زیر را در ترمینال خود اجرا کنید تا یک سطل جدید در پروژه خود ایجاد کنید.

BUCKET="gs://${PROJECT_ID}-cpr-bucket"
gsutil mb -l us-central1 $BUCKET

مرحله 2: مدل قطار

از ترمینال، یک دایرکتوری جدید به نام cpr-codelab ایجاد کنید و cd در آن ایجاد کنید.

mkdir cpr-codelab
cd cpr-codelab

در مرورگر فایل، به دایرکتوری جدید cpr-codelab بروید و سپس از راه‌انداز برای ایجاد یک نوت بوک جدید پایتون 3 به نام task.ipynb استفاده کنید.

file_browser

دایرکتوری cpr-codelab شما اکنون باید به شکل زیر باشد:

+ cpr-codelab/
    + task.ipynb

در نوت بوک کد زیر را بچسبانید.

ابتدا یک فایل requirements.txt بنویسید.

%%writefile requirements.txt
fastapi
uvicorn==0.17.6
joblib~=1.0
numpy~=1.20
scikit-learn>=1.2.2
pandas
google-cloud-storage>=1.26.0,<2.0.0dev
google-cloud-aiplatform[prediction]>=1.16.0

مدلی که استقرار می‌کنید مجموعه‌ای از وابستگی‌های از پیش نصب شده متفاوت از محیط نوت بوک شما دارد. به همین دلیل، می‌خواهید همه وابستگی‌های مدل را در requirements.txt فهرست کنید و سپس از pip برای نصب دقیقاً همان وابستگی‌ها در نوت‌بوک استفاده کنید. بعداً، قبل از استقرار در Vertex AI مدل را به صورت محلی آزمایش خواهید کرد تا دوبار بررسی کنید که محیط ها مطابقت دارند.

Pip وابستگی ها را در نوت بوک نصب می کند.

!pip install -U --user -r requirements.txt

توجه داشته باشید که پس از اتمام نصب پیپ، باید کرنل را مجددا راه اندازی کنید.

restart_kernel

سپس، دایرکتوری هایی را ایجاد کنید که در آن مدل و مصنوعات پیش پردازش را ذخیره می کنید.

USER_SRC_DIR = "src_dir"
!mkdir $USER_SRC_DIR
!mkdir model_artifacts

# copy the requirements to the source dir
!cp requirements.txt $USER_SRC_DIR/requirements.txt

دایرکتوری cpr-codelab شما اکنون باید به شکل زیر باشد:

+ cpr-codelab/
    + model_artifacts/
    + scr_dir/
        + requirements.txt
    + task.ipynb
    + requirements.txt

اکنون که ساختار دایرکتوری تنظیم شده است، زمان آموزش یک مدل است!

ابتدا کتابخانه ها را وارد کنید.

import seaborn as sns
import numpy as np
import pandas as pd

from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer

import joblib
import logging

# set logging to see the docker container logs
logging.basicConfig(level=logging.INFO)

سپس متغیرهای زیر را تعریف کنید. حتماً PROJECT_ID با شناسه پروژه خود و BUCKET_NAME با سطلی که در مرحله قبل ایجاد کردید جایگزین کنید.

REGION = "us-central1"
MODEL_ARTIFACT_DIR = "sklearn-model-artifacts"
REPOSITORY = "diamonds"
IMAGE = "sklearn-image"
MODEL_DISPLAY_NAME = "diamonds-cpr"

# Replace with your project
PROJECT_ID = "{PROJECT_ID}"

# Replace with your bucket
BUCKET_NAME = "gs://{BUCKET_NAME}"

داده ها را از کتابخانه seaborn بارگیری کنید و سپس دو قاب داده ایجاد کنید، یکی با ویژگی ها و دیگری با برچسب.

data = sns.load_dataset('diamonds', cache=True, data_home=None)

label = 'price'

y_train = data['price']
x_train = data.drop(columns=['price'])

بیایید نگاهی به داده های آموزشی بیندازیم. می توانید ببینید که هر ردیف نشان دهنده یک الماس است.

x_train.head()

و برچسب ها که قیمت های مربوطه هستند.

y_train.head()

اکنون، یک تبدیل ستون Sklearn را به یک رمزگذاری داغ ویژگی های طبقه بندی و مقیاس ویژگی های عددی تعریف کنید.

column_transform = make_column_transformer(
    (preprocessing.OneHotEncoder(), [1,2,3]),
    (preprocessing.StandardScaler(), [0,4,5,6,7,8]))

مدل جنگل تصادفی را تعریف کنید

regr = RandomForestRegressor(max_depth=10, random_state=0)

بعد، یک خط لوله اسکلرن بسازید. این بدان معنی است که داده های تغذیه شده به این خط لوله ابتدا کدگذاری/مقیاس شده و سپس به مدل ارسال می شود.

my_pipeline = make_pipeline(column_transform, regr)

خط لوله را بر روی داده های آموزشی قرار دهید

my_pipeline.fit(x_train, y_train)

بیایید مدل را امتحان کنیم تا مطمئن شویم همانطور که انتظار می رود کار می کند. فراخوانی روش predict در مدل، عبور در یک نمونه آزمایشی.

my_pipeline.predict([[0.23, 'Ideal', 'E', 'SI2', 61.5, 55.0, 3.95, 3.98, 2.43]])

اکنون می توانیم خط لوله را در model_artifacts dir ذخیره کنیم و آن را در سطل Cloud Storage کپی کنیم.

joblib.dump(my_pipeline, 'model_artifacts/model.joblib')

!gsutil cp model_artifacts/model.joblib {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/

مرحله 3: یک مصنوع پیش پردازش را ذخیره کنید

سپس یک مصنوع پیش پردازش ایجاد می کنید. هنگامی که سرور مدل راه اندازی می شود، این مصنوع در کانتینر سفارشی بارگذاری می شود. مصنوع پیش پردازش شما می تواند تقریباً به هر شکلی باشد (مانند فایل ترشی)، اما در این مورد، یک فرهنگ لغت را در یک فایل JSON می نویسید.

clarity_dict={"Flawless": "FL",
              "Internally Flawless": "IF",
              "Very Very Slightly Included": "VVS1",
              "Very Slightly Included": "VS2",
              "Slightly Included": "S12",
              "Included": "I3"}

ویژگی clarity در داده های آموزشی ما همیشه به صورت اختصاری بود (یعنی "FL" به جای "Flawless"). در زمان ارائه، می‌خواهیم بررسی کنیم که داده‌های این ویژگی نیز به صورت اختصاری باشد. این به این دلیل است که مدل ما می داند چگونه یک "FL" را رمزگذاری کند اما "Flawless" را نه. این منطق پیش پردازش سفارشی را بعداً خواهید نوشت. اما در حال حاضر، فقط این جدول جستجو را در یک فایل json ذخیره کنید و سپس آن را در سطل Cloud Storage بنویسید.

import json
with open("model_artifacts/preprocessor.json", "w") as f:
    json.dump(clarity_dict, f)

!gsutil cp model_artifacts/preprocessor.json {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/

فهرست cpr-codelab محلی شما اکنون باید به شکل زیر باشد:

+ cpr-codelab/
    + model_artifacts/
        + model.joblib
        + preprocessor.json
    + scr_dir/
        + requirements.txt
    + task.ipynb
    + requirements.txt

6. با استفاده از سرور مدل CPR یک کانتینر خدمت سفارشی بسازید

اکنون که مدل آموزش دیده و مصنوع و پیش پردازش ذخیره شده است، زمان ساخت ظرف سرو سفارشی فرا رسیده است. به طور معمول ساختن کانتینر سرویس نیازمند نوشتن کد سرور مدل است. با این حال، با روال‌های پیش‌بینی سفارشی، Vertex AI Predictions یک سرور مدل تولید می‌کند و یک تصویر ظرف سفارشی برای شما می‌سازد.

یک ظرف سرو سفارشی شامل 3 کد زیر است:

  1. سرور مدل (این به طور خودکار توسط SDK تولید می شود و در scr_dir/ ذخیره می شود)
    • سرور HTTP که مدل را میزبانی می کند
    • مسئول تنظیم مسیرها / پورت ها / و غیره.
  2. رسیدگی کننده درخواست
    • مسئول جنبه‌های سرور وب در رسیدگی به یک درخواست، مانند غیر سریال‌سازی بدنه درخواست، و سریال‌سازی پاسخ، تنظیم سرصفحه‌های پاسخ و غیره.
    • در این مثال، از Handler پیش‌فرض، google.cloud.aiplatform.prediction.handler.PredictionHandler ارائه شده در SDK استفاده می‌کنید.
  3. پیش بینی کننده
    • مسئول منطق ML برای پردازش درخواست پیش بینی است.

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

پیشگو مسئول منطق ML برای پردازش یک درخواست پیش بینی، مانند پیش پردازش سفارشی و پس پردازش است. برای نوشتن منطق پیش‌بینی سفارشی، رابط Vertex AI Predictor را زیر کلاس می‌دهید.

این نسخه از روتین‌های پیش‌بینی سفارشی با پیش‌بینی‌کننده‌های XGBoost و Sklearn قابل استفاده مجدد ارائه می‌شود، اما اگر نیاز به استفاده از چارچوب متفاوتی دارید، می‌توانید با زیر کلاس‌بندی پیش‌بینی‌کننده پایه، چارچوب خود را ایجاد کنید.

در زیر می توانید نمونه ای از پیش بینی کننده Sklearn را مشاهده کنید. این تمام کدهایی است که برای ساخت این سرور مدل سفارشی باید بنویسید.

sklearn_predictor

کد زیر را در نوت بوک خود قرار دهید تا SklearnPredictor زیر کلاس قرار دهید و آن را در فایل پایتون در src_dir/ بنویسید. توجه داشته باشید که در این مثال ما فقط روش های load ، preprocess و postprocess را سفارشی می کنیم، نه روش predict .

%%writefile $USER_SRC_DIR/predictor.py

import joblib
import numpy as np
import json

from google.cloud import storage
from google.cloud.aiplatform.prediction.sklearn.predictor import SklearnPredictor


class CprPredictor(SklearnPredictor):

    def __init__(self):
        return

    def load(self, artifacts_uri: str) -> None:
        """Loads the sklearn pipeline and preprocessing artifact."""

        super().load(artifacts_uri)

        # open preprocessing artifact
        with open("preprocessor.json", "rb") as f:
            self._preprocessor = json.load(f)


    def preprocess(self, prediction_input: np.ndarray) -> np.ndarray:
        """Performs preprocessing by checking if clarity feature is in abbreviated form."""

        inputs = super().preprocess(prediction_input)

        for sample in inputs:
            if sample[3] not in self._preprocessor.values():
                sample[3] = self._preprocessor[sample[3]]
        return inputs

    def postprocess(self, prediction_results: np.ndarray) -> dict:
        """Performs postprocessing by rounding predictions and converting to str."""

        return {"predictions": [f"${value}" for value in np.round(prediction_results)]}

بیایید نگاهی عمیق تر به هر یک از این روش ها بیندازیم.

  • روش load در مصنوع پیش پردازش بارگذاری می شود، که در این مورد فرهنگ لغت است که مقادیر شفافیت الماس را به اختصارات آنها نگاشت می کند.
  • روش preprocess از آن مصنوع استفاده می کند تا اطمینان حاصل کند که در زمان ارائه ویژگی وضوح در قالب اختصاری آن است. اگر نه، رشته کامل را به مخفف خود تبدیل می کند.
  • متد postprocess مقدار پیش بینی شده را به صورت رشته ای با علامت $ برمی گرداند و مقدار را گرد می کند.

در مرحله بعد، از Vertex AI Python SDK برای ساخت تصویر استفاده کنید. با استفاده از روال های پیش بینی سفارشی، Dockerfile تولید می شود و تصویر برای شما ساخته می شود.

from google.cloud import aiplatform

aiplatform.init(project=PROJECT_ID, location=REGION)

import os

from google.cloud.aiplatform.prediction import LocalModel

from src_dir.predictor import CprPredictor  # Should be path of variable $USER_SRC_DIR

local_model = LocalModel.build_cpr_model(
    USER_SRC_DIR,
    f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
    predictor=CprPredictor,
    requirements_path=os.path.join(USER_SRC_DIR, "requirements.txt"),
)

یک فایل تست با دو نمونه برای پیش بینی بنویسید. یکی از نمونه ها دارای نام اختصاری وضوح است، اما دیگری باید ابتدا تبدیل شود.

import json

sample = {"instances": [
  [0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
  [0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}

with open('instances.json', 'w') as fp:
    json.dump(sample, fp)

با استقرار یک مدل محلی، ظرف را به صورت محلی آزمایش کنید.

with local_model.deploy_to_local_endpoint(
    artifact_uri = 'model_artifacts/', # local path to artifacts
) as local_endpoint:
    predict_response = local_endpoint.predict(
        request_file='instances.json',
        headers={"Content-Type": "application/json"},
    )

    health_check_response = local_endpoint.run_health_check()

شما می توانید نتایج پیش بینی را با:

predict_response.content

7. استقرار مدل به Vertex AI

اکنون که کانتینر را به صورت محلی آزمایش کردید، زمان آن رسیده است که تصویر را به Artifact Registry فشار دهید و مدل را در Vertex AI Model Registry آپلود کنید.

ابتدا Docker را برای دسترسی به رجیستری Artifact پیکربندی کنید.

!gcloud artifacts repositories create {REPOSITORY} --repository-format=docker \
--location=us-central1 --description="Docker repository"


!gcloud auth configure-docker {REGION}-docker.pkg.dev --quiet

سپس، تصویر را فشار دهید.

local_model.push_image()

و مدل رو آپلود کنید

model = aiplatform.Model.upload(local_model = local_model,
                                display_name=MODEL_DISPLAY_NAME,
                                artifact_uri=f"{BUCKET_NAME}/{MODEL_ARTIFACT_DIR}",)

وقتی مدل آپلود شد، باید آن را در کنسول ببینید:

مدل_رجیستری

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

endpoint = model.deploy(machine_type="n1-standard-2")

در نهایت، مدل مستقر شده را با پیش‌بینی آزمایش کنید.

endpoint.predict(instances=[[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43]])

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

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

  • منطق پیش پردازش و پس پردازش سفارشی را با روال های پیش بینی سفارشی بنویسید

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

8. پاکسازی

اگر می‌خواهید به استفاده از نوت‌بوکی که در این آزمایشگاه ایجاد کرده‌اید ادامه دهید، توصیه می‌شود در صورت عدم استفاده آن را خاموش کنید. از رابط کاربری Workbench در Google Cloud Console، نوت بوک را انتخاب کنید و سپس Stop را انتخاب کنید.

اگر می خواهید نوت بوک را به طور کامل حذف کنید، روی دکمه حذف در بالا سمت راست کلیک کنید.

Stop_nb

برای حذف نقطه پایانی که مستقر کرده اید، به بخش Endpoints کنسول بروید، روی نقطه پایانی که ایجاد کرده اید کلیک کنید و سپس Undeploy model from endpoint را انتخاب کنید:

delete_endpoint

برای حذف تصویر ظرف، به رجیستری مصنوع بروید، مخزن ایجاد شده را انتخاب کنید و حذف را انتخاب کنید.

حذف_تصویر

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

ذخیره سازی را حذف کنید