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ı.
2. Vertex AI'a giriş
Bu laboratuvarda, Google Cloud'da sunulan en yeni yapay zeka ürünü kullanılır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyiminde birleştirir. Daha önce, AutoML ile eğitilen modellere ve özel modellere ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, diğer yeni ürünlerle birlikte her ikisini de tek bir API'de birleştirir. Mevcut projeleri Vertex AI'a da 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ılmıştır.
Vertex AI Workbench, kullanıcıların veri hizmetleri (ör. Dataproc, Dataflow, BigQuery ve Dataplex) ve Vertex AI'la kapsamlı entegrasyon üzerinden uçtan uca not defteri tabanlı iş akışlarını hızlıca oluşturmalarına yardımcı olur. Bu araç, veri bilimcilerin GCP veri hizmetlerine bağlanmasına, veri kümelerini analiz etmesine, farklı modelleme tekniklerini denemesine, eğitilmiş modelleri üretime dağıtmasına ve model yaşam döngüsü boyunca MLOps'i 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 bu yana Londra'daki herkese açık bisiklet paylaşımı programından alınan bisiklet gezileriyle ilgili bilgileri içerir. Vertex AI Workbench BigQuery bağlayıcısı aracılığıyla BigQuery'de bu veri kümesini keşfetmeye başlayın. Ardından, verileri pandas kullanarak bir Jupyter Notebook'a yükler ve bir TensorFlow modelini eğiterek bisiklet gezisinin süresini, gezi ne zaman gerçekleştiğine ve kişinin bisikletle ne kadar yol katettiğine göre tahmin edersiniz.
Bu laboratuvarda, giriş verilerini model eğitimi için dönüştürmek ve hazırlamak üzere 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 ile sunum verilerinin aynı dönüşümlerden geçmesini sağlayarak eğitim/sunum sapması riskini azaltır. TensorFlow 2.6'dan itibaren bu API'nin kararlı olduğunu unutmayın. TensorFlow'un eski bir sürümünü kullanıyorsanız deneysel simgeyi 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 var. Proje oluşturmak için buradaki talimatları uygulayın.
1. Adım: Compute Engine API'yi etkinleştirin
Compute Engine'a gidin ve etkin değilse Etkinleştir'i seçin.
2. Adım: Vertex AI API'yi etkinleştirin
Cloud Console'un Vertex AI bölümüne gidip Enable Vertex AI API'yi (Vertex AI API'yi etkinleştir) tıklayın.
3. Adım: Vertex AI Workbench örneği oluşturun
Cloud Console'unuzun Vertex AI bölümünden Workbench'i tıklayın:
Henüz etkinleştirilmediyse Notebooks API'yi etkinleştirin.
Etkinleştirdikten sonra YÖNETİLEN NOT DEFTERİ'ni tıklayın:
Ardından YENİ NOT DEFTERİ'ni seçin.
Not defterinize bir ad verin ve İzin bölümünde Hizmet hesabı'nı seçin.
Gelişmiş Ayarlar'ı seçin.
Güvenlik bölümünde, etkin değilse "Terminali etkinleştir"i seçin.
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'I AÇ'ı seçin.
5. BigQuery'de veri kümesini keşfetme
Vertex AI Workbench örneğinde sol tarafa gidin ve Not defterlerinde BigQuery bağlayıcısını tıklayın.
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.
Bu laboratuvarda, BigQuery herkese açık veri kümelerindeki verileri kullanacaksınız. london_bicycles veri kümesini bulana kadar 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.
Önce cycle_hire tablosunu çift tıklayın. Tablonun, tablonun şemasının yanı sıra satır sayısı ve boyut gibi meta verileri içeren yeni bir sekme olarak açıldığını görürsünüz.
Ö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.
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ında, Hyde Park Corner istasyonuna gidip gelen bisiklet gezilerinin en popüler olduğunu görürsünüz.
Ardından, her istasyon hakkında bilgi veren cycle_stations tablosunu çift tıklayın.
cycle_hire ve cycle_stations tablolarını birleştirmek istiyoruz. cycle_stations tablosu, her istasyonun enlem/boylamını içerir. Bu bilgileri, başlangıç ve bitiş istasyonları arasındaki mesafeyi hesaplayarak her bir bisiklet yolculuğunda katedilen mesafeyi tahmin etmek için kullanırsınız.
Bu hesaplamayı yapmak için BigQuery coğrafi işlevlerini kullanırsınız. Özellikle, her enlem/boylam dizesini bir ST_GEOGPOINT'a dönüştürecek ve ST_DISTANCE işlevini kullanarak iki nokta arasındaki metre cinsinden düz çizgi mesafesini hesaplamalısınız. Bu değeri, her bisiklet yolculuğunda kat edilen mesafenin bir proxy'si olarak kullanırsınız.
Aşağıdaki sorguyu SQL düzenleyicinize kopyalayıp Sorgu Gönder'i tıklayın. Hem döngünün başlangıç istasyonu hem de bitiş istasyonunun enlem/boylam değerini almak için istasyon tablosunu iki kez birleştirmemiz gerektiğinden JOIN koşulunda üç tablo olduğuna dikkat edin.
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 ML modeli eğitme
Vertex AI Workbench, TensorFlow, PySpark, R vb. çekirdeklerini tek bir not defteri örneğinden başlatmanıza olanak tanıyan bir işlem uyumluluğu katmanına sahiptir. 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 istemciye bağlanan ve bu verileri pandas DataFrame olarak ayıklayan bir not defterine Python kodu yapıştırabilirsiniz.
Ardından, Launcher'a dönün ve bir TensorFlow 2 not defteri oluşturun.
Not defterinin ilk hücresine, Sorgu Düzenleyici'den kopyaladığınız kodu yapıştırın. Aşağıdaki gibi görünecektir:
# 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 laboratuvara özel olarak, 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 tüm veri kümesiyle deneme yapabilirsiniz.
Ardından, gerekli kitaplıkları içe aktarın.
from datetime import datetime
import pandas as pd
import tensorflow as tf
Aşağıdaki kodu çalıştırarak yalnızca bu alıştırmanın makine öğrenimi bölümü için gereken sütunları içeren azaltılmış bir veri kümesi oluşturun.
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, Python datetime
öğesidir. Bu datetime
özelliğini doğrudan modelde kullanmak yerine, bisiklet gezisinin gerçekleştiği günün saatini ve gününü belirten iki yeni özellik oluşturursunuz.
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, daha kolay anlaşılması için süre sütununu 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 gezi günü ve saati ile kat edilen mesafeyle ilgili verilere sahipsiniz. Bu bilgilerden yola çıkarak seyahatin ne kadar sürdüğünü tahmin etmeye çalışırsınız.
data.head()
Modeli oluşturup eğitmeden önce 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 yardımcı program işlevi, pandas Dataframe'den bir 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
Yukarıdaki işlevi kullanarak biri eğitim, diğeri doğrulama için olmak üzere iki tf.data.Dataset
oluşturun. 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ş özelliklerini özellik bazında normalleştirir.
- Tam Sayı Arama katmanı: Tam sayı kategorik değerlerini tam sayı dizinlerine dönüştürür.
- CategoryEncoding katmanı: Tam sayı kategorik özellikleri tek sıcak, çok sıcak veya TF-IDF yoğun temsillere dönüştürür.
Bu katmanların eğitilebilir olmadığını unutmayın. Bunun yerine, ön işleme katmanının durumunu, adapt()
yöntemi aracılığıyla eğitim verilerine maruz bırakarak 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 yerleştirmeden önce durumu ayarlarsınız. Bu işlem, 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 verilerinde hesaplanan bu 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 işlev saat ve hafta günü ö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. İlk olarak, özelliklerin her biri için bir 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. Tüm giriş özelliklerini birleştirir ve yoğun bir katmana iletirsiniz. Bu bir regresyon problemi 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, oluşturduğunuz mimariyi
tf.keras.utils.plot_model(model, show_shapes=True, rankdir="LR")
Bu modelin bu basit veri kümesi için oldukça karmaşık olduğunu unutmayın. Bu, gösterim amaçlıdır.
Kodun çalıştığını doğrulamak amacıyla 1 dönem için eğitelim.
model.fit(train_dataset, validation_data = validation_dataset, epochs = 1)
Modeli GPU ile eğitme
Ardından, modeli daha uzun süre eğitir ve eğitimi hızlandırmak için donanım değiştiriciyi kullanırsı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 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.
GPU'ları Bağla'yı ve bir NVIDIA T4 Tensor Core GPU seçin.
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. 🎉
Aşağıdakiler için Vertex AI Workbench'i nasıl kullanacağınızı öğrendiniz:
- BigQuery'de verileri keşfetme
- Python'a veri 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 dakikalık işlem yapılmadığında zaman aşımı olacak şekilde yapılandırdığımız için örneği kapatma konusunda endişelenmenize gerek yoktur. Örneğini manuel olarak kapatmak istiyorsanız konsolun Vertex AI Workbench bölümündeki Durdur düğmesini tıklayın. Not defterini tamamen silmek istiyorsanız Sil düğmesini tıklayın.