Vertex AI Workbench: BigQuery'deki verilerle TensorFlow modeli eğitme

1. Genel Bakış

Bu laboratuvarda, veri keşfi ve makine öğrenimi modeli eğitimi için Vertex AI Workbench'i nasıl kullanacağınızı öğreneceksiniz.

Öğrenecekleriniz

Öğrenecekleriniz:

  • Vertex AI Workbench örneği oluşturma ve yapılandırma
  • Vertex AI Workbench BigQuery bağlayıcısını kullanma
  • Vertex AI Workbench çekirdeğinde model eğitme

Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 1 ABD dolarıdır.

2. Vertex AI'a giriş

Bu laboratuvarda, Google Cloud'da sunulan en yeni yapay zeka ürünü kullanılmaktadır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyimi için entegre eder. Daha önce, AutoML ile eğitilmiş modeller ve özel modeller ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, diğer yeni ürünlerle birlikte bu iki ürünü tek bir API'de birleştirir. Mevcut projeleri de Vertex AI'a taşıyabilirsiniz.

Vertex AI, uçtan uca makine öğrenimi iş akışlarını desteklemek için birçok farklı ürün içerir. Bu laboratuvarda Vertex AI Workbench'e odaklanılacaktır.

Vertex AI Workbench, veri hizmetleriyle (ör. Dataproc, Dataflow, BigQuery ve Dataplex) ve Vertex AI ile derin entegrasyon sayesinde kullanıcıların uçtan uca not defteri tabanlı iş akışlarını hızlı bir şekilde oluşturmasına yardımcı olur. Bu hizmet, veri bilimcilerin GCP veri hizmetlerine bağlanmasına, veri kümelerini analiz etmesine, farklı modelleme teknikleriyle denemeler yapmasına, eğitilmiş modelleri üretimde dağıtmasına ve model yaşam döngüsü boyunca MLOps'u yönetmesine olanak tanır.

3. Kullanım Alanına Genel Bakış

Bu laboratuvarda, London Bicycles Hire veri kümesini keşfedeceksiniz. Bu veriler, 2011'den beri Londra'daki kamuya açık bisiklet paylaşım programından elde edilen bisiklet gezileriyle ilgili bilgileri içerir. Öncelikle Vertex AI Workbench BigQuery bağlayıcısı aracılığıyla BigQuery'de bu veri kümesini keşfedeceksiniz. Ardından, verileri pandas kullanarak bir Jupyter Notebook'a yükleyecek ve gezinin ne zaman gerçekleştiğine ve kişinin ne kadar bisiklet sürdüğüne bağlı olarak bisiklet gezisinin süresini tahmin etmek için bir TensorFlow modeli eğiteceksiniz.

Bu laboratuvarda, giriş verilerini dönüştürüp model eğitimine hazırlamak için Keras ön işleme katmanları kullanılır. Bu API, ön işlemeyi doğrudan TensorFlow model grafiğinize yerleştirmenize olanak tanır. Eğitim verileri ve sunma verilerinin aynı dönüşümlerden geçmesini sağlayarak eğitim/sunma sapması riskini azaltır. Bu API'nin TensorFlow 2.6 itibarıyla kararlı olduğunu unutmayın. TensorFlow'un eski bir sürümünü kullanıyorsanız deneysel sembolü içe aktarmanız gerekir.

4. Ortamınızı ayarlama

Bu codelab'i çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projesine ihtiyacınız vardır. Proje oluşturmak için buradaki talimatları uygulayın.

1. adım: Compute Engine API'yi etkinleştirin

Compute Engine'e gidin ve henüz etkinleştirilmemişse Etkinleştir'i seçin.

2. adım: Vertex AI API'yi etkinleştirin

Cloud Console'unuzun Vertex AI bölümüne gidin ve Vertex AI API'yi etkinleştir'i tıklayın.

Vertex AI kontrol paneli

3. adım: Vertex AI Workbench örneği oluşturma

Cloud Console'unuzun Vertex AI bölümünde Workbench'i tıklayın:

Vertex AI menüsü

Henüz etkinleştirilmemişse Notebooks API'yi etkinleştirin.

Notebook_api

Etkinleştirildikten sonra YÖNETİLEN NOT DEFTERLERİ'ni tıklayın:

Notebooks_UI

Ardından YENİ NOT DEFTERİ'ni seçin.

new_notebook

Not defterinize bir ad verin ve İzin bölümünde Hizmet hesabı'nı seçin.

service_account

Gelişmiş Ayarlar'ı seçin.

Güvenlik bölümünde, henüz etkinleştirilmemişse "Terminali etkinleştir"i seçin.

enable_terminal

Diğer tüm gelişmiş ayarları olduğu gibi bırakabilirsiniz.

Ardından Oluştur'u tıklayın.

Örnek oluşturulduktan sonra JUPYTERLAB'İ AÇ'ı seçin.

enable_terminal

5. Veri kümesini BigQuery'de keşfetme

Vertex AI Workbench örneğinde sol tarafa gidin ve BigQuery in Notebooks bağlayıcısını tıklayın.

BQ bağlayıcısı

BigQuery bağlayıcısı, BigQuery veri kümelerini kolayca keşfetmenize ve sorgulamanıza olanak tanır. Projenizdeki veri kümelerine ek olarak, Proje Ekle düğmesini tıklayarak diğer projelerdeki veri kümelerini de keşfedebilirsiniz.

pin

Bu laboratuvarda, BigQuery herkese açık veri kümelerindeki verileri kullanacaksınız. london_bicycles veri kümesini bulana kadar ekranı aşağı kaydırın. Bu veri kümesinin cycle_hire ve cycle_stations olmak üzere iki tablosu olduğunu görürsünüz. Her birini inceleyelim.

london_bike_ds

Öncelikle cycle_hire tablosunu çift tıklayın. Tablonun, tablo şemasıyla birlikte satır sayısı ve boyut gibi meta verilerle yeni bir sekmede açıldığını görürsünüz.

cycle_hire_ds

Önizleme sekmesini tıklarsanız verilerin bir örneğini görebilirsiniz. Popüler yolculukların neler olduğunu görmek için basit bir sorgu çalıştıralım. Öncelikle Tabloyu sorgula düğmesini tıklayın.

cycle_hire_preview_ds

Ardından, aşağıdakileri SQL düzenleyiciye yapıştırın ve Sorguyu Gönder'i tıklayın.

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

Sorgu sonuçlarından, Hyde Park Corner istasyonuna yapılan bisiklet gezilerinin en popüler olduğu anlaşılıyor.

journey_query_results

Ardından, her istasyon hakkında bilgi sağlayan cycle_stations tablosunu çift tıklayın.

cycle_hire ve cycle_stations tablolarını birleştirmek istiyoruz. cycle_stations tablosu, her istasyonun enlem/boylam bilgisini içerir. Başlangıç ve bitiş istasyonları arasındaki mesafeyi hesaplayarak her bisiklet gezisinde gidilen mesafeyi tahmin etmek için bu bilgileri kullanırsınız.

Bu hesaplamayı yapmak için BigQuery coğrafya işlevlerini kullanacaksınız. Özellikle, her enlem/boylam dizesini ST_GEOGPOINT'e dönüştürecek ve iki nokta arasındaki düz çizgi mesafesini metre cinsinden hesaplamak için ST_DISTANCE işlevini kullanacaksınız. Bu değeri, her bisiklet gezisinde gidilen mesafenin proxy'si olarak kullanırsınız.

Aşağıdaki sorguyu SQL düzenleyicinize kopyalayın ve Sorguyu Gönder'i tıklayın. Hem bisikletin başlangıç istasyonu hem de bitiş istasyonu için enlem/boylam değerlerini almak üzere istasyonlar tablosunu iki kez birleştirmemiz gerektiğinden JOIN koşulunda üç tablo olduğunu unutmayın.

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. TensorFlow çekirdeğinde makine öğrenimi modeli eğitme

Vertex AI Workbench'te, TensorFlow, PySpark, R vb. için çekirdekleri tek bir not defteri örneğinden başlatmanıza olanak tanıyan bir işlem uyumluluğu katmanı bulunur. Bu laboratuvarda, TensorFlow çekirdeğini kullanarak bir not defteri oluşturacaksınız.

DataFrame oluşturma

Sorgu yürütüldükten sonra DataFrame için kodu kopyala'yı tıklayın. Bu sayede, BigQuery istemcisine bağlanan ve bu verileri pandas DataFrame olarak çıkaran bir not defterine Python kodu yapıştırabilirsiniz.

copy_for_df

Ardından, Başlatıcı'ya dönün ve bir TensorFlow 2 not defteri oluşturun.

tf_kernel

Not defterinin ilk hücresine, sorgu düzenleyiciden kopyalanan kodu yapıştırın. Şöyle görünmelidir:

# 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()

Bu laboratuvarın amacı doğrultusunda, eğitim süresini kısaltmak için veri kümesini 700.000 ile sınırlandırıyoruz. Ancak sorguyu değiştirebilir ve veri kümesinin tamamıyla denemeler yapabilirsiniz.

Ardından, gerekli kitaplıkları içe aktarın.

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

Bu alıştırmanın makine öğrenimi bölümü için gereken sütunları içeren, küçültülmüş bir DataFrame oluşturmak üzere aşağıdaki kodu çalıştırın.

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 sütunu bir Python datetime'dır. Bu datetime özelliğini doğrudan modelde kullanmak yerine, bisiklet gezisinin gerçekleştiği haftanın gününü ve günün saatini belirten iki yeni özellik oluşturacaksınız.

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

Son olarak, süreyi daha kolay anlaşılması için saniyeden dakikaya dönüştürün.

data['duration'] = data['duration'].apply(lambda x:float(x / 60))

Biçimlendirilmiş DataFrame'in ilk birkaç satırını inceleyin. Artık her bisiklet gezisi için gezinin gerçekleştiği gün ve saat ile gidilen mesafeyle ilgili verilere sahipsiniz. Bu bilgilerden yararlanarak gezinin ne kadar sürdüğünü tahmin etmeye çalışacaksınız.

data.head()

data_head

Modeli oluşturup eğitebilmeniz için verileri eğitim ve doğrulama kümelerine ayırmanız gerekir.

# 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 modeli oluşturma

Keras Functional API'yi kullanarak bir TensorFlow modeli oluşturacaksınız. Giriş verilerini önceden işlemek için Keras ön işleme katmanları API'sini kullanacaksınız.

Aşağıdaki hizmet işlevi, pandas DataFrame'den tf.data.Dataset oluşturur.

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

Eğitim ve doğrulama için birer tane olmak üzere iki tf.data.Dataset oluşturmak üzere yukarıdaki işlevi kullanın. Bazı uyarılar görebilirsiniz ancak bunları güvenle yoksayabilirsiniz.

train_dataset = df_to_dataset(train_data, 'duration')
validation_dataset = df_to_dataset(val_data, 'duration')

Modelde aşağıdaki ön işleme katmanlarını kullanacaksınız:

  • Normalleştirme katmanı: Giriş özelliklerinin özellik bazında normalleştirilmesini gerçekleştirir.
  • IntegerLookup katmanı: Tam sayı kategorik değerlerini tam sayı dizinlerine dönüştürür.
  • CategoryEncoding katmanı: Tamsayı kategorik özelliklerini one-hot, multi-hot veya TF-IDF yoğun gösterimlerine dönüştürür.

Bu katmanların eğitilebilir olmadığını unutmayın. Bunun yerine, adapt() yöntemini kullanarak ön işleme katmanını eğitim verilerine maruz bırakarak ön işleme katmanının durumunu ayarlarsınız.

Aşağıdaki işlev, mesafe özelliğinde kullanabileceğiniz bir normalleştirme katmanı oluşturur. Eğitim verilerinde adapt() yöntemini kullanarak modeli uydurmadan önce durumu ayarlarsınız. Bu, normalleştirme için kullanılacak ortalamayı ve varyansı hesaplar. Daha sonra doğrulama veri kümesini modele ilettiğinizde, doğrulama verilerini ölçeklendirmek için eğitim verileri üzerinde hesaplanan aynı ortalama ve varyans kullanılır.

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

Benzer şekilde, aşağıdaki fonksiyon, saat ve hafta içi özelliklerinde kullanacağınız bir kategori kodlaması oluşturur.

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

Ardından, modelin ön işleme kısmını oluşturun. Öncelikle, her bir özellik için tf.keras.Input katmanı oluşturun.

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

Ardından, normalleştirme ve kategori kodlama katmanlarını oluşturup bir listede saklayın.

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)

Ön işleme katmanlarını tanımladıktan sonra modelin geri kalanını tanımlayabilirsiniz. Giriş özelliklerinin tümünü birleştirip yoğun bir katmana iletirsiniz. Bu bir regresyon sorunu olduğundan çıkış katmanı tek bir birimdir.

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)

Son olarak modeli derleyin.

model.compile(optimizer = tf.keras.optimizers.Adam(0.001),
              loss='mean_squared_logarithmic_error')

Modeli tanımladığınıza göre artık mimariyi görselleştirebilirsiniz.

tf.keras.utils.plot_model(model, show_shapes=True, rankdir="LR")

keras_model

Bu modelin, bu basit veri kümesi için oldukça karmaşık olduğunu unutmayın. Bu, yalnızca gösterim amaçlıdır.

Kodun çalıştığını onaylamak için 1 dönem boyunca eğitim yapalım.

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

GPU ile model eğitme

Ardından, modeli daha uzun süre eğitecek ve eğitimi hızlandırmak için donanım değiştiriciyi kullanacaksınız. Vertex AI Workbench, örneğinizi kapatmadan donanımı değiştirmenize olanak tanır. GPU'yu yalnızca ihtiyaç duyduğunuzda ekleyerek maliyetleri daha düşük tutabilirsiniz.

Donanım profilini değiştirmek için sağ üst köşedeki makine türünü tıklayın ve Donanımı değiştir'i seçin.

modify_hardware

GPU'ları ekle'yi ve NVIDIA T4 Tensor Çekirdekli GPU'yu seçin.

add_gpu

Donanımın yapılandırılması yaklaşık beş dakika sürer. İşlem tamamlandıktan sonra modeli biraz daha eğitelim. Artık her dönemin daha kısa sürdüğünü fark edeceksiniz.

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

🎉 Tebrikler! 🎉

Vertex AI Workbench'i kullanarak şunları yapmayı öğrendiniz:

  • BigQuery'deki verileri keşfetme
  • Verileri Python'a yüklemek için BigQuery istemcisini kullanma
  • Keras Ön İşleme Katmanları ve GPU ile TensorFlow modeli eğitme

Vertex AI'ın farklı bölümleri hakkında daha fazla bilgi edinmek için belgelere göz atın.

7. Temizleme

Not defterini 60 dakika boşta kaldıktan sonra zaman aşımına uğrayacak şekilde yapılandırdığımız için örneği kapatmamız gerekmez. Örneği manuel olarak kapatmak istiyorsanız konsolun Vertex AI Workbench bölümündeki Durdur düğmesini tıklayın. Not defterini tamamen silmek isterseniz Sil düğmesini tıklayın.

delete