728x90

 

Quickstart
Feature reusability and model versioning: Different teams within an organization are often unable to reuse features across projects, resulting in duplicate feature creation logic. Models have data dependencies that need to be versioned, for example when running A/B tests on model versions.
https://docs.feast.dev/getting-started/quickstart

이 실습은 위의 자료를 참고하여 작성하였습니다. 실습은 colab에서 진행하였습니다.

 

Feast Tutorial

 

Common Issues

  1. Training-serving skew & complex data joins
  1. Online feature availability
  1. Feature resuability & model versioning

⇒ Feast를 이용하여 해결할 수 있다!!

Step 1 : Install Feast

pip 를 이용해서 Feast를 설치한다.

%%sh pip install feast -U -q pip install Pygments -q echo "Please restart your runtime now (Runtime -> Restart runtime). This ensures that the correct dependencies are loaded."

설치하고 나서 runtime을 꼭 restart 해주어야 한다.

 

Step 2 : Create a feature repository

feature repository 는 feature store에 담을 feature들을 생성하는 코드가 모여있는 곳이다.

 

먼저 feature_repo 라는 이름으로 feature repository를 생성한다.

!feast init feature_repo

그럼 위와 같이 feature_repo가 생성되며 안에 기본 샘플 파일들이 생성된 것을 볼 수가 있다.

feature repository의 구성 :

  • data/driver_stats.parquet : parquet으로 저장되어 있는 raw data

driver_stats.parquet

index event_timestamp driver_id conv_rate acc_rate avg_daily_trips created
0 1005 0.9725654721260071 0.3631921708583832 410
1 1005 0.04274604469537735 0.2000729739665985 856
2 1005 0.9639862179756165 0.7615727186203003 691
3 1005 0.9086549878120422 0.7580361366271973 142
4 1005 0.433357298374176 0.9592541456222534 828
5 1005 0.8010686635971069 0.4016995131969452 697
6 1005 0.4435613453388214 0.8471459150314331 987
7 1005 0.4307439923286438 0.5900391340255737 520
8 1005 0.4524332880973816 0.6440556645393372 716
9 1005 0.7183521389961243 0.16217832267284393 985
10 1005 0.48318737745285034 0.215327188372612 831

 

  • feature_store.yaml : featire repo가 어떻게 실행될 지 등의 설정 값이 작성된 파일
project: feature_repo registry: data/registry.db provider: local online_store:     path: data/online_store.db

 

  • example.py feature가 정의 되어있는 Python file
# This is an example feature definition file  from google.protobuf.duration_pb2 import Duration  from feast import Entity, Feature, FeatureView, FileSource, ValueType  # Read data from parquet files. Parquet is convenient for local development mode. For # production, you can use your favorite DWH, such as BigQuery. See Feast documentation # for more info. driver_hourly_stats = FileSource(     path="/content/feature_repo/data/driver_stats.parquet",     event_timestamp_column="event_timestamp",     created_timestamp_column="created", )  # Define an entity for the driver. You can think of entity as a primary key used to # fetch features. driver = Entity(name="driver_id", value_type=ValueType.INT64, description="driver id",)  # Our parquet files contain sample data that includes a driver_id column, timestamps and # three feature column. Here we define a Feature View that will allow us to serve this # data to our model online. driver_hourly_stats_view = FeatureView(     name="driver_hourly_stats",     entities=["driver_id"],     ttl=Duration(seconds=86400 * 1),     features=[         Feature(name="conv_rate", dtype=ValueType.FLOAT),         Feature(name="acc_rate", dtype=ValueType.FLOAT),         Feature(name="avg_daily_trips", dtype=ValueType.INT64),     ],     online=True,     batch_source=driver_hourly_stats,     tags={}, )

위의 예제는 3개의 feature를 정의하였다. ( conv_rate acc_rate avg_daily_trips )

Step 3: Deploy your feature store

example.py 에서 정의한 feature store를 배포하는 코드는 아래와 같다

!feast apply

이렇게 실행하고 나면 feture_store.yaml 에 설정된 값에 따라 다음처럼 추가적인 파일이 생긴다.

data/ 내에 online_store.dbregistry.db 파일이 생긴 것을 알 수 있다. (이는 우리가 provider: local 로 설정해서 그렇다.)

 

Step 4: Generate training data

 

from datetime import datetime, timedelta import pandas as pd  # The entity dataframe is the dataframe we want to enrich with feature values entity_df = pd.DataFrame.from_dict(     {         "driver_id": [1001, 1002, 1003],         "label_driver_reported_satisfaction": [1, 5, 3],          "event_timestamp": [             datetime.now() - timedelta(minutes=11),             datetime.now() - timedelta(minutes=36),             datetime.now() - timedelta(minutes=73),         ],     } ) 

feature store에서 feature를 불러와 위에 정의한 데이터 프레임에 추가를 한다.

from feast import FeatureStore  store = FeatureStore(repo_path=".")  training_df = store.get_historical_features(     entity_df=entity_df,  # 위에서 만든 데이터프레임을 넘겨준다.     feature_refs = [         'driver_hourly_stats:conv_rate',         'driver_hourly_stats:acc_rate',         'driver_hourly_stats:avg_daily_trips'     ],  # 불러올 feature를 적는다. ).to_df()  training_df.head()

위에서 정의한 3개의 feature, conv_rate , acc_rate , avg_daily_trips 가 join된 것을 확인할 수 있다.

 

Step 5: Load features into your online store

이번에는 feature store에서 가장 최근 등록된 값들만 불러오자.

Using feast materialize-incremental

materialize-incremental serializes all new features since the last materialize  call

from datetime import datetime !feast materialize-incremental {datetime.now().isoformat()}

materialize 를 실행하면 데이터가 online_store.db  와 registry.db 에 저장된다(?)

 

print("--- Data directory ---") !ls data  import sqlite3 import pandas as pd con = sqlite3.connect("data/online_store.db") print("\n--- Schema of online store ---") print(     pd.read_sql_query(         "SELECT * FROM feature_repo_driver_hourly_stats", con).columns.tolist()) con.close()

Step 6: Fetching feature vectors for inference

from pprint import pprint from feast import FeatureStore  store = FeatureStore(repo_path=".")  feature_vector = store.get_online_features(     features=[         "driver_hourly_stats:conv_rate",         "driver_hourly_stats:acc_rate",         "driver_hourly_stats:avg_daily_trips",     ],     entity_rows=[         {"driver_id": 1004},         {"driver_id": 1005},     ], ).to_dict()  pprint(feature_vector)

feature store에 최근에 등록된 feature를 잘 가져온 것을 볼 수 있다.

 

정리

  • 이 레포 안에서 feast SDK와 파이썬을 이용하여 feature를 정의할 수 있다. 구체적으론 코드에서 다음을 정의한다.
    • feast init <repo_name> 으로 사용할 feature store repository를 만들 수 있다.
    • DataSource
      • 데이터를 가져올 데이터 소스를 지정한다.
      • File, BigQuery 등이 되겠다.
    • Entity
      • Feature 그룹의 대표 ID를 지정한다.
    • FeatureView
      • 위에서 지정한 DataSourceEntity 를 가지고 Feature Store에 저장할 Feature 그룹을 지정한다.
  • 코드를 작성한 후 feast apply 로 feature store를 생성 및 업데이트할 수 있다.
  • feast materialize 로 최신 feature 값들을 저장 및 버전 관리할 수 있다.
  • 머신러닝 코드에서 feast SDK로 위 feature store에 정의한 feature 들을 가져올 수 있다.

 

 

Feast - Quick Review
일반적인 정형 데이터 머신러닝 코드에는 데이터를 불러오고 필요한 feature를 뽑아 가공하는 부분이 있다. 보통 데이터 웨어하우스나 아니면 원천 데이터 소스에서 데이터를 불러올텐데, 이렇게 직접 데이터 소스에 붙지 않고 머신러닝에 필요한 데이터 스토어를 별도로 만들어 둘 수 있다. 그리고 여기에 필요한 feature들을 미리 가공하여 저장할 수 있고, 데이터 버전 관리도 도입해볼 수 있다.
https://dailyheumsi.tistory.com/265

위의 블로그가 정리가 잘되어 있어서 참고를 많이 했습니다!

 

728x90

'MLOps' 카테고리의 다른 글

MLOps - Data Management(DVC)  (0) 2022.02.15