1. بررسی اجمالی
در این آزمایشگاه، نحوه استفاده از Vertex AI Workbench برای کاوش داده ها و آموزش مدل ML را خواهید آموخت.
آنچه یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- یک نمونه Vertex AI Workbench ایجاد و پیکربندی کنید
- از رابط Vertex AI Workbench BigQuery استفاده کنید
- آموزش یک مدل بر روی هسته Vertex AI Workbench
کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 1 دلار است.
2. مقدمه ای بر Vertex AI
این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می کند. Vertex AI پیشنهادات ML را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می کند. پیش از این، مدلهای آموزش دیده با AutoML و مدلهای سفارشی از طریق سرویسهای جداگانه قابل دسترسی بودند. پیشنهاد جدید هر دو را به همراه سایر محصولات جدید در یک API واحد ترکیب می کند. همچنین می توانید پروژه های موجود را به Vertex AI منتقل کنید.
Vertex AI شامل بسیاری از محصولات مختلف برای پشتیبانی از گردش کار ML سرتاسر است. این آزمایشگاه بر روی Vertex AI Workbench تمرکز خواهد کرد.
Vertex AI Workbench به کاربران کمک میکند تا از طریق یکپارچهسازی عمیق با سرویسهای داده (مانند Dataproc، Dataflow، BigQuery، و Dataplex) و Vertex AI، به سرعت جریانهای کاری مبتنی بر نوتبوک سرتاسر بسازند. این دانشمندان داده را قادر می سازد تا به سرویس های داده GCP متصل شوند، مجموعه داده ها را تجزیه و تحلیل کنند، با تکنیک های مدل سازی مختلف آزمایش کنند، مدل های آموزش دیده را در تولید مستقر کنند و MLOps را از طریق چرخه عمر مدل مدیریت کنند.
3. از Case Overview استفاده کنید
در این آزمایشگاه، مجموعه داده اجاره دوچرخه لندن را بررسی خواهید کرد. این داده ها حاوی اطلاعاتی درباره سفرهای دوچرخه از برنامه اشتراک دوچرخه عمومی لندن از سال 2011 است. شما با کاوش این مجموعه داده در BigQuery از طریق رابط Vertex AI Workbench BigQuery شروع می کنید. سپس دادهها را با استفاده از پانداها در یک نوتبوک Jupyter بارگیری میکنید و یک مدل TensorFlow را آموزش میدهید تا مدت زمان سفر چرخهای را بر اساس زمان وقوع سفر و میزان مسافتی که فرد رکاب زده را پیشبینی کند.
این آزمایشگاه از لایه های پیش پردازش Keras برای تبدیل و آماده سازی داده های ورودی برای آموزش مدل استفاده می کند. این API به شما اجازه میدهد تا پیشپردازش را مستقیماً در نمودار مدل TensorFlow خود ایجاد کنید، با اطمینان از اینکه دادههای آموزشی و دادههای ارائهدهنده تغییرات یکسانی دارند، خطر انحراف آموزش/سرویس را کاهش میدهد. توجه داشته باشید که از TensorFlow 2.6، این API پایدار است. اگر از نسخه قدیمی تر TensorFlow استفاده می کنید، باید نماد آزمایشی را وارد کنید.
4. محیط خود را تنظیم کنید
برای اجرای این کد لبه به یک پروژه Google Cloud Platform با فعال بودن صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل های اینجا را دنبال کنید.
مرحله 1: Compute Engine API را فعال کنید
به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید.
مرحله ۲: Vertex AI API را فعال کنید
به بخش Vertex AI در Cloud Console خود بروید و روی Enable Vertex AI API کلیک کنید.
مرحله 3: یک نمونه Vertex AI Workbench ایجاد کنید
از بخش Vertex AI در Cloud Console خود، روی Workbench کلیک کنید:
اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.
پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:
سپس NEW NOTEBOOK را انتخاب کنید.
نوت بوک خود را نامی بگذارید و در قسمت Permission حساب سرویس را انتخاب کنید
تنظیمات پیشرفته را انتخاب کنید.
اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.
شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.
بعد، روی ایجاد کلیک کنید.
پس از ایجاد نمونه، OPEN JUPYTERLAB را انتخاب کنید.
5. مجموعه داده ها را در BigQuery کاوش کنید
در نمونه Vertex AI Workbench، به سمت چپ بروید و روی کانکتور BigQuery در Notebooks کلیک کنید.
رابط BigQuery به شما امکان می دهد به راحتی مجموعه داده های BigQuery را کاوش و پرس و جو کنید. علاوه بر هر مجموعه داده در پروژه خود، می توانید با کلیک بر روی دکمه افزودن پروژه، مجموعه داده ها را در پروژه های دیگر کاوش کنید.
برای این آزمایشگاه، از داده های مجموعه داده های عمومی BigQuery استفاده خواهید کرد. به پایین بروید تا مجموعه داده london_bicycles را پیدا کنید. خواهید دید که این مجموعه داده دارای دو جدول cycle_hire و cycle_stations است. بیایید هر یک از آنها را بررسی کنیم.
ابتدا روی جدول cycle_hire دوبار کلیک کنید. خواهید دید که جدول به عنوان یک برگه جدید با طرح جدول و همچنین ابرداده مانند تعداد ردیف ها و اندازه باز می شود.
اگر روی تب Preview کلیک کنید، می توانید نمونه ای از داده ها را ببینید. بیایید یک پرس و جو ساده انجام دهیم تا ببینیم سفرهای محبوب کدامند. ابتدا روی دکمه Query table کلیک کنید.
سپس، موارد زیر را در ویرایشگر SQL قرار دهید و روی Submit Query کلیک کنید.
SELECT
start_station_name,
end_station_name,
IF(start_station_name = end_station_name,
TRUE,
FALSE) same_station,
AVG(duration) AS avg_duration,
COUNT(*) AS total_rides
FROM
`bigquery-public-data.london_bicycles.cycle_hire`
GROUP BY
start_station_name,
end_station_name,
same_station
ORDER BY
total_rides DESC
از نتایج پرس و جو، خواهید دید که سفرهای دوچرخه به و از ایستگاه هاید پارک کرنر محبوب ترین بوده است.
سپس روی جدول cycle_stations دوبار کلیک کنید که اطلاعات مربوط به هر ایستگاه را ارائه می دهد.
می خواهیم به جداول cycle_hire و cycle_stations ملحق شویم. جدول cycle_stations شامل lat/lon برای هر ایستگاه است. شما از این اطلاعات برای تخمین مسافت طی شده در هر سفر چرخه ای با محاسبه فاصله بین ایستگاه های شروع و پایان استفاده خواهید کرد.
برای انجام این محاسبه، از توابع جغرافیایی BigQuery استفاده خواهید کرد. به طور خاص، شما هر رشته lat/lon را به ST_GEOGPOINT تبدیل میکنید و از تابع ST_DISTANCE برای محاسبه فاصله خط مستقیم بر حسب متر بین دو نقطه استفاده میکنید. شما از این مقدار به عنوان یک پروکسی برای مسافت طی شده در هر سفر چرخه استفاده خواهید کرد.
پرس و جوی زیر را در ویرایشگر SQL خود کپی کنید و سپس روی Submit Query کلیک کنید. توجه داشته باشید که سه جدول در شرایط JOIN وجود دارد زیرا ما باید دو بار به جدول ایستگاهها بپیوندیم تا lat/lon را برای ایستگاه شروع و پایان چرخه بدست آوریم.
WITH staging AS (
SELECT
STRUCT(
start_stn.name,
ST_GEOGPOINT(start_stn.longitude, start_stn.latitude) AS POINT,
start_stn.docks_count,
start_stn.install_date
) AS starting,
STRUCT(
end_stn.name,
ST_GEOGPOINT(end_stn.longitude, end_stn.latitude) AS point,
end_stn.docks_count,
end_stn.install_date
) AS ending,
STRUCT(
rental_id,
bike_id,
duration, --seconds
ST_DISTANCE(
ST_GEOGPOINT(start_stn.longitude, start_stn.latitude),
ST_GEOGPOINT(end_stn.longitude, end_stn.latitude)
) AS distance, --meters
start_date,
end_date
) AS bike
FROM `bigquery-public-data.london_bicycles.cycle_stations` AS start_stn
LEFT JOIN `bigquery-public-data.london_bicycles.cycle_hire` as b
ON start_stn.id = b.start_station_id
LEFT JOIN `bigquery-public-data.london_bicycles.cycle_stations` AS end_stn
ON end_stn.id = b.end_station_id
LIMIT 700000)
SELECT * from STAGING
6. یک مدل ML را روی هسته TensorFlow آموزش دهید
Vertex AI Workbench دارای یک لایه سازگاری محاسباتی است که به شما امکان می دهد هسته های TensorFlow، PySpark، R و غیره را از یک نمونه نوت بوک راه اندازی کنید. در این آزمایشگاه، یک نوت بوک با استفاده از هسته TensorFlow ایجاد خواهید کرد.
DataFrame ایجاد کنید
پس از اجرای کوئری، روی Copy code for DataFrame کلیک کنید. این به شما امکان می دهد کد پایتون را در یک نوت بوک قرار دهید که به مشتری BigQuery متصل می شود و این داده ها را به عنوان DataFrame پاندا استخراج می کند.
سپس به Launcher برگردید و یک نوت بوک TensorFlow 2 ایجاد کنید.
در اولین خانه نوت بوک، کد کپی شده از Query Editor را جایگذاری کنید. باید به شکل زیر باشد:
# The following two lines are only necessary to run once.
# Comment out otherwise for speed-up.
from google.cloud.bigquery import Client, QueryJobConfig
client = Client()
query = """WITH staging AS (
SELECT
STRUCT(
start_stn.name,
ST_GEOGPOINT(start_stn.longitude, start_stn.latitude) AS POINT,
start_stn.docks_count,
start_stn.install_date
) AS starting,
STRUCT(
end_stn.name,
ST_GEOGPOINT(end_stn.longitude, end_stn.latitude) AS point,
end_stn.docks_count,
end_stn.install_date
) AS ending,
STRUCT(
rental_id,
bike_id,
duration, --seconds
ST_DISTANCE(
ST_GEOGPOINT(start_stn.longitude, start_stn.latitude),
ST_GEOGPOINT(end_stn.longitude, end_stn.latitude)
) AS distance, --meters
start_date,
end_date
) AS bike
FROM `bigquery-public-data.london_bicycles.cycle_stations` AS start_stn
LEFT JOIN `bigquery-public-data.london_bicycles.cycle_hire` as b
ON start_stn.id = b.start_station_id
LEFT JOIN `bigquery-public-data.london_bicycles.cycle_stations` AS end_stn
ON end_stn.id = b.end_station_id
LIMIT 700000)
SELECT * from STAGING"""
job = client.query(query)
df = job.to_dataframe()
برای اهداف این آزمایشگاه، ما مجموعه داده را به 700000 محدود می کنیم تا زمان آموزش کوتاهتر شود. اما با خیال راحت پرس و جو را اصلاح کنید و کل مجموعه داده را آزمایش کنید.
در مرحله بعد، کتابخانه های لازم را وارد کنید.
from datetime import datetime
import pandas as pd
import tensorflow as tf
کد زیر را برای ایجاد یک دیتافریم کاهش یافته اجرا کنید که فقط شامل ستون های مورد نیاز برای بخش ML این تمرین باشد.
values = df['bike'].values
duration = list(map(lambda a: a['duration'], values))
distance = list(map(lambda a: a['distance'], values))
dates = list(map(lambda a: a['start_date'], values))
data = pd.DataFrame(data={'duration': duration, 'distance': distance, 'start_date':dates})
data = data.dropna()
ستون start_date یک datetime
پایتون است. به جای استفاده مستقیم از این datetime
در مدل، دو ویژگی جدید ایجاد خواهید کرد که نشان دهنده روز هفته و ساعت روزی است که سفر با دوچرخه رخ داده است.
data['weekday'] = data['start_date'].apply(lambda a: a.weekday())
data['hour'] = data['start_date'].apply(lambda a: a.time().hour)
data = data.drop(columns=['start_date'])
در نهایت، ستون مدت زمان را از ثانیه به دقیقه تبدیل کنید تا درک آن آسانتر شود
data['duration'] = data['duration'].apply(lambda x:float(x / 60))
چند ردیف اول DataFrame فرمت شده را بررسی کنید. برای هر سفر چرخهای، اکنون دادههایی در مورد روز هفته و ساعتی از روزی که سفر رخ داده است و همچنین مسافت طی شده دارید. با توجه به این اطلاعات، سعی می کنید مدت زمان سفر را پیش بینی کنید.
data.head()
قبل از اینکه بتوانید مدل را ایجاد و آموزش دهید، باید داده ها را به مجموعه های آموزشی و اعتبار سنجی تقسیم کنید.
# Use 80/20 train/eval split
train_size = int(len(data) * .8)
print ("Train size: %d" % train_size)
print ("Evaluation size: %d" % (len(data) - train_size))
# Split data into train and test sets
train_data = data[:train_size]
val_data = data[train_size:]
ایجاد مدل TensorFlow
شما یک مدل TensorFlow با استفاده از Keras Functional API ایجاد خواهید کرد. برای پیش پردازش داده های ورودی، از API لایه های پیش پردازش Keras استفاده خواهید کرد.
تابع ابزار زیر یک tf.data.Dataset
از Pandas Dataframe ایجاد می کند.
def df_to_dataset(dataframe, label, shuffle=True, batch_size=32):
dataframe = dataframe.copy()
labels = dataframe.pop(label)
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
ds = ds.prefetch(batch_size)
return ds
از تابع بالا برای ایجاد دو tf.data.Dataset
استفاده کنید، یکی برای آموزش و دیگری برای اعتبار سنجی. ممکن است برخی از هشدارها را مشاهده کنید، اما می توانید با خیال راحت آنها را نادیده بگیرید.
train_dataset = df_to_dataset(train_data, 'duration')
validation_dataset = df_to_dataset(val_data, 'duration')
شما از لایه های پیش پردازش زیر در مدل استفاده خواهید کرد:
- لایه عادی سازی : عادی سازی ویژگی های ورودی را از نظر ویژگی انجام می دهد.
- لایه IntegerLookup : مقادیر طبقه بندی اعداد صحیح را به شاخص های اعداد صحیح تبدیل می کند.
- لایه CategoryEncoding : ویژگی های دسته بندی اعداد صحیح را به نمایش های متراکم یک داغ، چند داغ یا TF-IDF تبدیل می کند.
توجه داشته باشید که این لایه ها قابل آموزش نیستند . در عوض، شما وضعیت لایه پیش پردازش را با قرار دادن آن در معرض داده های آموزشی، از طریق متد adapt()
تنظیم می کنید.
تابع زیر یک لایه عادی سازی ایجاد می کند که می توانید از آن در ویژگی فاصله استفاده کنید. شما وضعیت را قبل از برازش مدل با استفاده از متد adapt()
روی داده های آموزشی تنظیم می کنید. این میانگین و واریانس مورد استفاده برای نرمال سازی را محاسبه می کند. بعداً، وقتی مجموعه داده اعتبارسنجی را به مدل منتقل میکنید، همان میانگین و واریانس محاسبهشده روی دادههای آموزشی برای مقیاسبندی دادههای اعتبارسنجی استفاده میشود.
def get_normalization_layer(name, dataset):
# Create a Normalization layer for our feature.
normalizer = tf.keras.layers.Normalization(axis=None)
# Prepare a Dataset that only yields our feature.
feature_ds = dataset.map(lambda x, y: x[name])
# Learn the statistics of the data.
normalizer.adapt(feature_ds)
return normalizer
به طور مشابه، تابع زیر یک کدگذاری دسته بندی ایجاد می کند که از آن در ویژگی های ساعت و روزهای هفته استفاده خواهید کرد.
def get_category_encoding_layer(name, dataset, dtype, max_tokens=None):
index = tf.keras.layers.IntegerLookup(max_tokens=max_tokens)
# Prepare a Dataset that only yields our feature
feature_ds = dataset.map(lambda x, y: x[name])
# Learn the set of possible values and assign them a fixed integer index.
index.adapt(feature_ds)
# Create a Discretization for our integer indices.
encoder = tf.keras.layers.CategoryEncoding(num_tokens=index.vocabulary_size())
# Apply one-hot encoding to our indices. The lambda function captures the
# layer so we can use them, or include them in the functional model later.
return lambda feature: encoder(index(feature))
بعد، بخش پیش پردازش مدل را ایجاد کنید. ابتدا برای هر یک از ویژگی ها یک لایه tf.keras.Input
ایجاد کنید.
# Create a Keras input layer for each feature
numeric_col = tf.keras.Input(shape=(1,), name='distance')
hour_col = tf.keras.Input(shape=(1,), name='hour', dtype='int64')
weekday_col = tf.keras.Input(shape=(1,), name='weekday', dtype='int64')
سپس لایه های نرمال سازی و کدگذاری دسته را ایجاد کنید و آنها را در یک لیست ذخیره کنید.
all_inputs = []
encoded_features = []
# Pass 'distance' input to normalization layer
normalization_layer = get_normalization_layer('distance', train_dataset)
encoded_numeric_col = normalization_layer(numeric_col)
all_inputs.append(numeric_col)
encoded_features.append(encoded_numeric_col)
# Pass 'hour' input to category encoding layer
encoding_layer = get_category_encoding_layer('hour', train_dataset, dtype='int64')
encoded_hour_col = encoding_layer(hour_col)
all_inputs.append(hour_col)
encoded_features.append(encoded_hour_col)
# Pass 'weekday' input to category encoding layer
encoding_layer = get_category_encoding_layer('weekday', train_dataset, dtype='int64')
encoded_weekday_col = encoding_layer(weekday_col)
all_inputs.append(weekday_col)
encoded_features.append(encoded_weekday_col)
پس از تعریف لایه های پیش پردازش، می توانید بقیه مدل را تعریف کنید. شما تمام ویژگی های ورودی را به هم متصل می کنید و آنها را به یک لایه متراکم منتقل می کنید. لایه خروجی یک واحد است زیرا این یک مشکل رگرسیونی است.
all_features = tf.keras.layers.concatenate(encoded_features)
x = tf.keras.layers.Dense(64, activation="relu")(all_features)
output = tf.keras.layers.Dense(1)(x)
model = tf.keras.Model(all_inputs, output)
در آخر مدل را کامپایل کنید.
model.compile(optimizer = tf.keras.optimizers.Adam(0.001),
loss='mean_squared_logarithmic_error')
حالا که مدل را تعریف کردید، می توانید معماری را تجسم کنید
tf.keras.utils.plot_model(model, show_shapes=True, rankdir="LR")
توجه داشته باشید که این مدل برای این مجموعه داده ساده نسبتاً پیچیده است. برای اهداف نمایشی در نظر گرفته شده است.
بیایید 1 دوره آموزش ببینیم تا تأیید کنیم که کد اجرا می شود.
model.fit(train_dataset, validation_data = validation_dataset, epochs = 1)
مدل قطار با GPU
در مرحله بعد، مدل را برای مدت طولانی تری آموزش می دهید و از تعویض کننده سخت افزار برای سرعت بخشیدن به آموزش استفاده می کنید. Vertex AI Workbench به شما امکان می دهد بدون خاموش کردن نمونه خود، سخت افزار را تغییر دهید. با افزودن GPU فقط در مواقعی که به آن نیاز دارید، میتوانید هزینهها را کاهش دهید.
برای تغییر مشخصات سخت افزاری، روی نوع دستگاه در گوشه بالا سمت راست کلیک کرده و Modify hardware را انتخاب کنید
Attach GPUs را انتخاب کنید و یک NVIDIA T4 Tensor Core GPU را انتخاب کنید.
پیکربندی سخت افزار حدود پنج دقیقه طول می کشد. پس از تکمیل فرآیند، بیایید مدل را برای کمی بیشتر آموزش دهیم. متوجه خواهید شد که هر دوره اکنون زمان کمتری می برد.
model.fit(train_dataset, validation_data = validation_dataset, epochs = 5)
🎉 تبریک می گویم! 🎉
شما یاد گرفته اید که چگونه از Vertex AI Workbench برای موارد زیر استفاده کنید:
- داده ها را در BigQuery کاوش کنید
- برای بارگذاری داده ها در پایتون از مشتری BigQuery استفاده کنید
- یک مدل TensorFlow را با لایه های پیش پردازش Keras و یک GPU آموزش دهید
برای کسب اطلاعات بیشتر در مورد بخشهای مختلف Vertex AI، مستندات را بررسی کنید.
7. پاکسازی
از آنجایی که ما نوت بوک را طوری پیکربندی کردهایم که پس از 60 دقیقه بیحرکت، زمان آن تمام شود، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می خواهید نوت بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.