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

۱. مرور کلی

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

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

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

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

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

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

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

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

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

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

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

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

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

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

مرحله 2: فعال کردن API هوش مصنوعی Vertex

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

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

مرحله 3: فعال کردن API رجیستری کانتینر

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

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

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

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

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

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

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

نمونه TFE

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

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

۴. کد آموزشی را کانتینریزه کنید

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

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

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

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

mkdir mpg
cd mpg

مرحله ۱: ایجاد یک داکرفایل

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

touch Dockerfile

فایل Docker را باز کنید و موارد زیر را در آن کپی کنید:

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"]

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

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

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

PROJECT_ID='your-cloud-project'

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

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

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

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

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')

مرحله ۴: ساخت و آزمایش کانتینر به صورت محلی

از طریق ترمینال خود، یک متغیر با آدرس URL تصویر کانتینر خود در رجیستری کانتینر گوگل تعریف کنید:

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

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

docker build ./ -t $IMAGE_URI

برای اطمینان از عملکرد صحیح کانتینر، آن را درون نمونه نوت‌بوک خود اجرا کنید:

docker run $IMAGE_URI

مدل باید آموزش را در عرض ۱-۲ دقیقه با دقت اعتبارسنجی حدود ۷۲٪ به پایان برساند (دقت دقیق ممکن است متفاوت باشد). وقتی اجرای کانتینر به صورت محلی تمام شد، آن را به رجیستری کانتینر گوگل ارسال کنید:

docker push $IMAGE_URI

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

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

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

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

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

منوی رأس

مرحله ۱: شروع کار آموزشی

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

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

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

گزینه ظرف سفارشی

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

ما در این آموزش از تنظیم هایپرپارامتر استفاده نخواهیم کرد، بنابراین کادر «فعال کردن تنظیم هایپرپارامتر» را علامت نزده و روی «ادامه» کلیک کنید.

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

نوع دستگاه

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

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

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

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

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

مشاغل آموزشی

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

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

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

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

وقتی کار آموزشی شما تمام شد، باید مدلی با نام mpg (یا هر نامی که برای آن انتخاب کرده‌اید) را در بخش Models کنسول خود مشاهده کنید:

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

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

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

تقسیم ترافیک را روی ۱۰۰ بگذارید و برای حداقل تعداد گره‌های محاسباتی عدد ۱ را وارد کنید. در قسمت نوع ماشین ، n1-standard-2 (یا هر نوع ماشینی که دوست دارید) را انتخاب کنید. بقیه موارد پیش‌فرض را انتخاب شده بگذارید و سپس روی ادامه کلیک کنید. ما مانیتورینگ را برای این مدل فعال نمی‌کنیم، بنابراین برای شروع استقرار نقطه پایانی، روی Deploy کلیک کنید.

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

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

مرحله ۲: دریافت پیش‌بینی‌ها روی مدل مستقر شده

ما پیش‌بینی‌های مربوط به مدل آموزش‌دیده‌مان را از یک دفترچه یادداشت پایتون، با استفاده از API ورتکس پایتون، دریافت خواهیم کرد. به نمونه دفترچه یادداشت خود برگردید و یک دفترچه یادداشت پایتون ۳ از Launcher ایجاد کنید:

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

در دفترچه یادداشت خود، دستور زیر را در یک سلول اجرا کنید تا 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 بالا با شماره پروژه و نقطه پایانی خود جایگزین کنید. می‌توانید شماره پروژه خود را با رفتن به داشبورد پروژه خود و دریافت مقدار شماره پروژه پیدا کنید.

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

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

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

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])

این مثال از قبل مقادیر نرمال‌سازی شده دارد، که همان فرمتی است که مدل ما انتظار دارد.

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

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

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

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

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

۷. پاکسازی

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

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

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

حذف نقطه پایانی

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

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