Vertex AI Feature Store (기존)에서 Bigtable로 마이그레이션
머신러닝 기능 관리 워크로드를 Vertex AI Feature Store (기존)에서 Bigtable로 마이그레이션하면 성능과 유연성이 향상될 수 있습니다. 이 가이드에서는 관련 개념과 이전 프로세스를 간략하게 설명합니다.
Vertex AI Feature Store (기존)는 Bigtable을 온라인 서빙 레이어로 사용하는 관리형 환경입니다. Vertex AI Feature Store (기존)를 사용하지 않고 Bigtable에서 직접 AI 플랫폼 또는 특성 스토어를 실행하면 속도가 빨라지고 비용이 절감될 수 있습니다.
Vertex AI Feature Store (기존)의 기본 Bigtable 테이블에서 Google Cloud 프로젝트에 생성한 Bigtable 인스턴스로 데이터를 마이그레이션하는 데 중점을 둔 최소한의 실행 가능한 마이그레이션 경로를 사용하는 것이 좋습니다.
이전의 이점
Bigtable로 마이그레이션하면 다음과 같은 여러 전략적 및 운영적 이점이 있습니다.
- 비용 효율성: Vertex AI Feature Store (기존) 전용 노드 관리 프리미엄이 없어지므로 인프라 비용이 절감되는 경우가 많습니다.
- 직접 제어: Bigtable 기능에 대한 전체 액세스 권한을 얻습니다. Bigtable 모니터링은 Vertex AI Feature Store (기존)보다 훨씬 많은 측정항목을 노출합니다. 또한 맞춤 아키텍처 레이아웃과 확장 기능을 더 세부적으로 제어할 수 있습니다.
- 고성능: Bigtable은 고성능 워크로드와 쓰기 시 집계, 벡터 검색과 같은 고성능 기능을 지원합니다.
제품 간 통합: BigQuery 외부 테이블, Apache Spark, Apache Flink, Kafka Connect용 커넥터, BigQuery의 역 ETL과 같은 Bigtable 통합에 액세스할 수 있습니다.
변경 데이터 캡처: 변경 내역을 사용 설정하여 변경사항이 발생할 때 Bigtable 기능 스토어 테이블의 변경사항을 캡처할 수 있습니다.
주요 개념
이 섹션에서는 핵심 Vertex AI Feature Store (기존) 개념이 Bigtable 및 BigQuery에 의해 구현되는 방식을 설명합니다.
데이터 보관
Bigtable에서는 가비지 컬렉션을 사용하여 데이터 보관을 관리합니다. 가비지 컬렉션은 Bigtable 테이블에서 만료되어 사용되지 않는 데이터를 지속적으로 자동 삭제하는 프로세스입니다. 가비지 컬렉션 정책은 개발자가 만든 규칙 집합으로 Bigtable에 column family로 정의된 특정 기능의 데이터가 더 이상 필요하지 않은 시점을 나타냅니다. 가비지 컬렉션 정책은 데이터와 연결된 타임스탬프 또는 유지할 버전 수를 기반으로 설정됩니다.
가비지 컬렉션은 압축 중에 발생하는 기본 제공 비동기 백그라운드 프로세스입니다. 가비지 컬렉션은 고정된 일정에 수행됩니다. 데이터는 삭제될 때까지 읽기 결과에 나타나지만 읽을 때 필터를 사용하면 결과에서 이 데이터를 제외할 수 있습니다. 자세한 내용은 가비지 컬렉션 개요를 참고하세요.
또한 Bigtable 계층화된 스토리지는 모델 학습 또는 규정 준수를 위해 이전 데이터를 보관해야 하는 온라인 특성 스토어에 비용 효율적인 솔루션이 될 수 있습니다. 계층형 스토리지는 액세스 빈도가 낮은 데이터를 SSD 스토리지의 온라인 제공에서 저렴한 스토리지 계층으로 이동하는 작업을 관리합니다.
기능 개발
Bigtable에서는 Bigtable SQL을 사용하여 온라인 특성 개발을 구현할 수 있으며 BigQuery DataFrames를 사용하여 오프라인 특성 개발을 구현할 수 있습니다.
Vertex AI Feature Store (기존)를 사용하면 BigQuery에서 준비된 기본 데이터 소스에 매핑되는 개발자 API 및 데이터 모델을 사용합니다. 그런 다음 이러한 데이터 소스와 특정 특성 열을 특성 레지스트리에 등록합니다. Bigtable 특성 스토어를 사용하면 Vertex AI Feature Store (기존) 데이터 모델에 매핑할 필요 없이 기본 BigQuery 및 Bigtable 인스턴스의 데이터를 직접 사용할 수 있습니다.
온라인 기능 개발
온라인 기능 개발을 위해 Bigtable은 다음과 같은 여러 도구를 제공합니다.
- Python 클라이언트 라이브러리: Bigtable용 Python 클라이언트 라이브러리를 사용하여 Bigtable의 데이터를 직접 처리합니다.
- GoogleSQL: GoogleSQL을 사용하여 Bigtable의 데이터를 읽고 변환합니다. Bigtable 콘솔에서 직접 또는 Python 클라이언트 라이브러리에서 SQL 쿼리를 실행할 수 있습니다.
- 연속 구체화된 뷰: 반복적인 변환과 집계가 필요한 거의 실시간 기능을 만들려면 Bigtable 연속 구체화된 뷰를 사용하여 데이터가 Bigtable에 들어올 때 데이터에 대해 SQL 쿼리를 점진적으로 실행합니다.
오프라인 기능 개발
오프라인 기능 개발의 경우 BigQuery DataFrames는 750개가 넘는 Pandas 및 scikit-learn API가 포함된 Python 인터페이스를 제공합니다. 이러한 API는 BigQuery 및 BigQuery ML API로의 SQL 변환을 통해 구현됩니다. BigQuery DataFrames 기능 생성을 사용하면 기본 제공 Python 함수와 사용자 정의 Python 함수를 모두 사용할 수 있습니다. 또한 다음 섹션에 설명된 일괄 및 오프라인 프로세스에서 생성된 기능을 제공하기 위해 Bigtable에 자동 데이터 동기화를 제공합니다.
온라인 및 오프라인 기능 동기화
ML 워크로드에 Bigtable을 직접 사용하는 경우 오프라인 특성 값이 BigQuery에서 가져오고 동일한 값이 학습 및 서빙에 재사용되도록 하여 학습과 서빙 간에 특성을 생성하기 위한 코드 경로를 동기화할 수 있습니다. 다음 기술을 사용하면 기능 동기화가 가능합니다.
- 일괄 동기화: BigQuery에서 Bigtable로의 역방향 ETL을 사용하면 BigQuery 쿼리 결과를 Bigtable로 내보낼 수 있습니다. 이러한 쿼리는 일괄적으로 실행되며 BigQuery에서 직접 예약할 수 있습니다.
- 스트리밍 동기화: BigQuery 연속 쿼리는 지속적으로 실행되어 Bigtable 테이블에 행을 출력하는 SQL 문입니다.
- BigQuery DataFrames에서 동기화: Python에서 개발된 오프라인 기능을 캡처하려면 BigFrames StreamingDataFrame를 사용하여 기능 생성을 위한 Python 로직을 캡처하고 데이터 결과를 Bigtable과 동기화하는 BigQuery 연속 쿼리를 생성하면 됩니다.
- Bigtable 데이터에 직접 오프라인 기능 개발: BigQuery 외부 테이블을 사용하여 Bigtable에 저장된 데이터에 대해 BigQuery에서 오프라인 기능을 빌드할 수 있습니다. 외부 테이블은 BigQuery 테이블의 모양을 반영하며 데이터를 BigQuery 스토리지로 다시 이동하지 않고도 조인, 예약된 쿼리, 고급 BigQuery SQL 함수와 같은 대부분의 동일한 기능을 제공합니다. 애플리케이션 제공 트래픽에 영향을 주지 않으려면 BigQuery 외부 테이블로 Bigtable 데이터를 읽을 때 Data Boost 서버리스 컴퓨팅을 사용하면 됩니다. Data Boost를 사용하면 특히 임시 쿼리에 비용 효율적입니다. Data Boost를 사용하려면 외부 테이블 정의를 만들 때 Data Boost 앱 프로필을 지정하세요. Data Boost에 대한 자세한 내용은 Bigtable Data Boost 개요를 참고하세요.
마이그레이션 후에도 Vertex AI 모델 모니터링을 사용하여 모델의 품질을 추적할 수 있습니다.
Bigtable과 BigQuery를 함께 사용하는 것은 실시간 분석 데이터베이스를 빌드하는 일반적인 패턴입니다.
마이그레이션 단계
서비스 연속성을 보장하기 위해 마이그레이션은 일반적으로 다음과 같은 별도의 단계로 실행됩니다.
1단계: 인프라 준비하기
마이그레이션을 시작하기 전에 대상 환경을 설정합니다.
- 프로젝트에서 Bigtable 인스턴스를 만들어 새 온라인 스토어로 사용합니다.
- Vertex AI Feature Store (기존)에서 내보낸 데이터를 일시적으로 저장할 BigQuery 데이터 세트와 테이블을 만듭니다.
- IAM 구성: 마이그레이션을 실행하는 계정에 기존 Feature Store에서 읽고 새 Bigtable 인스턴스에 쓸 수 있는 권한이 있는지 확인합니다. 자세한 내용은 IAM을 사용한 Bigtable 액세스 제어 및 Vertex AI Feature Store (기존) 리소스에 대한 액세스 제어를 참고하세요.
2단계: Vertex AI Feature Store (기존)와 Bigtable 간 스키마 매핑 정의
Bigtable 스키마 설계 권장사항을 검토하고 이해합니다. Vertex AI Feature Store (기존) API와 Bigtable API의 일반적인 매핑은 다음과 같습니다.
Vertex AI Feature Store (기존) 리소스
Bigtable 구성요소
FeatureOnlineStoreBigtable 인스턴스
FeatureViewColumn family
featureValues(배치)열 (키당 단일 셀)
featureValues(연속)열 (키당 여러 셀[버전 관리])
스키마 매핑을 정의한 후 소스 특성 저장소의 각 특성에 대한 column family가 있는 Bigtable 테이블을 만듭니다.
3단계: 데이터 추출 및 동기화
이 단계에서는 데이터의 업데이트 빈도에 따라 계층화된 접근 방식을 사용하여 데이터를 이전합니다.
실시간 기능 동기화
write_feature_values 또는 이에 상응하는 API 호출로 작성하는 기능의 경우 새 Bigtable 테이블에 동일한 데이터를 쓰기 시작합니다.
- Bigtable용 Python 클라이언트 라이브러리를 설치합니다.
- Vertex AI Feature Store (기존)와 Bigtable에 동시에 특성 데이터를 쓰도록 애플리케이션을 구성합니다. Bigtable에 데이터를 쓰는 방법에 대한 자세한 내용은 쓰기를 참고하세요.
일괄 기능 이전
다음으로 이중 쓰기를 시작하기 전에 저장된 데이터를 이전합니다. 여기에는 Vertex AI Feature Store (기존)에서 BigQuery로, BigQuery에서 Bigtable로 데이터를 이동하는 작업이 포함됩니다.
- 모든 값 또는 스냅샷을 내보낼 수 있는 Vertex AI Feature Store (기존)의 내보내기 기능을 사용하여 피처 스토어 데이터를 BigQuery로 내보냅니다. 이렇게 하면 BigQuery가 Vertex AI Feature Store (기존) 오프라인 스토어 역할을 할 수 있습니다.
- 다음 중 하나를 사용하여 BigQuery에서 Bigtable로 이전 데이터를 마이그레이션합니다.
- 역방향 ETL
- Bigtable Spark 커넥터
- BigQuery to Bigtable Dataflow 템플릿
4단계: 애플리케이션 및 SDK 전환
마지막 단계는 애플리케이션 레이어를 전환하는 것입니다.
- 마이그레이션이 완료되고 테스트가 완료되면 Vertex AI Feature Store (기존)에 쓰기를 중지합니다.
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 Feature Store (기존)에서 Bigtable 특성 스토어 구현으로 이동한 후에는 안정성과 성능을 유지하기 위해 이전에 서비스에서 처리한 내부 전처리 및 최적화 로직을 복제해야 합니다.
클라이언트 측 적응형 제한
Vertex AI Feature Store (기존) 백엔드는 클라이언트 측 적응형 스로틀러를 활용하여 트래픽 급증 시 또는 스토리지 백엔드에 높은 지연 시간이나 오류가 발생할 때 기본 Bigtable 인스턴스가 과부하되지 않도록 보호합니다. 백엔드 응답을 등록하고 필요할 때 요청을 사전 예방적으로 제한하기 위해 애플리케이션 코드에 유사한 스로틀러를 구현하는 것이 좋습니다.
파티셔닝 및 배치 크기 최적화 요청
Bigtable 행 필터에는 20KB의 엄격한 제한이 있습니다. 필터링된 단일 읽기에서 너무 많은 기능이나 항목 ID를 요청하면 요청이 실패할 수 있습니다. Vertex AI Feature Store (기존)의 동작을 미러링하려면 다음 단계를 따르세요.
- 청크 기능 ID: Bigtable 읽기당 기능 ID 수를 약 100개로 제한합니다.
- 항목 일괄 처리 균형 조정: 다중 항목 읽기를 실행할 때 클라이언트 또는 서버 리소스가 포화되지 않도록 하려면 다음 예방 조치를 취하세요.
- 항목을 작은 동시 일괄 처리(예: 일괄 처리당 10개 항목)로 파티셔닝합니다.
- 동시 일괄 요청의 최대 수를 10~20개로 제한합니다.
지능형 필터 선택
서버 측에서 열 필터를 계산하고 적용하면 오버헤드가 추가됩니다. 애플리케이션이 일반적으로 column family의 거의 모든 기능(예: 99.9% 이상)을 요청하는 경우 열 필터를 건너뛰고 전체 행을 읽어 클라이언트 측에서 결과를 필터링하는 것이 더 효율적입니다.
동시 실행 및 비동기 실행
스트리밍 시나리오에서 첫 번째 결과가 표시되는 시간을 최소화하려면 비동기 패턴 또는 스레드 번들을 사용하여 엔티티 배치 가져오기를 병렬로 실행하세요. 이렇게 하면 애플리케이션이 대규모 직렬 읽기가 완료될 때까지 기다리지 않고 첫 번째 일괄 처리가 반환되는 즉시 결과를 처리할 수 있습니다.
다음 단계
- 높은 처리량 워크로드 또는 아키텍처 안내와 관련하여 도움이 필요하면 계정 담당자에게 문의하세요.
- Feast의 Bigtable 통합에 대해 읽어보세요.
- Credit Karma가 Bigtable 및 BigQuery를 사용하여 하루에 600억 개의 모델 예측으로 확장한 방법을 알아보세요.