NVIDIA와 함께 Elasticsearch에서 GPU 가속 벡터 검색 살펴보기: 1장

NVIDIA cuVS를 기반으로 하는 이 협력은 개발자들에게 Elasticsearch의 벡터 검색을 위한 GPU 가속을 제공하기 위한 것입니다.

벡터 검색부터 강력한 REST API까지, Elasticsearch는 개발자에게 가장 폭넓은 검색 도구 키트를 제공합니다. GitHub의 샘플 노트북을 살펴보고 새로운 기능을 시험해 보세요. 무료 체험판을 시작하거나 지금 바로 Elasticsearch를 로컬에서 실행할 수도 있습니다.

Elastic 엔지니어링 조직에서는 한동안 벡터 데이터베이스 성능을 최적화하느라 바빴습니다. 우리의 사명: 최고의 벡터 데이터베이스를 만드는 것. 루씬과 엘라스틱서치를 최고의 벡터 데이터베이스로 만드는 것입니다. 하드웨어 가속 CPU SIMD 명령어를 통해 새로운 벡터 데이터 압축 혁신(Better Binary Quantization, 일명 BBQ)을 도입하고, 더 많은 이점을 위해 BBQ에 대한 알고리즘 접근 방식을 업데이트하여 기대치를 뛰어넘고 필터링된 HNSW를 더욱 빠르게 만들었습니다. 요점은 더 빠르고, 더 좋고, 더 효율적인(?) 환경을 구축한다는 것입니다. 벡터 데이터베이스를 통해 개발자들이 헝겊처럼 지저분한 문제를 해결할 수 있습니다!

효율성을 뒤처지지 않겠다는 사명의 일환으로, 여러분도 들어보셨을지도 모르는 이 신기한 컴퓨터 칩, 즉 엔비디아 GPU로 가속 기회를 모색하고 있습니다! (정말 안 들어보셨나요?).

성능에 집착할 때, 기하급수적으로 많은 데이터를 색인하는 방법, 데이터에서 인사이트를 검색하는 방법, ML 모델이 관련된 경우 이를 수행하는 방법 등 여러 가지 문제를 탐구해야 합니다. GPU가 있을 때 가능한 모든 혜택을 누릴 수 있어야 합니다.

이 포스팅에서는 NVIDIA 벡터 검색 팀과의 협업을 통해 Elasticsearch에서 GPU 가속 벡터 검색을 살펴봅니다. 이 작업은 개발자가 실제 Elasticsearch 기반 앱에 GPU와 CPU를 혼합하여 사용할 수 있는 사용 사례의 길을 열어줍니다. 신나는 시간!

Elasticsearch GPU

Elasticsearch 엔지니어링 팀이 벡터 검색 알고리즘을 위한 바인딩을 노출하는 개발자를 위한 오픈 소스 cuVS Java API 환경을 구축하는 데 도움을 주고 있다는 소식을 알려드리게 되어 기쁩니다. 이 작업은 파나마 FFI에 대한 이전 경험을 활용합니다. Elasticsearch와 Apache Lucene은 인덱싱 중에 NVIDIA cuVS API를 사용해 그래프를 구축합니다. 자, 너무 앞서 나갔으니 잠시 뒤로 돌아가 보겠습니다.

이 협업의 중심에는 오픈 소스 C++ 라이브러리인 NVIDIA cuVS가 있습니다. 더 높은 처리량, 더 낮은 지연 시간, 더 빠른 인덱스 구축 시간을 제공함으로써 벡터 검색에 GPU 가속을 도입하는 것을 목표로 합니다. 하지만 Elasticsearch와 Apache Lucene은 Java로 작성되어 있는데 어떻게 작동할까요?

lucene-cuvs와 Elastic-NVIDIA-SearchScale 협업을 통해 이를 Lucene 에코시스템에 도입하여 Elasticsearch에서 GPU 가속 벡터 검색을 탐색하세요. 최근 NVIDIA cuVS 25.02 릴리스에서는 cuVS용 Java API를 추가했습니다. 새로운 API는 실험 중이며 계속 발전해 나갈 예정이지만 현재 사용 가능합니다. Java에서 네이티브 함수 호출은 느리지 않나요? 더 이상은 아닙니다! 바인딩에는 새로운 파나마 FFI (외부 함수 인터페이스)를 사용하고 있으며, 이는 Java에서 네이티브 다운콜에 대한 오버헤드를 최소화합니다.

저희는 한동안 Elasticsearch와 Lucene에서 Panama FFI를 사용해 왔습니다. 멋지네요! 하지만... 항상 "하지만"이 붙는 법이죠? FFI는 Java 버전에 따라 가용성 문제가 있습니다. 저희는 cuVS API를 Java 21로 컴파일하고 Java 22를 대상으로 하는 다중 릴리스 컨테이너 내에 구현을 캡슐화하여 이 문제를 극복했습니다. 이를 통해 Lucene과 Elasticsearch에서 직접 cuVS Java를 사용할 수 있습니다.

이제 cuVS Java API가 생겼으니 또 무엇이 필요할까요?

CPU를 위한 두 가지 알고리즘 이야기

Elasticsearch는 확장 가능한 근사 KNN 검색을 위해 HNSW 알고리즘을 지원합니다. 그러나 GPU를 최대한 활용하기 위해 유니티는 GPU가 제공하는 높은 수준의 병렬 처리를 위해 특별히 설계된 다른 알고리즘인CAGRA[CUDA ANN GRAph] 를 사용합니다.

CAGRA에 대한 지원을 추가하는 방법을 살펴보기 전에, Elasticsearch와 Lucene이 "코덱 형식"을 통해 인덱스 데이터에 액세스하는 방법을 살펴보겠습니다. 이는 다음과 같이 구성됩니다.

  1. 온디스크 표현입니다,
  2. 데이터 읽기 및 쓰기를 위한 인터페이스입니다,
  3. 그리고 Lucene의 세그먼트 기반 아키텍처를 처리하기 위한 기계입니다.

내부적으로 cuVS Java API를 사용하여 GPU에서 인덱싱하고 검색하는 새로운 KNN(k-근접 이웃) 벡터 형식을 구현하고 있습니다. 여기에서 이 코덱 유형을 인덱스의 필드 유형에 대한 Elasticsearch의 매핑을 통해 '수직'으로 연결합니다. 따라서 기존 KNN 쿼리는 지원 인덱스가 CAGRA 그래프를 사용하든 HNSW 그래프를 사용하든 관계없이 계속 작동합니다. 물론 여기에는 많은 세부 사항이 포함되어 있으며, 향후 블로그에서 다룰 예정입니다. 다음은 GPU 가속 Elasticsearch의 하이레벨 아키텍처입니다.

이 새로운 코덱 형식의 기본값은 CAGRA입니다. 그러나 CPU에서 검색할 수 있도록 CAGRA 그래프를 HNSW 그래프로 변환하는 기능도 지원합니다.

GPU에서 색인 및 검색: 몇 가지 "핵심" 결정 내리기

인덱싱과 검색을 분리하는 Elasticsearch 서버리스의 상태 저장소 없는 아키텍처를 통해 이제 책임 소재가 명확하게 구분됩니다. 이러한 각각의 독립적인 책임을 수행할 수 있는 최고의 하드웨어 프로필을 선택합니다.

사용자들은 크게 두 가지 배포 전략을 고려할 것으로 예상됩니다:

  1. GPU에서 색인 및 검색: 색인하는 동안 CAGRA 그래프를 작성하여 검색 중에 사용하면 지연 시간이 매우 짧은 검색이 필요한 경우에 이상적입니다.
  2. GPU에서 색인하고 CPU에서 검색합니다: 인덱싱하는 동안 CAGRA 그래프를 작성하고 이를 HNSW 그래프로 변환합니다. HNSW 그래프는 인덱스에 저장되며, 나중에 CPU에서 검색에 사용할 수 있습니다.

이러한 유연성은 다양한 배포 모델을 제공하여 비용과 성능 간의 절충점을 제공합니다. 예를 들어, 인덱싱 서비스에서는 검색을 위해 저전력 CPU를 사용하면서 그래프를 적시에 효율적으로 작성하고 병합하기 위해 GPU를 사용할 수 있습니다.

따라서 Elasticsearch에서 GPU 가속 벡터 검색을 위한 계획은 다음과 같습니다.

비용과 성능의 균형을 맞출 수 있는 다양한 옵션을 제공하여 사용자에게 배포 전략으로 성능 향상과 유연성을 제공할 수 있기를 기대합니다. 이 작업이 자세히 소개된 NVIDIA GTC 2025 세션은 다음과 같습니다.

환상적인 협업을 보여준 NVIDIA와 SearchScale의 엔지니어링 팀에 감사의 말씀을 전합니다. 다음 블로그에서는 구현 세부 사항과 성능 분석에 대해 더 자세히 살펴보겠습니다. 호기심 모자를 꽉 잡아주세요 🎩!

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요