Vertex AI: آموزش و ارائه یک مدل سفارشی

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

در این آزمایشگاه، از Vertex AI برای آموزش و ارائه یک مدل TensorFlow با استفاده از کد در یک ظرف سفارشی استفاده خواهید کرد.

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

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

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

  • کد آموزشی مدل را در Vertex Workbench بسازید و کانتینری کنید
  • یک کار آموزش مدل سفارشی را به Vertex AI ارسال کنید
  • مدل آموزش دیده خود را در یک نقطه پایانی مستقر کنید و از آن نقطه پایانی برای دریافت پیش بینی ها استفاده کنید

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

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

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

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

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

3. محیط خود را راه اندازی کنید

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

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

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

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

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

داشبورد Vertex AI

مرحله 3: Container Registry API را فعال کنید

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

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

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

منوی Vertex AI

از آنجا، در Notebooks توسط کاربر مدیریت شده ، روی New Notebook کلیک کنید:

نوت بوک جدید ایجاد کنید

سپس آخرین نسخه از نوع نمونه TensorFlow Enterprise (با LTS) را بدون پردازنده گرافیکی انتخاب کنید:

نمونه TFE

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

مدلی که ما در این آزمایشگاه آموزش می دهیم و ارائه می کنیم بر اساس این آموزش از اسناد TensorFlow ساخته شده است. این آموزش از مجموعه داده های Auto MPG از Kaggle برای پیش بینی بهره وری سوخت یک وسیله نقلیه استفاده می کند.

4. کد آموزشی Containerize

ما این کار آموزشی را با قرار دادن کد آموزشی خود در یک ظرف Docker و فشار دادن این کانتینر به Google Container Registry به Vertex ارسال می‌کنیم. با استفاده از این رویکرد، می‌توانیم یک مدل ساخته شده با هر چارچوبی را آموزش دهیم.

برای شروع، از منوی Launcher، یک پنجره ترمینال را در نمونه نوت بوک خود باز کنید:

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

یک دایرکتوری جدید به نام mpg و cd در آن ایجاد کنید:

mkdir mpg
cd mpg

مرحله 1: یک Dockerfile ایجاد کنید

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

touch Dockerfile

Dockerfile را باز کنید و موارد زیر را در آن کپی کنید:

FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-6
WORKDIR /

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

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

این Dockerfile از تصویر Docker Deep Learning Container TensorFlow Enterprise 2.3 استفاده می کند. Deep Learning Containers در Google Cloud با بسیاری از چارچوب‌های رایج ML و علم داده از پیش نصب شده عرضه می‌شود. موردی که ما استفاده می کنیم شامل TF Enterprise 2.3، Pandas، Scikit-learn و موارد دیگر است. پس از دانلود آن تصویر، این Dockerfile نقطه ورودی کد آموزشی ما را تنظیم می کند. ما هنوز این فایل ها را ایجاد نکرده ایم – در مرحله بعد، کد آموزش و صادرات مدل خود را اضافه می کنیم.

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

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

PROJECT_ID='your-cloud-project'

در مرحله بعد، موارد زیر را در ترمینال خود اجرا کنید تا یک سطل جدید در پروژه خود ایجاد کنید. پرچم -l (موقعیت) مهم است زیرا باید در همان منطقه ای باشد که یک نقطه پایانی مدل را بعداً در آموزش مستقر می کنید:

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

مرحله 3: کد آموزشی مدل را اضافه کنید

از ترمینال خود، موارد زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون ایجاد کنید که در آن کد را اضافه می کنیم:

mkdir trainer
touch trainer/train.py

اکنون باید موارد زیر را در دایرکتوری mpg/ خود داشته باشید:

+ Dockerfile
+ trainer/
    + train.py

سپس، فایل train.py را که ایجاد کرده‌اید باز کنید و کد زیر را کپی کنید (این از آموزش در اسناد TensorFlow اقتباس شده است).

در ابتدای فایل، متغیر BUCKET را با نام Storage Bucket که در مرحله قبل ایجاد کردید، به روز کنید:

import numpy as np
import pandas as pd
import pathlib
import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers

print(tf.__version__)

"""## The Auto MPG dataset

The dataset is available from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/).

### Get the data
First download the dataset.
"""

dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
dataset_path

"""Import it using pandas"""

column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
                'Acceleration', 'Model Year', 'Origin']
dataset = pd.read_csv(dataset_path, names=column_names,
                      na_values = "?", comment='\t',
                      sep=" ", skipinitialspace=True)

dataset.tail()

# TODO: replace `your-gcs-bucket` with the name of the Storage bucket you created earlier
BUCKET = 'gs://your-gcs-bucket'

"""### Clean the data

The dataset contains a few unknown values.
"""

dataset.isna().sum()

"""To keep this initial tutorial simple drop those rows."""

dataset = dataset.dropna()

"""The `"Origin"` column is really categorical, not numeric. So convert that to a one-hot:"""

dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})

dataset = pd.get_dummies(dataset, prefix='', prefix_sep='')
dataset.tail()

"""### Split the data into train and test

Now split the dataset into a training set and a test set.

We will use the test set in the final evaluation of our model.
"""

train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)

"""### Inspect the data

Have a quick look at the joint distribution of a few pairs of columns from the training set.

Also look at the overall statistics:
"""

train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
train_stats

"""### Split features from labels

Separate the target value, or "label", from the features. This label is the value that you will train the model to predict.
"""

train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')

"""### Normalize the data

Look again at the `train_stats` block above and note how different the ranges of each feature are.

It is good practice to normalize features that use different scales and ranges. Although the model *might* converge without feature normalization, it makes training more difficult, and it makes the resulting model dependent on the choice of units used in the input.

Note: Although we intentionally generate these statistics from only the training dataset, these statistics will also be used to normalize the test dataset. We need to do that to project the test dataset into the same distribution that the model has been trained on.
"""

def norm(x):
  return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)

"""This normalized data is what we will use to train the model.

Caution: The statistics used to normalize the inputs here (mean and standard deviation) need to be applied to any other data that is fed to the model, along with the one-hot encoding that we did earlier.  That includes the test set as well as live data when the model is used in production.

## The model

### Build the model

Let's build our model. Here, we'll use a `Sequential` model with two densely connected hidden layers, and an output layer that returns a single, continuous value. The model building steps are wrapped in a function, `build_model`, since we'll create a second model, later on.
"""

def build_model():
  model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
  ])

  optimizer = tf.keras.optimizers.RMSprop(0.001)

  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae', 'mse'])
  return model

model = build_model()

"""### Inspect the model

Use the `.summary` method to print a simple description of the model
"""

model.summary()

"""Now try out the model. Take a batch of `10` examples from the training data and call `model.predict` on it.

It seems to be working, and it produces a result of the expected shape and type.

### Train the model

Train the model for 1000 epochs, and record the training and validation accuracy in the `history` object.

Visualize the model's training progress using the stats stored in the `history` object.

This graph shows little improvement, or even degradation in the validation error after about 100 epochs. Let's update the `model.fit` call to automatically stop training when the validation score doesn't improve. We'll use an *EarlyStopping callback* that tests a training condition for  every epoch. If a set amount of epochs elapses without showing improvement, then automatically stop the training.

You can learn more about this callback [here](https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping).
"""

model = build_model()

EPOCHS = 1000

# The patience parameter is the amount of epochs to check for improvement
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)

early_history = model.fit(normed_train_data, train_labels, 
                    epochs=EPOCHS, validation_split = 0.2, 
                    callbacks=[early_stop])


# Export model and save to GCS
model.save(BUCKET + '/mpg/model')

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

از ترمینال خود، یک متغیر با URI تصویر کانتینر خود در Google Container Registry تعریف کنید:

IMAGE_URI="gcr.io/$PROJECT_ID/mpg:v1"

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

docker build ./ -t $IMAGE_URI

ظرف را در نمونه نوت بوک خود اجرا کنید تا مطمئن شوید که درست کار می کند:

docker run $IMAGE_URI

این مدل باید تمرین را در 1-2 دقیقه با دقت اعتبار سنجی حدود 72٪ به پایان برساند (دقت دقیق ممکن است متفاوت باشد). هنگامی که اجرای کانتینر به صورت محلی تمام شد، آن را به Google Container Registry فشار دهید:

docker push $IMAGE_URI

با انتقال کانتینر به Container Registry، اکنون آماده شروع یک کار آموزشی مدل سفارشی هستیم.

5. یک کار آموزشی بر روی Vertex AI اجرا کنید

Vertex AI دو گزینه برای مدل های آموزشی به شما می دهد:

  • AutoML : آموزش مدل های با کیفیت بالا با حداقل تلاش و تخصص ML.
  • آموزش سفارشی : برنامه های آموزشی سفارشی خود را در فضای ابری با استفاده از یکی از کانتینرهای از پیش ساخته شده Google Cloud اجرا کنید یا از خود استفاده کنید.

در این آزمایشگاه، ما از آموزش سفارشی از طریق کانتینر سفارشی خود در Google Container Registry استفاده می‌کنیم. برای شروع، به بخش Models در بخش Vertex کنسول Cloud خود بروید:

منوی Vertex

مرحله 1: کار آموزشی را آغاز کنید

برای وارد کردن پارامترهای شغل آموزشی و مدل مستقر شده روی Create کلیک کنید:

  • در زیر مجموعه داده ، بدون مجموعه داده مدیریت شده را انتخاب کنید
  • سپس آموزش سفارشی (پیشرفته) را به عنوان روش آموزشی خود انتخاب کرده و روی Continue کلیک کنید.
  • روی Continue کلیک کنید

در مرحله بعدی، mpg (یا هر چیزی که می‌خواهید مدل خود را نام ببرید) را برای نام مدل وارد کنید. سپس Custom Container را انتخاب کنید:

گزینه کانتینر سفارشی

در کادر متنی Container image ، روی Browse کلیک کنید و تصویر Docker را که به تازگی در Container Registry آپلود کرده اید، پیدا کنید. بقیه فیلدها را خالی بگذارید و روی Continue کلیک کنید.

ما در این آموزش از تنظیم هایپرپارامتر استفاده نمی کنیم، بنابراین کادر تنظیم Hyperparameter را بدون علامت بگذارید و روی Continue کلیک کنید.

در محاسبه و قیمت گذاری ، منطقه انتخاب شده را همانطور که هست رها کنید و n1-standard-4 را به عنوان نوع دستگاه خود انتخاب کنید:

نوع ماشین

فیلدهای شتاب دهنده را خالی بگذارید و Continue را انتخاب کنید. از آنجایی که مدل در این نسخه آزمایشی به سرعت آموزش می بیند، ما از نوع ماشین کوچکتری استفاده می کنیم.

در مرحله Prediction container ، Pre-built container و سپس TensorFlow 2.6 را انتخاب کنید.

تنظیمات پیش فرض را برای کانتینر از پیش ساخته شده به همان صورت باقی بگذارید. در پوشه Model ، سطل GCS خود را با زیر شاخه mpg وارد کنید. این مسیر در اسکریپت آموزشی مدل شما است که در آن مدل آموزش دیده خود را صادر می کنید:

تنظیمات پیش بینی

Vertex وقتی مدل شما را اجرا می کند در این مکان نگاه می کند. اکنون برای آموزش آماده هستید! برای شروع کار آموزشی روی Start training کلیک کنید. در بخش Training کنسول خود، چیزی شبیه به این را خواهید دید:

مشاغل آموزشی

6. یک نقطه پایانی مدل مستقر کنید

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

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

مرحله 1: استقرار نقطه پایانی

هنگامی که کار آموزشی شما به پایان رسید، باید مدلی به نام mpg (یا هر نام دیگری که آن را نامگذاری کرده اید) در بخش Models کنسول خود مشاهده کنید:

کارهای تکمیل شده

وقتی کار آموزشی شما اجرا شد، Vertex یک منبع مدل برای شما ایجاد کرد. برای استفاده از این مدل، باید یک نقطه پایانی را مستقر کنید. در هر مدل می توانید نقاط پایانی زیادی داشته باشید. روی مدل کلیک کنید و سپس Deploy to endpoint را کلیک کنید.

Create new endpoint را انتخاب کنید و نامی مانند v1 به آن بدهید. Standard را برای Access انتخاب کنید و سپس روی Continue کلیک کنید.

تقسیم ترافیک را روی 100 بگذارید و عدد 1 را برای حداقل تعداد گره های محاسباتی وارد کنید. در قسمت Machine type ، n1-standard-2 (یا هر نوع ماشینی که دوست دارید) را انتخاب کنید. بقیه موارد پیش فرض را انتخاب کنید و سپس روی Continue کلیک کنید. ما نظارت را برای این مدل فعال نمی‌کنیم، بنابراین روی Deploy کلیک کنید تا استقرار نقطه پایانی آغاز شود.

استقرار نقطه پایانی 10 تا 15 دقیقه طول می کشد و پس از تکمیل استقرار، ایمیلی دریافت خواهید کرد. هنگامی که نقطه پایان استقرار به پایان رسید، موارد زیر را مشاهده خواهید کرد، که نشان می دهد یک نقطه پایانی در منبع مدل شما مستقر شده است:

استقرار به نقطه پایانی

مرحله 2: پیش بینی های مربوط به مدل مستقر شده را دریافت کنید

ما با استفاده از Vertex Python API پیش‌بینی‌هایی را در مورد مدل آموزش‌دیده خود از یک نوت بوک پایتون دریافت می‌کنیم. به نمونه نوت بوک خود برگردید و یک نوت بوک پایتون 3 از لانچر ایجاد کنید:

نوت بوک را باز کنید

در نوت بوک خود، برای نصب Vertex AI SDK موارد زیر را در یک سلول اجرا کنید:

!pip3 install google-cloud-aiplatform --upgrade --user

سپس یک سلول در نوت بوک خود اضافه کنید تا SDK را وارد کنید و یک مرجع به نقطه پایانی که به تازگی مستقر کرده اید ایجاد کنید:

from google.cloud import aiplatform

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/YOUR-PROJECT-NUMBER/locations/us-central1/endpoints/YOUR-ENDPOINT-ID"
)

شما باید دو مقدار را در رشته endpoint_name در بالا با شماره پروژه و نقطه پایانی خود جایگزین کنید. با رفتن به داشبورد پروژه خود و دریافت مقدار Project Number می توانید شماره پروژه خود را پیدا کنید.

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

شناسه نقطه پایانی را پیدا کنید

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

test_mpg = [1.4838871833555929,
 1.8659883497083019,
 2.234620276849616,
 1.0187816540094903,
 -2.530890710602246,
 -1.6046416850441676,
 -0.4651483719733302,
 -0.4952254087173721,
 0.7746763768735953]

response = endpoint.predict([test_mpg])

print('API response: ', response)

print('Predicted MPG: ', response.predictions[0][0])

این مثال در حال حاضر دارای مقادیر نرمال شده است، که فرمتی است که مدل ما انتظار دارد.

این سلول را اجرا کنید، و شما باید خروجی پیش بینی را در حدود 16 مایل در هر گالن ببینید.

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

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

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

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

7. پاکسازی

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

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

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

نقطه پایانی را حذف کنید

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

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