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

۱. مرور کلی

در این آزمایشگاه، نحوه استفاده از Vertex AI Workbench را برای کاوش داده‌ها و آموزش مدل یادگیری ماشین خواهید آموخت.

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

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

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

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

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

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

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

ورک‌بنچ هوش مصنوعی ورتکس (Vertex AI Workbench) به کاربران کمک می‌کند تا از طریق ادغام عمیق با سرویس‌های داده (مانند Dataproc، Dataflow، BigQuery و Dataplex) و ورتکس هوش مصنوعی، به سرعت گردش‌های کاری مبتنی بر نوت‌بوک را به صورت سرتاسری ایجاد کنند. این نرم‌افزار دانشمندان داده را قادر می‌سازد تا به سرویس‌های داده GCP متصل شوند، مجموعه داده‌ها را تجزیه و تحلیل کنند، تکنیک‌های مختلف مدل‌سازی را آزمایش کنند، مدل‌های آموزش‌دیده را در تولید مستقر کنند و MLOps را از طریق چرخه عمر مدل مدیریت کنند.

۳. بررسی اجمالی موارد استفاده

در این آزمایش، مجموعه داده‌های کرایه دوچرخه لندن را بررسی خواهید کرد. این داده‌ها حاوی اطلاعاتی در مورد سفرهای دوچرخه از برنامه اشتراک دوچرخه عمومی لندن از سال ۲۰۱۱ است. شما با بررسی این مجموعه داده‌ها در BigQuery از طریق رابط Vertex AI Workbench BigQuery شروع خواهید کرد. سپس داده‌ها را با استفاده از pandas در یک Jupyter Notebook بارگذاری کرده و یک مدل TensorFlow را آموزش می‌دهید تا مدت زمان یک سفر دوچرخه‌سواری را بر اساس زمان وقوع سفر و مسافتی که فرد دوچرخه‌سواری کرده است، پیش‌بینی کند.

این آزمایشگاه از لایه‌های پیش‌پردازش Keras برای تبدیل و آماده‌سازی داده‌های ورودی برای آموزش مدل استفاده می‌کند. این API به شما امکان می‌دهد پیش‌پردازش را مستقیماً در نمودار مدل TensorFlow خود ایجاد کنید و با اطمینان از اینکه داده‌های آموزشی و داده‌های سرویس‌دهنده تحت تبدیل‌های یکسان قرار می‌گیرند، خطر انحراف آموزش/سرویس‌دهی را کاهش دهید. توجه داشته باشید که از TensorFlow 2.6، این API پایدار است. اگر از نسخه قدیمی‌تر TensorFlow استفاده می‌کنید، باید نماد آزمایشی را وارد کنید.

۴. محیط خود را آماده کنید

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

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

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

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

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

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

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

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

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

اگر API نوت‌بوک‌ها فعال نیست، آن را فعال کنید.

نوت‌بوک_آپی

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

رابط کاربری نوت‌بوک‌ها

سپس دفترچه یادداشت جدید را انتخاب کنید.

نوت بوک_جدید

برای نوت‌بوک خود یک نام انتخاب کنید و در قسمت Permission، گزینه Service account را انتخاب کنید.

حساب_خدماتی

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

در قسمت امنیت، اگر از قبل فعال نشده است، گزینه «فعال کردن ترمینال» را انتخاب کنید.

enable_terminal

می‌توانید تمام تنظیمات پیشرفته دیگر را همانطور که هست، رها کنید.

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

پس از ایجاد نمونه، گزینه‌ی «باز کردن JUPYTERLAB» را انتخاب کنید.

enable_terminal

۵. کاوش مجموعه داده‌ها در BigQuery

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

کانکتور BQ

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

پین

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

london_bike_ds

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

استخدام_دوره_های_چرخه

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

پیش‌نمایش_دوره_های_استخدام_دوره

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

از نتایج جستجو، خواهید دید که سفرهای دوچرخه‌سواری به/از ایستگاه Hyde Park Corner محبوب‌ترین بوده‌اند.

نتایج_query_سفر

سپس، روی جدول cycle_stations که اطلاعات مربوط به هر ایستگاه را ارائه می‌دهد، دوبار کلیک کنید.

ما می‌خواهیم جداول cycle_hire و cycle_stations را به هم متصل کنیم. جدول cycle_stations شامل طول/عرض جغرافیایی هر ایستگاه است. شما از این اطلاعات برای تخمین مسافت طی شده در هر سفر با دوچرخه با محاسبه فاصله بین ایستگاه‌های شروع و پایان استفاده خواهید کرد.

برای انجام این محاسبه، از توابع جغرافیایی BigQuery استفاده خواهید کرد. به طور خاص، هر رشته عرض/طول جغرافیایی را به یک ST_GEOGPOINT تبدیل می‌کنید و از تابع ST_DISTANCE برای محاسبه فاصله خط مستقیم بین دو نقطه بر حسب متر استفاده می‌کنید. از این مقدار به عنوان نماینده مسافت طی شده در هر سفر دوچرخه‌سواری استفاده خواهید کرد.

کوئری زیر را در ویرایشگر SQL خود کپی کنید و سپس روی ارسال کوئری کلیک کنید. توجه داشته باشید که در شرط 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

۶. آموزش یک مدل یادگیری ماشین روی هسته TensorFlow

ورک‌بنچ هوش مصنوعی ورتکس (Vertex AI Workbench) دارای یک لایه سازگاری محاسباتی است که به شما امکان می‌دهد هسته‌های TensorFlow، PySpark، R و غیره را از یک نمونه نوت‌بوک واحد اجرا کنید. در این آزمایش، شما یک نوت‌بوک با استفاده از هسته TensorFlow ایجاد خواهید کرد.

ایجاد دیتافریم

پس از اجرای کوئری، روی کپی کردن کد برای DataFrame کلیک کنید. این به شما امکان می‌دهد کد پایتون را در نوت‌بوکی که به کلاینت BigQuery متصل می‌شود، قرار دهید و این داده‌ها را به عنوان یک DataFrame از pandas استخراج کنید.

کپی_برای_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()

برای اهداف این آزمایش، مجموعه داده‌ها را به ۷۰۰۰۰۰ محدود می‌کنیم تا زمان آموزش کوتاه‌تر شود. اما می‌توانید پرس‌وجو را تغییر دهید و با کل مجموعه داده‌ها آزمایش کنید.

در مرحله بعد، کتابخانه‌های لازم را وارد کنید.

from datetime import datetime
import pandas as pd
import tensorflow as tf

کد زیر را اجرا کنید تا یک دیتافریم کاهش‌یافته ایجاد شود که فقط شامل ستون‌های مورد نیاز برای بخش یادگیری ماشین این تمرین باشد.

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

شما با استفاده از رابط برنامه‌نویسی کاربردی Keras، یک مدل TensorFlow ایجاد خواهید کرد. برای پیش‌پردازش داده‌های ورودی، از رابط برنامه‌نویسی کاربردی لایه‌های پیش‌پردازش Keras استفاده خواهید کرد.

تابع کاربردی زیر یک tf.data.Dataset از دیتافریم pandas ایجاد می‌کند.

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

شما از لایه‌های پیش‌پردازش زیر در مدل استفاده خواهید کرد:

  • لایه نرمال‌سازی : نرمال‌سازی ویژگی‌های ورودی را بر اساس ویژگی‌ها انجام می‌دهد.
  • لایه جستجوی عدد صحیح : مقادیر دسته‌بندی‌شده صحیح را به اندیس‌های عدد صحیح تبدیل می‌کند.
  • لایه کدگذاری دسته‌بندی : ویژگی‌های دسته‌بندی‌شده صحیح را به نمایش‌های متراکم تک‌رنگ، چندرنگ یا 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.fit(train_dataset, validation_data = validation_dataset, epochs = 1)

آموزش مدل با استفاده از پردازنده گرافیکی (GPU)

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

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

اصلاح_سخت‌افزار

گزینه Attach GPUs را انتخاب کنید و یک پردازنده گرافیکی NVIDIA T4 Tensor Core را انتخاب کنید.

add_gpu

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

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

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

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

  • کاوش داده‌ها در BigQuery
  • استفاده از کلاینت BigQuery برای بارگذاری داده‌ها در پایتون
  • آموزش یک مدل TensorFlow با لایه‌های پیش‌پردازش Keras و یک GPU

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

۷. پاکسازی

از آنجا که نوت‌بوک را طوری پیکربندی کرده‌ایم که پس از ۶۰ دقیقه بیکاری، زمان انقضا داشته باشد، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می‌خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می‌خواهید نوت‌بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

حذف