미리캔버스, 듀얼 벡터 검색 도입 후 성능 최적화 성공기

by DD
8시간 전
조회수 0

4,000만 건의 방대한 디자인 리소스에서 사용자의 의도를 정확히 파악하기 위해 시맨틱 벡터와 비주얼 벡터를 결합한 듀얼 벡터 검색 도입을 결정함

듀얼 벡터 검색 도입 후 메모리 부족으로 인한 IOPS Throttling과 리콜(Recall) 한계라는 성능 및 품질 딜레마에 직면함

BM25 선필터(Pre-filter) 적용으로 평균 레이턴시 88% 감소 및 채택률 9.02%p 향상, 인스턴스 스펙 조정으로 총 메모리 50% 확장 및 IOPS -34%, 레이턴시 -21% 개선을 달성함

대량 업데이트 시 발생하는 세그먼트 병합(Segment Merge)으로 인한 IOPS 폭증은 2.19 환경에서 해결하지 못한 과제로 남음

듀얼 벡터 검색의 필요성과 설계 방식

미리캔버스는 4,000만 건의 방대한 디자인 리소스에서 사용자의 의도를 정확히 파악하기 위해 시맨틱 벡터와 비주얼 벡터를 결합한 듀얼 벡터 검색을 도입했습니다. 기존 단일 벡터 검색은 검색어의 의미는 파악했지만, 사용자가 편집 중인 디자인의 시각적 스타일과의 유사성을 고려하지 못해 결과 품질에 한계가 있었습니다. Rescore 전략은 1차 후보군 품질 문제와 `window_size`의 딜레마로 인해 채택되지 못했으며, 최종적으로는 한 번의 쿼리에서 두 벡터 인덱스를 동시에 탐색하는 듀얼 벡터 쿼리 방식을 선택했습니다. 이 방식은 Rescore 대비 디스크 I/O는 비슷하면서도, 의미와 스타일을 모두 만족하는 결과를 상위에 노출시켜 검색 정확도를 크게 향상시켰습니다.

BM25 선필터(Pre-filter) 도입으로 인한 성능 및 품질 개선

듀얼 벡터 쿼리 도입 후 발생한 성능 병목을 해결하기 위해 OpenSearch의 knn-filtering 기능을 활용하여 BM25 키워드 매칭을 선필터로 적용했습니다. 이 기법은 벡터 탐색 전에 BM25 기반으로 후보 문서를 미리 좁혀 평균 레이턴시를 107ms에서 13ms로 약 88% 감소시켰습니다. 또한, 키워드 기반의 기본적인 관련성을 확보한 후 시맨틱 벡터로 재정렬함으로써 롱테일 쿼리에서의 정확도가 향상되었고, 사용자 채택률이 9.02%p 증가하는 부가적인 품질 개선 효과도 얻었습니다. 이는 키워드 검색과 벡터 검색의 시너지를 보여주는 사례입니다.

메모리 부족으로 인한 IOPS 병목 현상과 해결 과정

듀얼 벡터 검색 도입 후 CPU 사용률은 안정적이었으나 IOPS가 급증하는 현상이 발생했습니다. 이는 쿼리 연산 부하가 아닌, OS 레벨의 메모리 부족으로 인한 페이지 캐시 고갈이 원인이었습니다. Lucene의 세그먼트 파일(.fdt, .tip 등) 접근 시 페이지 캐시 미스가 빈번하게 발생하며 디스크 I/O가 폭증한 것입니다. 이를 해결하기 위해 범용 인스턴스에서 메모리 최적화 인스턴스로 전환하여 총 메모리를 50% 확장했습니다. 결과적으로 최대 CPU 사용률은 소폭 상승했으나, IOPS(MAX)는 34% 감소하고 검색 레이턴시도 21% 개선되는 효과를 보였습니다.

대량 업데이트 시 발생하는 세그먼트 병합(Segment Merge) 문제

인스턴스 스펙 개선 후에도 매일 새벽 발생하는 대량 업데이트 배치 작업 직후 IOPS 폭증 현상이 지속되었습니다. 이는 하루치 데이터를 한꺼번에 업데이트하며 발생하는 수백만 건의 새 세그먼트와, 벡터 필드를 포함한 큰 stored fields의 병합 과정에서 막대한 디스크 I/O가 발생하기 때문입니다. `_forcemerge`, `reindex`, `refresh_interval` 조정 등 기존 환경에서의 최적화 시도는 한계에 부딪혔으며, 이는 근본적인 해결을 위해 OpenSearch 버전 업그레이드가 필요함을 시사합니다.

벡터 검색의 리콜(Recall)과 성능 간의 트레이드오프

벡터 검색에서 리콜(Recall)을 높이기 위해 nprobes나 ef_search, m과 같은 파라미터를 조정하면 탐색 범위가 넓어져 레이턴시와 메모리 사용량이 증가하는 필연적인 트레이드오프(Trade-off)가 발생합니다. 미리캔버스 환경에서는 메모리가 빠듯하여 이러한 파라미터들을 충분히 올리지 못했고, 이는 원하는 수준의 검색 품질을 확보하는 데 제약이 되었습니다. 성능과 품질 사이의 균형점을 찾는 것이 벡터 검색 시스템 구축의 중요한 과제임을 보여줍니다.

Amazon OpenSearch Service로 미리캔버스의 듀얼 벡터 검색 도입과 성능 최적화