HyperAI초신경
Back to Headlines

벡터 데이터베이스 구조 분석 및 성능 최적화 전략

3일 전

분산 벡터 데이터베이스의 내부 구조 해부에서 배운 내용 처음으로 벡터 검색을 의미론적 엔진 프로토타입에 통합하려 했을 때, 단순히 상위 k개의 정확도를 달성하는 것이 유일한 도전 과제는 아니라는 것을 깨달았습니다. 그것은 인프라스트럭처가 어떻게 작동하는지에 대한 문제였습니다. 대규모 데이터의 입력을 어떻게 확장하고, 인덱스를 효율적으로 구축하며, 읽기 일관성을 유지하면서도 높은 압박 하에서 지연 시간 목표를 충족할 수 있는지가 중요했습니다. 이 결과, 나는 여러 날 동안 Milvus와 같은 오픈소스 시스템의 내부 구조를 살펴보며, 실제 배포에서 고차원 검색이 성공하거나 실패하는 설계 선택에 대해 알아보다가 시간을 보냈습니다. 벡터 데이터베이스가 왜 새로운 아키텍처를 필요로 하는지 대부분의 전통적인 데이터베이스는 트랜잭션 중심의 작업 부하를 다룹니다. 이는 키-값, 문서, 또는 관계형 데이터베이스를 의미합니다. 그러나 벡터 데이터베이스는 다르다. 이들은 유사성 검색과 인덱스 구축 같은 계산 집약적인 작업을 최적화하였습니다. 이런 작업들을 단일 OLTP 시스템에 강제로 맞추면 성능이 불안정해지고 병렬 처리 능력이 떨어질 것입니다. 따라서, 벡터 작업 부하에 적합한 좋은 아키텍처는 어떤 모습일까요? 나의 연구에 따르면, Milvus와 같은 시스템들은 분산 데이터 엔지니어링 원칙에 잘 맞는 4단계 설계를 채택하고 있습니다: Query Layer (쿼리 계층) Data Layer (데이터 계층) Index Layer (인덱스 계층) Storage Layer (저장 계층) 이 아키텍처는 쓰기 중심과 읽기 중심의 구성 요소를 독립적으로 확장할 수 있게 합니다. 특히 1천만 개 이상의 벡터를 다룰 때 이러한 기능이 매우 중요합니다. 쿼리, 데이터, 인덱스: 3종류의 노드가 필요한 이유 쿼리 계층의 계산(워커) 부분이 특화된 서비스로 더 세분화된 점이 나를 놀라게 하였습니다: QueryNode (쿼리 노드) 5천만 개의 벡터로 300 QPS 부하 테스트를 진행했을 때, 두 개의 추가 QueryNode를 시작함으로써 95퍼센타일 지연 시간이 780ms에서 약 420ms로 줄었습니다. DataNode (데이터 노드) 실시간 문서 업로드나 벡터 로그 입력 등 스트리밍 애플리케이션에서 중요한 역할을 합니다. 검색 성능이 입력 성능에 영향을 받지 않도록 하기 위함입니다. IndexNode (인덱스 노드) HNSW 알고리즘을 사용하여 efConstruction 값을 높게 설정하면 CPU 포화 상태가 일반적입니다. 인덱스 구축을 별도의 노드로 분리하면 검색 지연 시간을 줄일 수 있습니다. 세그먼트: 데이터와 격리의 단위 1억 개의 벡터를 가진 데이터셋을 벤치마킹하면서 세그먼트 개념을 이해하게 되었습니다. Milvus는 데이터를 불변 블록(기본 크기 512MB)으로 나누고, 각 블록은 독립적으로 인덱싱되고 검색됩니다. 이는 중요한 부분인데, 1억 개의 벡터 데이터셋에서 세그먼트 크기를 조정(512MB에서 256MB로)하면 최근 데이터의 리콜이 향상되면서 총 쿼리 지연 시간은 안정적으로 유지됩니다. 하지만 더 작은 세그먼트는 데이터가 더 자주 갱신되므로 인덱스 오버헤드가 증가합니다. 따라서 사용 사례에 따라 균형을 맞춰야 합니다. 일관성 레벨: 무시할 수 없는 트레이드오프 Milvus는 강한 일관성부터 결국 일관성까지 네 가지 수준의 일관성을 지원합니다. 예를 들어, RAG를 사용한 챗봇을 구축할 때는 "세션 일관성"을 기본으로 설정하여 사용자의 연속적인 쿼리가 자신의 기록을 볼 수 있도록 합니다. 반면, 대규모 배치 추론에서는 "결국 일관성"이 더 나은 성능을 제공하며 허용 가능한 오래된 데이터를 다룰 수 있습니다. 일관성 레벨별 사용 사례와 위험: 강한 일관성: 관리 패널, 대시보드 위험: 높은 지연 시간 유계된 오래됨: 모니터링, 스트림 재생 위험: 읽기가 지연될 수 있음 세션 일관성: 상호작용적인 RAG, 개인화된 검색 위험: 세션 ID 필요 결국 일관성: 오프라인 처리, 로그 위험: 최신 데이터를 놓칠 수 있음 인덱싱은 배경 작업이 아니다 Milvus의 설계에서 가장 감명받은 부분은 인덱싱을 블랙박스 배치 작업으로 취급하지 않는다는 점입니다. 사용자는 다음과 같이 제어할 수 있습니다: 인덱싱 작업의 시작과 종료 인덱스의 상태 확인 이는 전자상거래 제품 검색과 같은 사용 사례에서 특히 중요합니다. 임베딩 분포가 자주 변하기 때문에 결정적인 인덱싱 제어를 통해 성능을 최적화할 수 있습니다. 테스트 중 얻은 몇 가지 교훈 성능 모니터링: 지속적인 성능 모니터링이 필수적입니다. 노드 관리: 적절한 노드 관리가 중요합니다. 세그먼트 크기 조정: 세그먼트 크기를 최적화하여 성능을 향상시킬 수 있습니다. 다음 탐구 방향 몇 가지 프로토타입과 벤치마크를 구축한 후, 나는 다음과 같은 방향으로 계속 연구하고 있습니다: 대형 데이터셋에서의 성능 테스트 다른 일관성 레벨의 효과 분석 새로운 인덱싱 알고리즘 적용 벤치마크와 위험 요소를 공유할 예정입니다. 그러나 오늘날 벡터 데이터베이스를 평가할 때, 단순히 리콜과 지연 시간만 비교하지 말고 시스템 내부 구조를 깊이 파악해야 합니다. 아키텍처가 확장되지 않으면 나머지는 모두 무의미해집니다. 이 이야기는 Generative AI에서 발행되었습니다. LinkedIn에서 우리와 연결하고 Zeniteq을 팔로우하여 최신 AI 이야기를 놓치지 마세요. 우리의 뉴스레터와 YouTube 채널을 구독하여 생성형 AI의 최신 뉴스와 업데이트를 확인하세요. 함께 AI의 미래를 만들어 나갑시다!

Related Links