從 Vertex AI 特徵儲存庫 (舊版) 遷移至 Bigtable
將機器學習特徵管理工作負載從 Vertex AI 特徵儲存庫 (舊版) 遷移至 Bigtable,可提升效能和彈性。本指南將概略說明相關概念和遷移程序。
Vertex AI 特徵儲存庫 (舊版) 是代管環境,使用 Bigtable 做為線上服務層。直接在 Bigtable 上執行 AI 平台或特徵儲存庫,而不使用 Vertex AI 特徵儲存庫 (舊版),可加快速度並降低成本。
建議您採取最精簡的遷移路徑,著重於將 Vertex AI 特徵儲存庫 (舊版) 中基礎 Bigtable 資料表的資料,遷移至您在 Google Cloud 專案中建立的 Bigtable 執行個體。
遷移的優點
遷移至 Bigtable 可帶來多項策略和營運優勢:
- 成本效益:您可免除 Vertex AI 特徵儲存庫 (舊版) 的特定節點管理費用,通常能降低基礎架構成本。
- 直接控制:您可完整存取 Bigtable 功能。Bigtable 監控功能提供的指標比 Vertex AI 特徵儲存庫 (舊版) 多得多。此外,您也可以進一步掌控自訂架構版面配置和調度。
- 高效能:Bigtable 支援高效能工作負載和高效能功能,例如寫入時的彙整和向量搜尋。
跨產品整合:您可以存取 Bigtable 整合功能,例如 BigQuery 外部資料表、Apache Spark、Apache Flink 和 Kafka Connect 的連接器,以及 從 BigQuery 進行反向 ETL。
擷取變更資料:您可以啟用變更串流,在 Bigtable 特徵商店表格發生變更時擷取這些變更。
基本概念
本節說明 Bigtable 和 BigQuery 如何實作核心 Vertex AI 特徵儲存庫 (舊版) 概念。
資料保留
在 Bigtable 中,您可以使用垃圾收集功能管理資料保留時間。垃圾收集是持續進行的自動流程,可從 Bigtable 資料表移除過期與過時資料。垃圾收集政策是您建立的一組規則,指出何時不再需要特定特徵中的資料。在 Bigtable 中,特徵定義為資料欄系列。垃圾收集政策是根據與資料相關聯的時間戳記,或您想保留的版本數量設定。
垃圾收集是內建的非同步背景程序,會在壓縮期間執行。垃圾收集會以固定排程進行。資料在刪除之前會顯示在讀取結果中,但您可以篩選讀取來排除此資料。詳情請參閱「垃圾收集總覽」。
此外,對於需要保留歷史資料以訓練模型或符合法規遵循要求的線上特徵儲存庫,Bigtable 分層儲存空間是經濟實惠的解決方案。分層儲存空間會管理不常存取的資料,將這些資料從 SSD 儲存空間的線上服務移至成本較低的儲存空間層級。
功能開發
在 Bigtable 中,您可以使用 Bigtable SQL 實作線上特徵開發,並使用 BigQuery DataFrame 實作離線特徵開發。
使用 Vertex AI 特徵儲存庫 (舊版) 時,您會使用開發人員 API 和資料模型,這些 API 和資料模型會對應至在 BigQuery 中準備的基礎資料來源。接著,您會在特徵登錄中註冊這些資料來源和特定特徵資料欄。使用 Bigtable 特徵存放區時,您可以直接處理基礎 BigQuery 和 Bigtable 執行個體中的資料,不必對應至 Vertex AI 特徵存放區 (舊版) 資料模型。
線上功能開發
Bigtable 提供多種線上功能開發工具:
- Python 用戶端程式庫:使用 Bigtable 適用的 Python 用戶端程式庫,直接處理 Bigtable 中的資料。
- GoogleSQL:使用 GoogleSQL 讀取及轉換 Bigtable 中的資料。您可以直接在 Bigtable 控制台中執行 SQL 查詢,或透過 Python 用戶端程式庫執行。
- 持續性具體化檢視區塊:如要建立近乎即時的特徵,需要重複進行轉換和彙整,請使用 Bigtable 持續性具體化檢視區塊,針對進入 Bigtable 的資料遞增執行 SQL 查詢。
離線特徵開發
如要離線開發特徵,BigQuery DataFrames 提供 Python 介面,內含超過 750 個 pandas 和 scikit-learn API。這些 API 是透過 SQL 轉換為 BigQuery 和 BigQuery ML API 實作。BigQuery DataFrames 功能生成作業可使用內建和使用者定義的 Python 函式。此外,系統也會自動將資料同步至 Bigtable,以提供在批次和離線程序中建立的特徵,詳情請參閱下一節。
線上和離線功能同步
直接使用 Bigtable 處理機器學習工作負載時,您可以確保離線特徵值是從 BigQuery 匯入,且訓練和提供模型時都會重複使用相同值,讓訓練和提供模型時產生特徵的程式碼路徑保持同步。下列技術可啟用功能同步:
- 批次同步:從 BigQuery 到 Bigtable 的反向 ETL 可將 BigQuery 查詢結果匯出至 Bigtable。這些查詢會以批次形式執行,且可直接從 BigQuery 排定時間。
- 串流同步:BigQuery 持續查詢是持續執行的 SQL 陳述式,可將資料列輸出至 Bigtable 資料表。
- 從 BigQuery DataFrames 進行同步:如要擷取以 Python 開發的離線特徵,可以使用 BigFrames StreamingDataFrame 生成 BigQuery 連續查詢,擷取特徵生成的 Python 邏輯,並將資料結果與 Bigtable 同步。
- 直接在 Bigtable 資料上開發離線特徵:您可以使用 BigQuery 外部資料表,在 BigQuery 中針對 Bigtable 儲存的資料建構離線特徵。外部資料表的外觀與 BigQuery 資料表相似,並提供大部分相同的功能,例如聯結、排定查詢和進階 BigQuery SQL 函式,不必將資料移回 BigQuery 儲存空間。如要避免影響應用程式服務流量,您可以使用 Data Boost 無伺服器運算,透過 BigQuery 外部資料表讀取 Bigtable 資料。對於臨時查詢,使用 Data Boost 特別符合成本效益。如要使用 Data Boost,請在建立外部資料表定義時指定 Data Boost 應用程式設定檔。如要進一步瞭解 Data Boost,請參閱 Bigtable Data Boost 總覽。
遷移後,您仍可使用 Vertex AI Model Monitoring 追蹤模型品質。
同時使用 Bigtable 和 BigQuery 是建構即時分析資料庫的常見模式。
遷移階段
為確保服務不中斷,遷移作業通常會分成下列幾個階段。
第 1 階段:準備基礎架構
開始遷移前,請先設定目的地環境:
- 在專案中建立 Bigtable 執行個體,做為新的線上商店。
- 建立 BigQuery 資料集和資料表,暫時儲存從 Vertex AI 特徵儲存庫 (舊版) 匯出的資料。
- 設定 IAM:請確認執行遷移作業的帳戶具備從舊版特徵商店讀取資料,以及寫入新 Bigtable 執行個體的權限。詳情請參閱「 使用 IAM 控管 Bigtable 存取權」和「控管 Vertex AI 特徵儲存庫 (舊版) 資源的存取權」。
階段 2:定義 Vertex AI 特徵儲存庫 (舊版) 和 Bigtable 之間的結構定義對應
查看並瞭解 Bigtable 結構定義設計最佳做法。Vertex AI 特徵儲存庫 (舊版) API 與 Bigtable API 的大致對應關係如下:
Vertex AI 特徵儲存庫 (舊版) 資源
Bigtable 元件
FeatureOnlineStoreBigtable 執行個體
FeatureView資料欄系列
featureValues(批次)資料欄 (每個鍵一個儲存格)
featureValues(連續)資料欄 (每個鍵有多個儲存格 [版本控管])
定義結構定義對應後,請建立 Bigtable 資料表,為來源特徵存放區中的每個特徵提供資料欄系列。
階段 3:資料擷取和同步處理
在這個階段,您會根據資料的更新頻率,採用分層方法遷移資料。
即時同步處理功能
如果是使用 write_feature_values 或同等 API 呼叫寫入的功能,請開始將相同資料寫入新的 Bigtable 資料表。
- 安裝 Bigtable 適用的 Python 用戶端程式庫。
- 設定應用程式,同時將特徵資料寫入 Vertex AI 特徵儲存庫 (舊版) 和 Bigtable。如要進一步瞭解如何將資料寫入 Bigtable,請參閱「寫入」一節。
批次特徵遷移
接著,遷移開始雙重寫入前儲存的資料。這包括將資料從 Vertex AI 特徵儲存庫 (舊版) 移至 BigQuery,然後再移至 Bigtable。
- 使用 Vertex AI 特徵儲存庫 (舊版) 的匯出功能,將特徵儲存庫資料匯出至 BigQuery,您可以匯出所有值或快照。這樣一來,BigQuery 就能做為 Vertex AI 特徵儲存庫 (舊版) 的離線儲存庫。
- 使用下列任一方法,將 BigQuery 中的歷來資料遷移至 Bigtable:
- 反向 ETL
- Bigtable Spark 連接器
- BigQuery 至 Bigtable Dataflow 範本
第 4 階段:應用程式和 SDK 轉換
最後一步是切換應用程式層。
- 完成遷移並測試後,請停止寫入 Vertex AI 特徵儲存庫 (舊版)。
修改應用程式,只使用 Bigtable 的 Python 用戶端程式庫。
以下範例說明如何使用 Python 從 Bigtable 擷取單一特徵。
from google.cloud import bigtable from google.cloud.bigtable import row_filters # Replace 'project_id' and 'instance_id' with your actual IDs. client = bigtable.Client(project=project_id) instance = client.instance(instance_id) #return only the latest feature row_filter = bigtable.row_filters.CellsColumnLimitFilter(1) # Replace 'user1' and 'feature0` with your actual row key and column qualifier. print("Getting a single feature by row key.") key = "user1".encode() row = table.read_row(key, row_filter) cell = row.cells[column_family_id.decode("utf-8")][feature0][0] print(cell.value.decode("utf-8"))如需使用 Bigtable 資料和管理 API 讀取及寫入資料的另一個範例,請參閱 Python Hello World。
您也可以使用 Bigtable 的 Python 用戶端程式庫,透過 GoogleSQL 傳回符合篩選條件的特徵,或轉換特徵。以下範例說明如何從 Bigtable Python 用戶端程式庫非同步呼叫 SQL 查詢。如要進一步瞭解 Bigtable 適用的 GoogleSQL,請參閱其他 SQL 範例。
import asyncio from google.cloud.bigtable.data_async import BigtableDataClient from google.cloud.bigtable_v2.types import ExecuteQueryRequest async def run_bigtable_sql_query(project_id, instance_id, table_id): """ Runs a GoogleSQL query on a Bigtable table using the async client. """ client = BigtableDataClient(project_id=project_id) instance = client.instance(instance_id) table = instance.table(table_id) # Example query: Select a specific row and all columns from a column family # Replace 'my_table' and 'my_cf' with your actual table and column family IDs. # The table name in the SQL must be in the format `dataset.table`, # where dataset is the instance ID and table is the table ID (in backticks). sql_query = f"SELECT _key, my_cf FROM `{instance_id}`.`{table_id}` WHERE _key = 'user_123'" print(f"Executing query: {sql_query}") # The client library automatically handles the SQL execution try: # The query method returns an AsyncPartialRowsIterator results_iterator = await table.query(query=sql_query) async for row in results_iterator: print(f"Row key: {row.row_key.decode('utf-8')}") # Iterate through the cells in the row for col_family, cells in row.cells.items(): for cell in cells: print(f" Column Family: {col_family}, Qualifier: {cell.qualifier.decode('utf-8')}, Value: {cell.value.decode('utf-8')}, Timestamp: {cell.timestamp_micros}") except Exception as e: print(f"An error occurred: {e}") finally: await client.close() if __name__ == "__main__": # TODO(developer): Replace with your project, instance, and table IDs your_project_id = "your-gcp-project-id" your_instance_id = "your-bigtable-instance-id" your_table_id = "your-bigtable-table-id" # Run the asynchronous function asyncio.run(run_bigtable_sql_query(your_project_id, your_instance_id, your_table_id))開始使用 Bigtable 指標監控延遲時間和處理量。詳情請參閱「監控」。
最佳做法
從 Vertex AI 特徵儲存庫 (舊版) 遷移至 Bigtable 特徵儲存庫實作項目後,您需要複製先前由服務處理的內部前置處理和最佳化邏輯,以維持穩定性和效能。
用戶端自動調整節流
Vertex AI 特徵儲存庫 (舊版) 後端會使用用戶端適應性節流器,避免基礎 Bigtable 執行個體在流量尖峰期間過載,或儲存後端發生高延遲或錯誤時過載。建議您在應用程式程式碼中實作類似的節流器,以註冊後端回應,並在需要時主動節流要求。
要求分區和批次大小最佳化
Bigtable 資料列篩選條件的大小上限為 20 KB。在單一篩選讀取作業中要求過多特徵或實體 ID,可能會導致要求失敗。如要模擬 Vertex AI 特徵儲存庫 (舊版) 的行為,請執行下列操作:
- 區塊特徵 ID:將每個 Bigtable 讀取作業的特徵 ID 數量限制在 100 個左右。
- 平衡實體批次:為避免在執行多實體讀取作業時,用戶端或伺服器資源飽和,請採取下列預防措施:
- 將實體分割成小型的並行批次,例如每個批次 10 個實體。
- 限制並行批次要求的數量上限,例如 10 到 20 個。
智慧篩選器選取
在伺服器端計算及套用資料欄篩選器會增加額外負擔。如果應用程式通常會要求資料欄系列中的幾乎所有功能 (例如超過 99.9%),略過資料欄篩選器並讀取完整資料列,然後在用戶端篩選結果,會更有效率。
並行與非同步執行
如要在串流情境中盡量縮短取得第一個結果的時間,請使用非同步模式或執行緒套件,平行擷取實體批次。這樣一來,應用程式就能在第一批結果傳回時開始處理,不必等待大型序列讀取作業完成。
後續步驟
- 如需高輸送量工作負載或架構指引方面的協助,請與您的帳戶代表聯絡。
- 請參閱 Feast 的 Bigtable 整合。
- 瞭解 Credit Karma 如何運用 Bigtable 和 BigQuery,每天執行多達 600 億次的模型預測。