1. بررسی اجمالی
در این آزمایشگاه، نحوه استفاده از Vertex AI - پلتفرم ML مدیریت شده جدید Google Cloud - برای ایجاد گردش کار ML سرتاسر را خواهید آموخت. شما یاد خواهید گرفت که چگونه از داده های خام به مدل مستقر شده بروید و این کارگاه را آماده توسعه و تولید پروژه های ML خود با Vertex AI خواهید کرد. در این آزمایشگاه، ما از Cloud Shell برای ایجاد یک تصویر Docker سفارشی برای نشان دادن کانتینرهای سفارشی برای آموزش با Vertex AI استفاده میکنیم.
در حالی که ما از TensorFlow برای کد مدل در اینجا استفاده می کنیم، شما به راحتی می توانید آن را با فریمورک دیگری جایگزین کنید.
چیزی که یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- با استفاده از Cloud Shell کد آموزشی مدل را بسازید و محفظه کنید
- یک کار آموزش مدل سفارشی را به Vertex AI ارسال کنید
- مدل آموزش دیده خود را در یک نقطه پایانی مستقر کنید و از آن نقطه پایانی برای دریافت پیش بینی ها استفاده کنید
کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 2 دلار است.
2. مقدمه ای بر Vertex AI
این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می کند. Vertex AI پیشنهادات ML را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می کند. پیش از این، مدلهای آموزش دیده با AutoML و مدلهای سفارشی از طریق سرویسهای جداگانه قابل دسترسی بودند. پیشنهاد جدید هر دو را به همراه سایر محصولات جدید در یک API واحد ترکیب می کند. همچنین می توانید پروژه های موجود را به Vertex AI منتقل کنید. اگر بازخوردی دارید، لطفاً صفحه پشتیبانی را ببینید.
همانطور که در نمودار زیر می بینید، Vertex شامل ابزارهای مختلف زیادی برای کمک به شما در هر مرحله از گردش کار ML است. ما بر روی استفاده از آموزش و پیشبینی Vertex تمرکز خواهیم کرد که در زیر مشخص شده است.
3. محیط خود را راه اندازی کنید
تنظیم محیط خود به خود
به کنسول Cloud وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. (اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .)
شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!).
در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در Cloud Console فعال کنید .
اجرا کردن از طریق این کد لبه نباید هزینه زیادی داشته باشد، اگر اصلاً باشد. حتماً دستورالعملهای موجود در بخش «تمیز کردن» را دنبال کنید که به شما توصیه میکند چگونه منابع را خاموش کنید تا بیش از این آموزش متحمل صورتحساب نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
مرحله 1: Cloud Shell را راه اندازی کنید
در این آزمایشگاه شما قرار است در یک جلسه Cloud Shell کار کنید، که یک مفسر دستور است که توسط یک ماشین مجازی در حال اجرا در ابر گوگل میزبانی می شود. شما به همین راحتی می توانید این بخش را به صورت محلی در رایانه شخصی خود اجرا کنید، اما استفاده از Cloud Shell به همه امکان دسترسی به یک تجربه تکرارپذیر در یک محیط سازگار را می دهد. پس از پایان آزمایشگاه، می توانید دوباره این بخش را در رایانه شخصی خود امتحان کنید.
Cloud Shell را فعال کنید
از سمت راست بالای Cloud Console، روی دکمه زیر کلیک کنید تا Cloud Shell را فعال کنید :
اگر قبلاً Cloud Shell را راهاندازی نکردهاید، یک صفحه میانی (در زیر تاشو) برای شما نمایش داده میشود که آن را توصیف میکند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. بیشتر، اگر نه همه، کار شما در این کد لبه را می توان به سادگی با یک مرورگر یا Chromebook انجام داد.
پس از اتصال به Cloud Shell، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی ID پروژه شما تنظیم شده است.
برای تایید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list
خروجی فرمان
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
دستور زیر را در 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
که حاوی نام پروژه Cloud فعلی ما است. ما از این در جاهای مختلف این آزمایشگاه استفاده خواهیم کرد. می توانید آن را با اجرا ببینید:
echo $GOOGLE_CLOUD_PROJECT
مرحله 2: 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.
مرحله 3: یک سطل ذخیره سازی ابری ایجاد کنید
برای اجرای یک کار آموزشی در Vertex AI، به یک سطل ذخیره سازی برای ذخیره دارایی های مدل ذخیره شده خود نیاز داریم. دستورات زیر را در ترمینال Cloud Shell خود اجرا کنید تا یک سطل ایجاد کنید:
BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME
مرحله 4: نام مستعار پایتون 3
کد موجود در این آزمایشگاه از Python 3 استفاده می کند. برای اطمینان از استفاده از Python 3 هنگام اجرای اسکریپت هایی که در این آزمایشگاه ایجاد می کنید، با اجرای موارد زیر در Cloud Shell یک نام مستعار ایجاد کنید:
alias python=python3
مدلی که ما در این آزمایشگاه آموزش می دهیم و ارائه می کنیم بر اساس این آموزش از اسناد TensorFlow ساخته شده است. این آموزش از مجموعه داده های Auto MPG از Kaggle برای پیش بینی بهره وری سوخت یک وسیله نقلیه استفاده می کند.
4. کد آموزشی Containerize
ما این کار آموزشی را با قرار دادن کد آموزشی خود در یک ظرف Docker و فشار دادن این کانتینر به Google Container Registry به Vertex ارسال میکنیم. با استفاده از این رویکرد، میتوانیم یک مدل ساخته شده با هر چارچوبی را آموزش دهیم.
مرحله 1: فایل ها را تنظیم کنید
برای شروع، از ترمینال موجود در Cloud Shell، دستورات زیر را برای ایجاد فایلهایی که برای Docker Container خود نیاز داریم اجرا کنید:
mkdir mpg
cd mpg
touch Dockerfile
mkdir trainer
touch trainer/train.py
اکنون باید یک دایرکتوری mpg/
داشته باشید که به شکل زیر است:
+ Dockerfile
+ trainer/
+ train.py
برای مشاهده و ویرایش این فایلها، از ویرایشگر کد داخلی Cloud Shell استفاده میکنیم. می توانید با کلیک بر روی دکمه در نوار منوی بالا سمت راست در Cloud Shell بین ویرایشگر و ترمینال جابه جا شوید:
مرحله 2: یک Dockerfile ایجاد کنید
برای کانتینری کردن کد خود ابتدا یک Dockerfile ایجاد می کنیم. در Dockerfile ما تمام دستورات مورد نیاز برای اجرای تصویر خود را قرار می دهیم. تمام کتابخانههایی را که استفاده میکنیم نصب میکند و نقطه ورودی کد آموزشی ما را تنظیم میکند.
از ویرایشگر فایل Cloud Shell، دایرکتوری mpg/
خود را باز کنید و سپس برای باز کردن Dockerfile دوبار کلیک کنید:
سپس موارد زیر را در این فایل کپی کنید:
FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-3
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 نقطه ورودی کد آموزشی ما را تنظیم می کند که در مرحله بعد اضافه می کنیم.
مرحله 3: کد آموزشی مدل را اضافه کنید
از ویرایشگر Cloud Shell، سپس فایل train.py
را باز کنید و کد زیر را کپی کنید (این از آموزش در اسناد TensorFlow اقتباس شده است).
# This will be replaced with your bucket name after running the `sed` command in the tutorial
BUCKET = "BUCKET_NAME"
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.
"""
"""Import it using pandas"""
dataset_path = "https://storage.googleapis.com/io-vertex-codelab/auto-mpg.csv"
dataset = pd.read_csv(dataset_path, na_values = "?")
dataset.tail()
"""### 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')
هنگامی که کد بالا را در فایل mpg/trainer/train.py
کپی کردید، به ترمینال در Cloud Shell خود بازگردید و دستور زیر را اجرا کنید تا نام سطل خود را به فایل اضافه کنید:
sed -i "s|BUCKET_NAME|$BUCKET_NAME|g" trainer/train.py
مرحله 4: ظرف را به صورت محلی بسازید و آزمایش کنید
از ترمینال خود، موارد زیر را اجرا کنید تا یک متغیر با URI تصویر کانتینر خود در Google Container Registry تعریف کنید:
IMAGE_URI="gcr.io/$GOOGLE_CLOUD_PROJECT/mpg:v1"
سپس، کانتینر را با اجرای موارد زیر از ریشه دایرکتوری mpg
خود بسازید:
docker build ./ -t $IMAGE_URI
هنگامی که کانتینر را ساختید، آن را به Google Container Registry فشار دهید:
docker push $IMAGE_URI
برای تأیید اینکه تصویر شما به Container Registry فرستاده شده است، هنگامی که به بخش Container Registry کنسول خود بروید باید چیزی شبیه به این را مشاهده کنید:
با انتقال کانتینر به Container Registry، اکنون آماده شروع یک کار آموزشی مدل سفارشی هستیم.
5. یک کار آموزشی بر روی Vertex AI اجرا کنید
Vertex دو گزینه برای مدل های آموزشی به شما می دهد:
- AutoML : آموزش مدل های با کیفیت بالا با حداقل تلاش و تخصص ML.
- آموزش سفارشی : برنامه های آموزشی سفارشی خود را در فضای ابری با استفاده از یکی از کانتینرهای از پیش ساخته شده Google Cloud اجرا کنید یا از خود استفاده کنید.
در این آزمایشگاه، ما از آموزش سفارشی از طریق کانتینر سفارشی خود در Google Container Registry استفاده میکنیم. برای شروع، به بخش Training در بخش Vertex کنسول Cloud خود بروید:
مرحله 1: کار آموزشی را آغاز کنید
برای وارد کردن پارامترهای شغل آموزشی و مدل مستقر شده روی Create کلیک کنید:
- در زیر مجموعه داده ، بدون مجموعه داده مدیریت شده را انتخاب کنید
- سپس آموزش سفارشی (پیشرفته) را به عنوان روش آموزشی خود انتخاب کرده و روی Continue کلیک کنید.
-
mpg
(یا هر چیزی که میخواهید مدل خود را صدا بزنید) را برای نام مدل وارد کنید - روی Continue کلیک کنید
در مرحله تنظیمات Container، Custom Container را انتخاب کنید:
در کادر اول (تصویر Container)، روی Browse کلیک کنید و ظرفی را که به تازگی به Container Registry فشار داده اید، پیدا کنید. باید چیزی شبیه این باشد:
بقیه فیلدها را خالی بگذارید و روی Continue کلیک کنید.
ما در این آموزش از تنظیم هایپرپارامتر استفاده نمی کنیم، بنابراین کادر تنظیم Hyperparameter را بدون علامت بگذارید و روی Continue کلیک کنید.
در محاسبه و قیمت گذاری ، منطقه انتخاب شده را همانطور که هست رها کنید و n1-standard-4 را به عنوان نوع دستگاه خود انتخاب کنید:
از آنجایی که مدل در این نسخه آزمایشی به سرعت آموزش می بیند، ما از نوع ماشین کوچکتری استفاده می کنیم.
در مرحله Prediction container ، No Prediction container را انتخاب کنید:
6. یک نقطه پایانی مدل مستقر کنید
در این مرحله یک نقطه پایانی برای مدل آموزش دیده خود ایجاد می کنیم. ما می توانیم از این برای پیش بینی مدل خود از طریق Vertex AI API استفاده کنیم. برای انجام این کار، نسخهای از داراییهای مدل آموزشدیده صادر شده را در یک سطل GCS عمومی در دسترس قرار دادهایم .
در یک سازمان، معمولاً یک تیم یا فرد مسئول ساخت مدل و تیم دیگری مسئول استقرار آن است. مراحلی که در اینجا طی خواهیم کرد به شما نشان می دهد که چگونه مدلی را که قبلاً آموزش دیده است انتخاب کنید و آن را برای پیش بینی به کار ببرید.
در اینجا ما از Vertex AI SDK برای ایجاد یک مدل، استقرار آن در نقطه پایانی و دریافت یک پیشبینی استفاده میکنیم.
مرحله 1: Vertex SDK را نصب کنید
از ترمینال Cloud Shell خود، موارد زیر را برای نصب Vertex AI SDK اجرا کنید:
pip3 install google-cloud-aiplatform --upgrade --user
ما می توانیم از این SDK برای تعامل با بخش های مختلف Vertex استفاده کنیم.
مرحله 2: ایجاد مدل و استقرار نقطه پایانی
سپس یک فایل پایتون ایجاد می کنیم و از SDK برای ایجاد یک منبع مدل و استقرار آن در نقطه پایانی استفاده می کنیم. از ویرایشگر فایل در Cloud Shell، File و سپس New File را انتخاب کنید:
نام فایل را deploy.py
بگذارید. این فایل را در ویرایشگر خود باز کنید و کد زیر را کپی کنید:
from google.cloud import aiplatform
# Create a model resource from public model assets
model = aiplatform.Model.upload(
display_name="mpg-imported",
artifact_uri="gs://io-vertex-codelab/mpg-model/",
serving_container_image_uri="gcr.io/cloud-aiplatform/prediction/tf2-cpu.2-3:latest"
)
# Deploy the above model to an endpoint
endpoint = model.deploy(
machine_type="n1-standard-4"
)
سپس، به ترمینال در Cloud Shell برگردید، cd
به root dir خود برگردانید و این اسکریپت پایتون را که به تازگی ایجاد کرده اید اجرا کنید:
cd ..
python3 deploy.py | tee deploy-output.txt
با ایجاد منابع، بهروزرسانیهایی را خواهید دید که در ترمینال خود ثبت شدهاند. این 10-15 دقیقه طول می کشد تا اجرا شود. برای اطمینان از درست کار کردن، به بخش Models کنسول خود در Vertex AI بروید:
روی mgp-imported کلیک کنید و باید نقطه پایانی خود را برای آن مدل در حال ایجاد ببینید:
در ترمینال Cloud Shell خود، زمانی که استقرار نقطه پایانی شما تکمیل شد، چیزی شبیه گزارش زیر را مشاهده خواهید کرد:
Endpoint model deployed. Resource name: projects/your-project-id/locations/us-central1/endpoints/your-endpoint-id
شما از این در مرحله بعدی برای پیش بینی در مورد endopint مستقر شده خود استفاده خواهید کرد.
مرحله 3: پیش بینی ها را در نقطه پایانی مستقر شده دریافت کنید
در ویرایشگر Cloud Shell خود، یک فایل جدید به نام predict.py
ایجاد کنید:
predict.py
را باز کنید و کد زیر را در آن قرار دهید:
from google.cloud import aiplatform
endpoint = aiplatform.Endpoint(
endpoint_name="ENDPOINT_STRING"
)
# A test example we'll send to our model for prediction
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])
سپس، به ترمینال خود برگردید و موارد زیر را وارد کنید تا ENDPOINT_STRING
در فایل پیش بینی با نقطه پایانی خود جایگزین شود:
ENDPOINT=$(cat deploy-output.txt | sed -nre 's:.*Resource name\: (.*):\1:p' | tail -1)
sed -i "s|ENDPOINT_STRING|$ENDPOINT|g" predict.py
اکنون وقت آن است که فایل predict.py
را اجرا کنیم تا یک پیش بینی از نقطه پایانی مدل مستقر شده ما دریافت کنیم:
python3 predict.py
شما باید پاسخ API را به همراه بازده سوخت پیشبینیشده برای پیشبینی تست ما مشاهده کنید.
🎉 تبریک می گویم! 🎉
شما یاد گرفته اید که چگونه از Vertex AI برای موارد زیر استفاده کنید:
- آموزش یک مدل با ارائه کد آموزشی در یک ظرف سفارشی. شما در این مثال از یک مدل TensorFlow استفاده کردید، اما می توانید یک مدل ساخته شده با هر چارچوبی را با استفاده از کانتینرهای سفارشی آموزش دهید.
- یک مدل TensorFlow را با استفاده از یک کانتینر از پیش ساخته شده به عنوان بخشی از همان گردش کاری که برای آموزش استفاده کردید، اجرا کنید.
- یک نقطه پایانی مدل ایجاد کنید و یک پیش بینی ایجاد کنید.
برای کسب اطلاعات بیشتر در مورد بخشهای مختلف Vertex AI، مستندات را بررسی کنید. اگر میخواهید نتایج کار آموزشی را که در مرحله 5 شروع کردهاید ببینید، به بخش آموزش کنسول Vertex خود بروید.
7. پاکسازی
برای حذف نقطه پایانی که مستقر کرده اید، به بخش Endpoints کنسول Vertex خود بروید و روی نماد حذف کلیک کنید:
برای حذف Storage Bucket، با استفاده از منوی Navigation در Cloud Console خود، به Storage بروید، سطل خود را انتخاب کنید و روی Delete کلیک کنید: