본문으로 건너뛰기

[feast] Feast Online Serving 최적화: 3단계 데이터 변환을 단일 패스로 통합하기

PR 링크: feast-dev/feast#6186 상태: Merged | 변경: +None / -None

들어가며

Feast의 get_online_features API는 온라인 서빙의 핵심 경로입니다. 기존 구현에서는 원시 데이터를 Protobuf 응답으로 변환하는 과정이 3단계의 체인으로 구성되어 있었습니다. 각 단계마다 전체 데이터를 순회하고 중간 리스트를 생성하는 비효율적인 구조였으며, 이는 서빙 호출 시마다 상당한 메모리 오버헤드와 CPU 사용량을 유발했습니다. 본 PR은 이 3단계 과정을 단일 패스(Single Pass)로 통합하여 성능을 극대화했습니다.

코드 분석

1. sdk/python/feast/feature_store.pyonline_store.py의 호출부 변경

기존에는 _convert_rows_to_protobuf를 호출하여 중간 데이터를 생성한 뒤, 이를 _populate_response_from_feature_data에 전달했습니다. 이제는 원시 read_rows를 직접 전달하여 중간 변환 과정을 제거했습니다.

Before:

feature_data = utils._convert_rows_to_protobuf(
    requested_features=features_to_request,
    read_rows=list(zip(datevals, list_of_feature_dicts)),
)
utils._populate_response_from_feature_data(
    feature_data=feature_data,
    ...
)

After:

utils._populate_response_from_feature_data(
    requested_features=features_to_request,
    read_rows=list(zip(datevals, list_of_feature_dicts)),
    ...
)

2. sdk/python/feast/utils.py의 로직 통합

가장 핵심적인 변경은 _populate_response_from_feature_data 함수 내부에서 발생합니다. 기존에는 데이터를 3번 순회하며 중간 벡터를 만들고 다시 scatter하는 방식이었으나, 이제는 루프 내에서 직접 output 배열에 값을 할당합니다.

Before (핵심 로직):

# 3단계 체인: 변환 -> 구조화 -> scatter
for timestamp_vector, statuses_vector, values_vector in feature_data:
    response_vector = construct_response_feature_vector(...)
    online_features_response.results.append(response_vector)

After (통합 로직):

# 단일 패스로 처리
for i, (timestamp, feature_dict) in enumerate(read_rows):
    # feat_idx_map을 활용한 O(1) 조회 및 즉시 할당
    for feat_name in requested_features:
        # ... (값 추출 및 output 배열에 직접 scatter)

왜 이게 좋은가

이번 최적화의 핵심은 **'불필요한 데이터 복사 제거'**와 **'순회 횟수 감소'**입니다.

  1. 메모리 효율성: 중간 단계에서 생성되던 대규모 리스트들을 제거함으로써, 특히 대량의 피처를 요청할 때 발생하는 메모리 할당 오버헤드를 획기적으로 줄였습니다.
  2. CPU 성능: 데이터를 3번 순회하던 것을 1번으로 줄임으로써, 파이썬 인터프리터의 루프 오버헤드를 최소화했습니다.
  3. 일반적 교훈: 데이터 파이프라인에서 '중간 단계의 추상화'는 가독성을 높일 수 있지만, 성능이 중요한 핫 패스(hot path)에서는 이러한 '퓨전(Fusion)' 기법이 필수적입니다. 특히 대용량 데이터를 다룰 때는 O(N) 순회를 줄이는 것만으로도 응답 속도(Latency)를 크게 개선할 수 있습니다.

리뷰 과정에서도 기존의 construct_response_feature_vector가 가진 비효율적인 scatter 로직을 제거하고, feat_idx_map을 사용하여 조회 성능을 O(1)로 개선한 점이 높은 평가를 받았습니다.

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글