Feast와 Snowflake를 활용한 AI/ML Feature Store 구축

Daniel
Snowflake Korea
Published in
7 min readAug 19, 2022

데이터 사이언스 및 데이터 엔지니어링 팀은 ML 애플리케이션을 프로덕션화 할 때, 여러 챌린지를 직면하게 됩니다. 예를 들면, 원시 데이터에서 feature 생성, Training 데이터로 feature 결합, feature 서빙, feature 모니터링 등 이런 여러 사항들을 프로덕션 환경에서 어떻게 원활하게 할지 고민하게 됩니다. 특히, 여러 ML 프로젝트에서 동일한 feature를 필요로하는 모델이 많음에도 불구하고, feature engineering 작업은 팀별 또는 엔지니어 개별적으로 수행하기때문에 feature가 재사용 되지 않고 엔지니어링 노력이 중복 되는 일이 허다합니다.

그래서 나온 개념이 feature store 입니다. Feature store는 머신러닝의 필요한 모든 feature 들을 미리 가공 및 저장하여, 여러 ML 프로젝트에서 재사용 할 수 있어 데이터 엔지니어링 노력의 중복을 줄이고, 다음과 같은 작업을 지원하여 프로덕션 준비를 원활하게 할 수 있습니다.

  • 광범위한 엔지니어링 지원 없이 새로운 feature 프로덕션화
  • Feature computation, backfill 및 logging 자동화
  • 팀 간의 feature 파이프라인 공유 및 재사용
  • Feature 버전, 리니지 및 메타데이터 추적
  • Training 데이터와 Serving 데이터 간의 일관성 유지
  • Feature 파이프라인 상태 모니터링

이 글에서는 feature store 오픈소스 솔루션인 Feast와 Snowflake를 연동하여 Feature Store를 운영하는 과정을 알아보겠습니다.

Step 1: Python 환경에 Feast 모듈 설치

Step 2: Feast 프로젝트 생성

위 명령어를 실행하면, Snowflake 계정의 대한 정보를 다음과 같이 입력해야 합니다.

프로젝트가 생성되면, 명령어를 실행 한 디렉토리 경로에 램덤 이름의 프로젝트 폴더가 생성되며, 해당 폴더 안에는 기본 샘플 파일들이 존재 합니다.

Step 3: 샘플 데이터 확인

Feast 프로젝트가 생성 되면, 샘플 데이터가 설정 된 Snowflake 환경으로 로드 되었을 겁니다. 샘플 데이터를 확인해 봅시다.

Step 4: Feast 프로젝트 파일 확인

터미널에서 Feast 프로젝트 폴더로 이동하여, 다음과 같은 파일이 존재하는 지 확인합니다.

  • Data 폴더에는 Snowflake로 로드 한 샘플 데이터가 포함 되 있습니다.
  • feature_store.yaml은 feature store 인프라 환경의 대한 설정 파일입니다. 이 파일을 수정하여 Feast가 Snowflake를 online/offline feature store로 사용하도록 설정할 수 있습니다.
  • driver_repo.py는 feature를 물리적으로 정의하는 샘플 프로그램 입니다.
  • test.py는 feast 구성 요소가 Snowflake와 잘 작동하는 지 테스트하는 샘플 프로그램 입니다.

Step 5: Snowflake를 Feast의 offline feature store로 설정

Feast 프로젝트 폴더의 feature_yaml.yaml 파일을 다음과 같이 업데이트하여 Snowflake를 offline feature store로 설정합니다.

Step 6: Feature store에 feature 등록

Feast 프로젝트 폴더의 driver_repo.py 파일을 열람하여 보면, 이 프로그램은 Feast 라이브러리를 사용하여 Entity 설정과, Snowflake에 로드 된 샘플 테이블을 사용하여 FeatureView를 정의합니다. Feast는 이런 방식으로 feature를 한 번 정의하고 공통 feature가 여러 모델 학습 및 스코어링에 사용 되도록 할 수 있습니다.

driver_repo.py에 정의 된 feature가 feature store에 등록되려면, Feast의 apply API를 실행 해야 합니다. apply API는 CLI로 실행하거나 Python 프로그램에서 실행 할 수 있습니다.

위 프로그램을 실행하면 Feast의 metadata registry가 업데이트 됩니다. metadata registry는 Cloud object storage에 저장하거나 로컬 환경에 registry.db 파일로 저장할 수 있습니다. 이 경우에는 프로젝트 폴더 안에 registry.db가 존재 할 것 입니다.

Step 7: Entity 데이터 준비

Feature store에서 feature를 추출하려면, feature와 조인하여 데이터를 가져올 수 있는 entity 데이터가 필요합니다. 다음 dataframe 코드를 통해 샘플 entity dataframe를 생성합니다.

Step 8: Snowflake offline feature store에서 feature 추출

Feast는 get_historical_feature() 메소드에 feature name과 entity dataframe을 input으로 제공하면, Snowflake feature store에서 해당 entity와 매핑 되는 feature을 계산하여 dataframe으로 리턴합니다.

이론적으로, 이렇게 feature dataframe이 준비되면, 여기서 바로 머신러닝 학습을 시작할 수 있을 것 입니다.

Snowflake 환경의 Query history를 확인해 보면, feature를 추출하기 위해 다음과 같은 쿼리가 실행 된 것을 확인 할 수 있습니다.

Step 9: 추론을 위한 Feature 서빙

마지막 단계는, 최신 feature를 Online feature store에서 추출하여 구축 된 머신러닝 모델로 부터 추론 결과를 얻는 것 일 겁니다. Snowflake를 online feature store로도 사용한다면, 구축 된 offline feature store에서 online feature store로의 동기화 작업은 feast API의 materialize() 또는 materialize_increment() 메소드로 손쉽게 수행 할 수 있습니다. 그리고 online feature store에서 최신 feature를 요청하는 것은 get_online_features() 메소드를 호출하면 되는 것처럼 아주 간단합니다.

이 데모를 통해 이제 머신러닝 사용 사례를 위해 Snowflake 데이터를 운영하는 방법에 대한 기본적인 이해를 갖게 되었습니다. Snowflake는 Snowpark Python 지원과 같은 기능으로 계속 발전하고 Feast 또한 새로운 기능을 계속해서 추가하고 있기 때문에, 앞으로 더 발전 된 feature store 솔루션을 기대해 볼 수 있을 것 같습니다.

--

--