
머신러닝(ML) 모델을 실제 운영 환경에 배포할 때 데이터 과학자들이 직면하는 가장 고질적인 문제 중 하나는 '학습-서빙 편향(Training-Serving Skew)'입니다. 학습 시점(오프라인)에 사용한 데이터와 예측 시점(온라인)에 투입되는 데이터의 계산 로직이나 값이 일치하지 않으면, 모델의 성능은 급격히 저하됩니다. 본 가이드에서는 파이썬 기반의 Feature Store를 활용하여 이러한 정합성 문제를 완벽하게 해결하는 전문적인 메커니즘을 상세히 다룹니다.
1. 온라인/오프라인 피처 정합성이란 무엇인가?
피처 정합성(Feature Consistency)은 모델이 학습될 때 참조한 피처의 분포와 계산 방식이, 실제 실시간 예측(Inference) 단계에서도 동일하게 유지되는 상태를 의미합니다. 많은 기업들이 학습용 데이터는 SQL이나 Spark로 대량 처리하고, 실시간 API는 Python이나 Java로 별도 로직을 구현하면서 이 정합성이 깨지기 시작합니다.
2. 정합성 해결을 위한 3대 핵심 아키텍처
Feature Store는 이 문제를 해결하기 위해 '단일 진실 공급원(Single Source of Truth)' 역할을 수행합니다.
| 구분 | 오프라인 저장소 (Offline Store) | 온라인 저장소 (Online Store) |
|---|---|---|
| 주요 용도 | 모델 학습용 배치 데이터 제공 (Point-in-time Join) | 실시간 예측을 위한 저지연(Low-latency) 조회 |
| 데이터 저장소 | S3, Google Cloud Storage, BigQuery, Snowflake | Redis, DynamoDB, Cassandra |
| 데이터 특성 | 수년 치의 거대한 이력 데이터 (Terabytes) | 최신 상태의 피처 값 (Current State) |
| 정합성 보장 | 공통 정의(Feature View)를 통한 동일 계산 로직 적용 | |
---
3. 실무 적용을 위한 Python 기반 Feature Store 활용 예제 (Feast 활용)
아래 예제들은 업계 표준 오픈소스인 Feast를 기준으로, 실무 개발자가 즉시 파이프라인에 적용할 수 있도록 설계되었습니다.
Example 1: 피처 엔터티 및 데이터 소스 정의
정합성의 시작은 데이터 소스를 단일화하는 것입니다. 파이썬 객체로 데이터 경로를 정의합니다.
from datetime import timedelta
from feast import Entity, FeatureView, Field, FileSource, ValueType
from feast.types import Float32, Int64
# 유저 엔터티 정의
user = Entity(name="user_id", join_keys=["user_id"], value_type=ValueType.INT64)
# 소스 데이터 정의 (S3 또는 로컬 파티션)
driver_stats_source = FileSource(
path="data/driver_stats.parquet",
timestamp_field="event_timestamp",
created_timestamp_column="created",
)
Example 2: Feature View를 통한 계산 로직 단일화
학습과 서빙에서 동일하게 사용할 피처 그룹을 정의합니다. 이 정의 하나로 온라인/오프라인이 동시에 관리됩니다.
driver_stats_fv = FeatureView(
name="driver_hourly_stats",
entities=[user],
ttl=timedelta(days=1),
schema=[
Field(name="conv_rate", dtype=Float32),
Field(name="acc_rate", dtype=Float32),
Field(name="avg_daily_trips", dtype=Int64),
],
online=True, # 이 설정만으로 온라인 저장소 동기화 활성화
source=driver_stats_source,
tags={"team": "driver_performance"},
)
Example 3: Point-in-time Correctness를 보장하는 학습 데이터 생성
과거 시점의 정합성을 맞추기 위해 '데이터 누수(Data Leakage)'를 방지하는 시점 조인 방식입니다.
from feast import FeatureStore
import pandas as pd
store = FeatureStore(repo_path=".")
entity_df = pd.DataFrame.from_dict({
"user_id": [1001, 1002, 1003],
"event_timestamp": [
pd.Timestamp("2023-05-01 12:00:00"),
pd.Timestamp("2023-05-01 13:00:00"),
pd.Timestamp("2023-05-01 14:00:00"),
]
})
training_df = store.get_historical_features(
entity_df=entity_df,
features=[
"driver_hourly_stats:conv_rate",
"driver_hourly_stats:acc_rate",
],
).to_df()
print(training_df.head())
Example 4: 실시간 추론을 위한 저지연 피처 온라인 서빙
서빙 단에서는 복잡한 SQL 없이 엔터티 ID만으로 즉시 정합성이 보장된 데이터를 가져옵니다.
feature_vector = store.get_online_features(
features=[
"driver_hourly_stats:conv_rate",
"driver_hourly_stats:acc_rate",
],
entity_rows=[{"user_id": 1001}]
).to_dict()
print(f"Online Feature for User 1001: {feature_vector}")
Example 5: Materialization (오프라인 -> 온라인 데이터 전송)
오프라인의 최신 데이터를 온라인 저장소(Redis 등)로 로드하여 정합성을 유지하는 배치 프로세스입니다.
from datetime import datetime
# 특정 기간의 데이터를 온라인 저장소로 동기화
store.materialize(
start_date=datetime(2023, 1, 1),
end_date=datetime.now()
)
Example 6: On-demand Transform (실시간 파생 피처 계산)
서빙 시점에만 알 수 있는 데이터(예: 현재 위치)와 저장된 피처를 조합할 때 정합성을 유지하는 방법입니다.
from feast import on_demand_feature_view
from feast.types import Float64
@on_demand_feature_view(
sources=[driver_stats_fv],
schema=[Field(name="normalized_conv_rate", dtype=Float64)]
)
def transformed_conv_rate(inputs: pd.DataFrame) -> pd.DataFrame:
df = pd.DataFrame()
# 온라인/오프라인 공통으로 적용될 변환 로직
df["normalized_conv_rate"] = inputs["conv_rate"] * 0.1
return df
Example 7: 정합성 모니터링 및 검증 (Data Validation)
Great Expectations 등을 연동하여 온라인과 오프라인의 데이터 분포 차이(Drift)를 감지합니다.
# Feast의 Validation 기능을 활용한 스키마 체크
from feast.data_format import ParquetFormat
store.apply([driver_stats_fv])
# 프로파일링 결과와 비교하여 정합성 위반 사례를 리포팅하는 로직 (Conceptual)
# store.validate_features(config="validation_config.yaml")
---
4. 정합성 유지를 위한 3단계 전략
- 로직의 중앙 집중화: SQL 쿼리나 개별 Python 스크립트 대신 Feature View 정의를 사용하여 모든 환경에서 동일한 연산을 수행합니다.
- 멱등성(Idempotency) 확보: 동일한 시점의 엔터티에 대해 조회를 요청했을 때 오프라인과 온라인이 동일한 결과값을 반환하도록 설계합니다.
- 자동화된 Materialization: CI/CD 파이프라인 내에 데이터 동기화 단계를 포함시켜 온라인 피처의 최신성을 보장합니다.
5. 결론
온라인/오프라인 피처 정합성은 단순한 데이터 관리의 문제를 넘어 모델의 신뢰도를 결정짓는 핵심 요소입니다. Feature Store를 도입함으로써 개발자는 인프라 고민 없이 get_historical_features와 get_online_features 단 두 개의 인터페이스만으로 완벽한 데이터 일관성을 확보할 수 있습니다.
참조 및 출처
- Feast Documentation
- MLOps Roadmap 2024: Feature Management Systems
- Google Cloud Architecture Framework: Machine Learning