MLOps 03: Feast Feature Store โ An In-depth Overview Experimentation and Application in Tabular data๋ฅผ ์ฝ๊ณ ๋ฒ์ญํ ๋ด์ฉ์ ๋๋ค.
์ Feature Store๊ฐ ํ์ํ๊ฐ
์์) ํ ๋ฐ์ดํฐ ๊ณผํ ํ์ด ๊ณ ๊ฐ ์ดํ์ ์์ธกํ๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๊ตฌ์ถํ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์คํ๊ฒ ์์งํ๊ณ ์ ๋ฆฌํ ํ, ์ด์ ํผ์ฒ ์์ง๋์ด๋ง์ ์ฐฉ์ํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค. ํ์ง๋ง ์๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง์ฃผํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ฌ์ผ๋ก์ ์ค๋ณต: ๋ฐ์ดํฐ ๊ณผํ์๋ค์ ํ์ํ ํผ์ฒ๋ค์ด ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ธํธ๋ถ์ ํฉ์ด์ ธ ์๋ ์ํฉ์ ๋ง์ฃผํฉ๋๋ค. ํ์ต๊ณผ ์๋น์ ๋์ผํ ํผ์ฒ๋ฅผ ์ฌํํ๋ ์์ ์ ์ค๋ฅ/๋ถ์ผ์น๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
- ์๊ฐ ๋ญ๋น: ๋ชจ๋ธ ๊ฐ๋ฐ๊ณผ ์คํ์ ์ง์คํด์ผ ํ ์์คํ ์๊ฐ์ด ๋ฐ์ดํฐ ์ ์ ์ ์๋ชจ๋ฉ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ์ ์ด๋ ค์: ๋ค์ํ ํผ์ฒ ๋ฒ์ ์ด ์ฌ๊ธฐ์ ๊ธฐ ๋ ๋์๋ค๋๋ฉฐ ํผ๋์ ์ผ์ผํค๊ณ , ๊ฒฐ๊ตญ ๋ชจ๋ธ ๊ฒฐํจ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ด๋ Feature Store๊ฐ ๋ฑ์ฅํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋จธ์ ๋ฌ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์ Feast๋ฅผ Feature Store๋ก ์ ํํ๋๊ฐ?
์ฌ๋ฌ Feature Store๊ฐ ์กด์ฌํ์ง๋ง, Feast๋ ๋ฐ์ด๋ ๊ธฐ๋ฅ์ ์กฐํฉํด ์ ๊ณตํฉ๋๋ค. ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ํ์ฉํ๊ณ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ฉฐ ๋ฐ์ดํฐ ๋์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ ์ ๋์ด, ๋จธ์ ๋ฌ๋ ์ํฌํ๋ก์ฐ๋ฅผ ์ต์ ํํ๊ณ ์ ํ๋ ์กฐ์ง์ ๊ฐ๋ ฅํ ์ ํ์ง๋ก ์๋ฆฌ ์ก๊ณ ์์ต๋๋ค.
Feast๋ ์คํ ์์ค ํน์ฑ, ํ์ฅ์ฑ, ๊ทธ๋ฆฌ๊ณ ํ๋ฐํ ์ปค๋ฎค๋ํฐ ์ง์์ ํตํด ํผ์ฒ ์คํ ์ด ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํค๋ ๊ฐ๋ ฅํ ํ๋ณด๋ก ๋ ์ค๋ฅด๊ณ ์์ต๋๋ค. Feast์ ๋ฌธ์์ ๋ฆฌ์์ค๋ฅผ ํ์ํ์ฌ ํ์ ํ์์ ๋ถํฉํ๋์ง ํ์ธํ๊ณ , ๊ณ ์ฑ๋ฅ ML ๋ชจ๋ธ ๊ตฌ์ถ์ ์ํด ํ์ ์ง์ํด ๋ณด์ธ์.
Feast๊ฐ ๋๋ณด์ด๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ๊ณผ ํ๋ก์ ํธ ๊ฐ ํผ์ฒ๋ฅผ ๊ณต์ ํ์ฌ ์ค๋ณต ์์ ์ ์ค์ ๋๋ค.
- ํ๋ก์ ํธ ๊ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ๊ณตํฉ๋๋ค.
- ํผ์ฒ ์์ง๋์ด๋ง๊ณผ ๋ชจ๋ธ ๊ฐ๋ฐ์ ๋ถ๋ฆฌํฉ๋๋ค (๋ฐ์ดํฐ ๊ณผํ์๋ค์ด ์ ํธํฉ๋๋ค).
- ์ค์๊ฐ์ผ๋ก ํผ์ฒ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ML ์ ๋ฌธ๊ฐ๋ค์ด ์น์ํ ๊ธฐ์กด ๋๊ตฌ๋ค๊ณผ ํตํฉ์ ์ง์ํฉ๋๋ค (์: Airflow, Dagster, MLFlow, K8s).Feast๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ฒ ์ ์ฅ ๋ฐ ์๋นํ๋ ๋ฐฉ๋ฒ
Source: MLOps Tools Part 5: BigQuery + Memorystore vs. FEAST for Feature StoreEntity, Datasource, ๊ทธ๋ฆฌ๊ณ FeatureView๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ฒ ์ ์ฅํ๊ธฐ
- ํผ์ฒ ์ ์ํ๊ธฐ:
Feast๋ ํผ์ฒ ์ ์๋ถํฐ ์์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํผ์ฒ ์ด๋ฆ, ๋ฐ์ดํฐ ์ ํ, ๊ทธ๋ฆฌ๊ณ ์ฐ๊ฒฐ๋ ์ํฐํฐ ํค(์: ์ฌ์ฉ์ ID, ์ ํ ID)๋ฅผ ์ง์ ํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค, ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ์๋น์ค์ ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ํด ํผ์ฒ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
from feast import Entity
from feast.infra.offline_stores.contrib.spark_offline_store.spark_source import SparkSource
from feast import FeatureView, Field
# Entity
user = Entity(
name="user",
join_keys=["user_id"],
description="Entity to represent user for loan default prediction",
)
# Datasource
sparksource_user_loan = SparkSource(
path=os.path.join(get_feature_folder_path(), "loan_default_gen"),
file_format="parquet",
timestamp_field="txn_datetime",
name="user_loan",
)
# FeatureView
user_info_fv = FeatureView(
name="user_info",
entities=[user],
schema=[
Field(name="Age", dtype=Int64),
Field(name="Education", dtype=String),
Field(name="CreditScore", dtype=Int64),
Field(name="MonthsEmployed", dtype=Int64),
],
source=sparksource_user_loan,
description="Calculate overall transaction behaviors of customer",
)
- ํผ์ฒ ์ ์ฅ์ ๊ตฌ์ถํ๊ธฐ:
ํผ์ฒ ์ ์ฅ์๋ Feast์ ์ค๊ณ๋ ์ญํ ์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํผ์ฒ ์ ์์ ์จ๋ผ์ธ ๋ฐ ์คํ๋ผ์ธ ์ ์ฅ์ ์ํ ์ค์ ์ด ํฌํจ๋ฉ๋๋ค. Feast๋ ๋ค์ํ ์ ์ฅ ์ต์
์ ์ ๊ณตํ์ฌ ํ์์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
๊ฐ Feast ๋ฐฐํฌ์๋ ๋จ์ผ ํผ์ฒ ๋ ์ง์คํธ๋ฆฌ๊ฐ ์์ผ๋ฉฐ, ํ์ฌ Feast๋ ํ์ผ ๊ธฐ๋ฐ ๋ ์ง์คํธ๋ฆฌ๋ง ์ง์ํ์ง๋ง, ๋ค ๊ฐ์ง ๋ฐฑ์๋๋ฅผ ์ง์ํฉ๋๋ค.
- Local: ๊ฐ๋ฐ ์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ก์ปฌ ๋ฐฑ์๋
- S3: AWS์์ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋ฐฑ์๋
- GCS: GCP์์ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋ฐฑ์๋
- [Alpha] Azure: Azure Blob ์คํ ๋ฆฌ์ง์์ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋ฐฑ์๋
# https://docs.feast.dev/getting-started/architecture-and-components/registry from feast import FeatureStore
Simple: for local development
fs = FeatureStore("my_feature_repo/")
3. ํผ์ฒ ์์ฑํ๊ธฐ
Feast๋ โmaterializationโ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋ผ์ธ ์ ์ฅ์์ ๊ณผ๊ฑฐ ํผ์ฒ ๊ฐ์ ์ฑ์๋๋ค. ํน์ ์๊ฐ ๋ฒ์์ ๋ํด ํผ์ฒ ์์ฑ์ ์คํํ์ฌ, ๋ชจ๋ธ์ด ์ผ๊ด๋ ๋ฐ์ดํฐ ์ค๋
์ท์ผ๋ก ํ์ต๋ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
```python
list_entities = [user]
list_datasources = [sparksource_user_loan]
list_feature_views = [user_info_fv]
fs.apply(
objects=[
*list_entities,
*list_datasources,
*list_feature_views,
],
)
์ค์๊ฐ ์ถ๋ก ์ ์ํด Feast๋ ๋ฎ์ ์ง์ฐ ์๊ฐ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์จ๋ผ์ธ ์ ์ฅ์๋ฅผ ํ์ฉํฉ๋๋ค. ํผ์ฒ ์์ฑ์ ์ต์ ํผ์ฒ ๊ฐ์ ์จ๋ผ์ธ ์ ์ฅ์์ ์ฑ์ ๋ฃ์ด, ๋ชจ๋ธ์ด ์์ธก ์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
dt = datetime.now()
fs.materialize(start_date=dt - relativedelta(months=24), end_date=dt)
get_historical_features, get_online_features๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ฒ ์๋นํ๊ธฐ
- ํ๋ จ์ ์ํ ํผ์ฒ ๊ฐ์ ธ์ค๊ธฐ
Feast๋ ์จ๋ผ์ธ ๋ฐ ์คํ๋ผ์ธ ์ ์ฅ์์์ ํผ์ฒ๋ฅผ ๊ฐ์ ธ์ค๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ๋ จ ์, ์ด API๋ฅผ ํตํด ์คํ๋ผ์ธ ์ ์ฅ์์์ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์ ์์ต๋๋ค.
import pandas as pd
# Prepare entity dataframe with (user_id, event_timestamp) so that Feast can do Point-in-time joins
# https://docs.feast.dev/getting-started/concepts/point-in-time-joins
entity_df=pd.DataFrame(
[
['HlWpZydxscnmjGgeIPLi', pd.datetime(2023,1,2)],
['RckfsuJrhXFYAToUVlmy', pd.datetime(2024,1,9)],
['WJGbtTpKalFBqmMhcnPC', pd.datetime(2024,5,9)],
],
columns=['user_id','event_timestamp']
)
#
df_feature = fs.get_historical_features(
entity_df=entity_df,
features=[
'user_info:Age',
'user_info:Education',
'user_loan_ts:median_previous_income'
]
)
- ํผ์ฒ ์๋นํ๊ธฐ (์จ๋ผ์ธ ์ ์ฅ์):
๋ง์ฐฌ๊ฐ์ง๋ก, ์ค์๊ฐ ์์ธก์ ์ํด ์๋น ์ธํ๋ผ๊ฐ ์จ๋ผ์ธ ์ ์ฅ์์์ ์ต์ ํผ์ฒ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import pandas as pd
# Prepare entity dataframe with (user_id, event_timestamp) so that Feast can do Point-in-time joins
# https://docs.feast.dev/getting-started/concepts/point-in-time-joins
entity_df=pd.DataFrame(
[
['HlWpZydxscnmjGgeIPLi', pd.datetime(2023,1,2)],
['RckfsuJrhXFYAToUVlmy', pd.datetime(2024,1,9)],
['WJGbtTpKalFBqmMhcnPC', pd.datetime(2024,5,9)],
],
columns=['user_id','event_timestamp']
)
#
df_feature = fs.get_online_features(
entity_rows=[{'user_id': 'kyHoSmrOEWTzDRlpqBVQ'},
features=[
'user_info:Age',
'user_info:Education',
'user_loan_ts:median_previous_income'
]
)
๋ค์์ผ๋ก, ๊ฐ ์๋๋ฆฌ์ค ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ๋ตํ๊ฒ ์๊ฐํฉ๋๋ค.
์๋๋ฆฌ์ค 01: DS - ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ํผ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฅด๊ฒ ์คํํ๊ธฐ
1. ํผ์ฒ ์์ฑ ๋ฐ ๋ฑ๋ก (์คํ ์ด์ง)
- 1๋จ๊ณ: ํผ์ฒ ๊ตฌ์ถ
- 2๋จ๊ณ: ํผ์ฒ๋ฅผ ์ ์ฅ์์ ์ ์ฅ
- 3๋จ๊ณ: ํผ์ฒ ์คํ ์ด์ ๋ ์ง์คํธ๋ฆฌ ๋ฑ๋ก2. ๋ค๋ฅธ ํ๋ จ์ ์ํ ํผ์ฒ ์ฌ์ฌ์ฉ
- 1๋จ๊ณ: Feast UI๋ฅผ ํ์ํ์ฌ ๊ณ ๋ คํ ํผ์ฒ ๋ชฉ๋ก์ ์ฐพ์ต๋๋ค.
- 2๋จ๊ณ: get_historical_features, get_online_features๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ฒ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.์๋๋ฆฌ์ค 02: DE โ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ํตํฉ (ํ๋ก๋์ )
- CI/CD ํ์ดํ๋ผ์ธ ์ค๋น ๋ฐ ํผ์ฒ ์๋ ๊ฐ์ ธ์ค๊ธฐ
์ํฐํฐ ๋ชฉ๋ก ์ ์
FeatureView ๋ชฉ๋ก ์ ์
๋ชจ๋ ์ํฐํฐ์ ํผ์ฒ๋ฅผ ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋ก
์๋๋ฆฌ์ค 03: MLE โ ์จ๋ผ์ธ API ์ถ๋ก ์๋น
Source: A State of Feast
@app.post("/predict_loan_default")
def predict_loan_default(request_loan_predict: Request) -> Response:
# 1. Load model and parse requests' info
xgb: XGBClassifier=ml_models['model']
feature_dict={}
user_id=request_loan_predict.user_id
feature_dict['loan_amount']=request_loan_predict.loan_amount
feature_dict['loan_term']=request_loan_predict.loan_term
feature_dict['dti_ratio']=request_loan_predict.dti_ratio
feature_dict['interest_rate']=request_loan_predict.interest_rate
# 2. Get pre-built features from Feature store
store:FeatureStore=ml_models['store']
fs_model=store.get_feature_service('user_xgb_v1')
features_from_store = store.get_online_features(
features=fs_model, entity_rows=[{'user_id':user_id}]
).to_dict()
# 3. Combine all features
list_feature=[]
for feature in xgb.feature_names_in_:
if feature not in feature_dict:
feature_dict[feature]=features_from_store[feature][0]
list_feature.append(feature_dict[feature])
# 4. Make model inference
score=xgb.predict_proba(np.array([list_feature]))[0][1]
# 5. Response results
response=Response(request=request_loan_predict,default_score=score)
return response
๋ ผ์
Future Directions:
- ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์ ํ์ฅ: ์ถ๊ฐ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํธํ์ฑ ์ถ๊ฐ๋ฅผ ํ์ํ์ฌ ๋ ๋ค์ํ ์ฌ์ฉ์ ์๊ตฌ์ ์ ํธ๋ฅผ ์ถฉ์กฑ์ํต๋๋ค.
- ๋ฐ์ดํฐ ํ์ง ๋ชจ๋ํฐ๋ง ์ฑ์ํ: ๋ฒกํฐํ๋ ๋ฐ์ดํฐ ๋ด์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ๋ฐ์ดํฐ ํ์ง ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ๊ณ์ํฉ๋๋ค.
- ํ ์คํธ ๋ฐ ์ด๋ฏธ์ง ํผ์ฒ ํตํฉ: ํ ์คํธ ๋ฐ ์ด๋ฏธ์ง ํผ์ฒ์ ๋ํ ์ํฌํ๋ก์ฐ์์ ์ํํ ํตํฉ์ ํ์ํ์ฌ, ์ฌ์ฉ์๊ฐ ์ด๋ฏธ์ง ๊ฒ์์ด๋ ํ ์คํธ ์ ์ฌ๋ ๋ถ์๊ณผ ๊ฐ์ ์์ ์ ์ํด VectorDB๋ฅผ ํ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.Strengths:
- ํ์คํ๋๊ณ ์ผ๊ด๋ ํผ์ฒ: ๋์ผํ ์ ์์ ๋ณํ์ด ์ ์ฉ๋ ๋ชจ๋ธ ๊ฐ์ ํผ์ฒ ์ฌ์ฉ์ ๋ณด์ฅํฉ๋๋ค.
- ์๊ณ์ด ์ง์: ์๊ฐ ์ง์ ์ ์ ํ์ฑ์ ์ ๊ณตํ์ฌ ๊ธ์ต ๋ฐ์ดํฐ๋ ๊ฑฐ๋ ๋ฐ์ดํฐ์์ ์ค์ํ ์์๊ฐ ๋ฉ๋๋ค.
- ๋ค๋ฅธ ๋๊ตฌ์์ ํตํฉ: Feast๋ Airflow, Dagster, MLFlow, K8s์ ๊ฐ์ ์ธ๊ธฐ ์๋ ๋จธ์ ๋ฌ๋ ํ๋ ์์ํฌ์ ์ ํตํฉ๋๋ฉฐ, ๋ฐ์ดํฐ ๋ฐ ๋ชจ๋ธ ๊ด๋ฆฌ ๋๊ตฌ์๋ ํธํ๋ฉ๋๋ค.
- ์จ๋ผ์ธ ๋ฐ ์คํ๋ผ์ธ ์ง์: ์ค์๊ฐ ์์ธก๊ณผ ๋ฐฐ์น ์์ธก์ ๋๊ณ , ํ๋ จ๊ณผ ์์ธก์ ์ํ ๋ชจ๋ ํผ์ฒ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ํตํฉ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ชจ๋ธ ๋ฐฐํฌ ๋ฐ ์๋น์ ๊ฐ์ํํฉ๋๋ค. ํ์ฌ Feast๋ SnowFlake, BigQuery, PostgreSQL, MySQL, RedShift, Athena, DuckDB, Trino, Ibis, Redis, DynamoDB, Cassandra, HBase, Rockset, Hazelcast ๋ฑ์ ์ง์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ฒ์ ๊ด๋ฆฌ: ํผ์ฒ์ ๋ค์ํ ๋ฒ์ ์ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ ์ถ์ ํ ์ ์์ต๋๋ค.Weaknesses:
- ๋ณต์ก์ฑ: ๊ฐ๋จํ ํ๋ก์ ํธ๋ ๋จธ์ ๋ฌ๋์ ์์ํ๋ ํ์๊ฒ๋ ๊ณผ๋ํ ์ ์์ต๋๋ค.
- ์ต์ํ์ UI: ํผ์ฒ ํ์ ๋ฐ ๊ด๋ฆฌ์ ๋ํ ์ต์ํ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์: ํ์ฌ Feast๋ Google BigQuery, Redshift, Snowflake, Spark, PostgreSQL๊ณผ ๊ฐ์ ์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง ์ง์ํฉ๋๋ค.
- ๋ฌธ์ ๋ถ์กฑ: ๊ฐ์ ์ค์ด์ง๋ง, Feast์ ๋ฌธ์๋ ํนํ ๋ณต์กํ ๋ฐฐํฌ๋ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ฌ์ ํ ๋ถ์กฑํ ๋ถ๋ถ์ด ์์ต๋๋ค.
'note' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Metrics Monitoring and Alerting system (๋ฒ์ญ) (0) | 2024.11.20 |
---|---|
Distributed Job Scheduler system design (0) | 2024.11.14 |
MLOps 02: Dagster โ Seamless Data Pipelines & ML Model Management for Machine Le (0) | 2024.11.14 |
MLOps 01: Data testing, why, what and how (0) | 2024.11.14 |
virtualbox ubuntu 22.04์ elastic search ์ค์น ํ ์๊ฒฉ ์์ฒญ ํ ์คํธ (0) | 2024.10.10 |