Vertex AI Workbench: یک مدل TensorFlow را با داده‌های BigQuery آموزش دهید

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 کلیک کنید.

داشبورد Vertex AI

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

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

منوی Vertex AI

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

Notebook_api

پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:

Notebooks_UI

سپس NEW NOTEBOOK را انتخاب کنید.

نوت بوک

نوت بوک خود را نامی بگذارید و در قسمت Permission حساب سرویس را انتخاب کنید

service_account

تنظیمات پیشرفته را انتخاب کنید.

اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.

enable_terminal

شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.

بعد، روی ایجاد کلیک کنید.

پس از ایجاد نمونه، OPEN JUPYTERLAB را انتخاب کنید.

enable_terminal

5. مجموعه داده ها را در BigQuery کاوش کنید

در نمونه Vertex AI Workbench، به سمت چپ بروید و روی کانکتور BigQuery در Notebooks کلیک کنید.

کانکتور BQ

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

سنجاق

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

london_bike_ds

ابتدا روی جدول cycle_hire دوبار کلیک کنید. خواهید دید که جدول به عنوان یک برگه جدید با طرح جدول و همچنین ابرداده مانند تعداد ردیف ها و اندازه باز می شود.

cycle_hire_ds

اگر روی تب Preview کلیک کنید، می توانید نمونه ای از داده ها را ببینید. بیایید یک پرس و جو ساده انجام دهیم تا ببینیم سفرهای محبوب کدامند. ابتدا روی دکمه Query table کلیک کنید.

cycle_hire_preview_ds

سپس، موارد زیر را در ویرایشگر 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

از نتایج پرس و جو، خواهید دید که سفرهای دوچرخه به و از ایستگاه هاید پارک کرنر محبوب ترین بوده است.

travel_query_results

سپس روی جدول 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 پاندا استخراج می کند.

copy_for_df

سپس به Launcher برگردید و یک نوت بوک TensorFlow 2 ایجاد کنید.

tf_kernel

در اولین خانه نوت بوک، کد کپی شده از 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()

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

keras_model

توجه داشته باشید که این مدل برای این مجموعه داده ساده نسبتاً پیچیده است. برای اهداف نمایشی در نظر گرفته شده است.

بیایید 1 دوره آموزش ببینیم تا تأیید کنیم که کد اجرا می شود.

model.fit(train_dataset, validation_data = validation_dataset, epochs = 1)

مدل قطار با GPU

در مرحله بعد، مدل را برای مدت طولانی تری آموزش می دهید و از تعویض کننده سخت افزار برای سرعت بخشیدن به آموزش استفاده می کنید. Vertex AI Workbench به شما امکان می دهد بدون خاموش کردن نمونه خود، سخت افزار را تغییر دهید. با افزودن GPU فقط در مواقعی که به آن نیاز دارید، می‌توانید هزینه‌ها را کاهش دهید.

برای تغییر مشخصات سخت افزاری، روی نوع دستگاه در گوشه بالا سمت راست کلیک کرده و Modify hardware را انتخاب کنید

modify_hardware

Attach GPUs را انتخاب کنید و یک NVIDIA T4 Tensor Core GPU را انتخاب کنید.

add_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 کلیک کنید.

حذف کنید