이번 글에서는 Store로 부터 훈련데이터를 추출해보고, Online store를 구축하여 데이터를 적재하고 추론을 위한 Feature Vectore를 가져오는 것을 다루겠습니다.
1. Store로 부터 Train data 추출해보기
보통 추출이라고 하면, 어떤 데이터를 어떠한 기준으로 추출할까? 로 부터 출발합니다. 그 기준점은 보통 key인데, Feature store에서는 그 부분이 entity에 해당됩니다. 코드에서 entity를 보면 판다스 데이터프레임으로 만들어서 추후에 feature store에 밀어 넣습니다.
from datetime import datetime, timedelta
import pandas as pd
from feast import FeatureStore
# 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를 정의합니다.
store = FeatureStore(repo_path="/home/jovyan/jupyter/feature/repo")
아래 코드의 driver_hourly ~~ 이부분이 전부 feature view입니다. 위에서 entity를 key로 하는 feature들이 추출되는 것을 알 수 있습니다. Feature store를 구성하면 모델링에 필요한 data를 구성할 수 있습니다.
training_df = store.get_historical_features(
entity_df=entity_df,
features=[
"driver_hourly_stats:conv_rate",
"driver_hourly_stats:acc_rate",
"driver_hourly_stats:avg_daily_trips",
],
).to_df()
# scheme를 보고 싶을 때 확인
print("----- Feature schema -----\n")
print(training_df.info())
print()
print("----- Example features -----\n")
print(training_df.head())
2. Online store 구성하기
우선 Online store로 부터 데이터 적재를 해야하는데, serving을 하기 위해 materialize-incremental 명령어를 사용하여 가장 최근 실행된 materialize 이후의 모든 새로운 feature 값들을 serialization 시켜 줍니다. materialize 방법은 다양하지만 여기서는 incremental 방식을 사용합니다. 이전 글에서 apply 하는 부분과 유사하지만, apply는 feature를 새로 정의하고 등록할 때 사용하며, materialize는 data source로 부터 data를 불러와 정의된 feature를 스냅샷을 찍는 느낌이라고 생각하면 됩니다.
from datetime import datetime
!feast materialize-incremental {datetime.now().isoformat()}
이제 materialized feature들을 확인해봅니다. 우선 아래 명령어 수행하여 확인해봅니다. (apply 했었을 때 onlinestore.db, registry.db가 있는 것도 알 수 있습니다.)
print("--- Data directory ---")
!ls data
sqlite를 이용해 연결합니다. online store의 scheme를 볼 수 있습니다.
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()
3. inference를 위한 Feature vector 가져오기
FeatureStore의 get_online_features 내장함수를 이용하여 feature vector를 들고올 예정입니다.
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()
dictionary로 바뀐 것을 한번 출력해봅니다. driver_id가 1004, 1005에 대한 데이터가 추출되는 것을 알 수 있습니다.
pprint(feature_vector)
모델에 대한 Feature를 뽑아봤고, inference에 필요한 feature들을 뽑아보았습니다. 다음 글에서는 Feature server를 생성하는 내용으로 찾아뵙겠습니다.
아래 글도 정말 잘 설명되어있으니 참고하면 좋을 것 같습니다.
https://dailyheumsi.tistory.com/265
* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'AI > MLOps' 카테고리의 다른 글
[패스트캠퍼스 챌린지 36일차] Feast - ML lifecycle (0) | 2022.02.28 |
---|---|
[패스트캠퍼스 챌린지 35일차] Feast Server 생성 (0) | 2022.02.27 |
[패스트캠퍼스 챌린지 33일차] Feast - Store 생성 & 배포 (0) | 2022.02.25 |
[패스트캠퍼스 챌린지 32일차] Feast 소개 (0) | 2022.02.24 |
[패스트캠퍼스 챌린지 31일차] Feature Store (0) | 2022.02.23 |