<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Chris Hegarty - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Chris Hegarty - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/kr/search-labs/author/chris-hegarty</link>
    </image>
    <link>https://www.elastic.co/kr/search-labs/author/chris-hegarty</link>
    <atom:link href="https://www.elastic.co/kr/search-labs/rss/author/chris-hegarty.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[kr]]></language>
    <lastBuildDate>Mon, 21 Sep 2026 03:49:30 GMT</lastBuildDate>
  <item>
    <title><![CDATA[세계에서 가장 빠른 벡터 검색을 위해 Elasticsearch simdvec을 구축한 방법]]></title>
    <description><![CDATA[Elasticsearch의 모든 벡터 검색 쿼리 뒤에 있는 수동 조정 SIMD 커널 라이브러리인 Elasticsearch simdvec을 어떻게 구축했는지 알아보세요.]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch simdvec은 Elasticsearch의 모든 벡터 거리 계산의 기반이 되는 엔진입니다. Elasticsearch가 지원하는 모든 벡터 유형에 대해 수동 조정 AVX-512 및 NEON 커널을 제공합니다. 벌크 스코어링 아키텍처는 x86에서는 명시적 프리페칭을 통해, ARM에서는 인터리브 로딩을 통해 메모리 지연 시간을 숨기며 데이터가 CPU 캐시를 초과할 때 FAISS 및 jvector와 같은 라이브러리보다 최대 4배까지 성능이 향상됩니다. 이 글에서는 simdvec을 구축한 이유와 내부 구성 요소, 그리고 이 라이브러리가 어떻게 Elasticsearch 벡터 검색을 세계에서 가장 빠른 검색으로 만드는지 설명합니다.</p><h2>Elasticsearch simdvec을 어떻게 구축했는지</h2><p>Elasticsearch의 모든 벡터 검색 쿼리는 <a href="https://arxiv.org/abs/1603.09320">Hierarchical Navigable Small World(HNSW)</a> 순회, 역파일(IVF) 스캔, 순위 재지정 단계 등 어떤 방식이든 동일한 문제, 즉 쿼리당 수백만 번씩 벡터 간의 거리를 계산하는 작업으로 귀결됩니다. Elasticsearch는 float32, int8, bfloat16, 바이너리, 그리고 Better Binary Quantization(BBQ) 등 다양한 데이터 유형과 양자화 전략을 지원합니다. 각 전략은 메모리, 처리량, 재현율 측면에서 서로 다른 장단점이 있습니다. 이 모든 것을 가능하게 하는 것은 바로 simdvec이라는 단일 엔진입니다.</p><p>하드웨어 성능을 최대한 활용하여 모든 거리 계산을 빠르게 수행하기 위해 simdvec을 개발했습니다. 이 글에서는 simdvec을 구축한 이유, 내부 구성 요소, 그리고 가장 큰 효과를 발휘하는 부분에 대해 설명합니다.</p><h3>레이싱카처럼 구축</h3><p>Formula 1 애호가들로서, 그리고 이중 한 명이 이전에 Ferrari Formula 1 팀에서 근무했던 경험을 바탕으로, 저희는 분명한 공통ㄴ점을 발견했습니다. Formula 1 자동차는 단 하나의 목적, 즉 최고의 랩 타임을 달성하는 것을 위해 설계됩니다. 엔진 출력, 공기역학, 섀시 설계는 오직 그 결과에 기여하는 한에서만 중요합니다. 벡터 데이터베이스도 마찬가지로, 인덱싱 처리량, 쿼리 지연 시간, 그리고 재현율이 성공을 좌우합니다.</p><p>최종 결과가 중요하지만, 최고 수준의 성능을 달성하려면 각 구성 요소가 최상의 성능을 발휘해야 합니다. 단순히 <em>충분히 좋은</em> 정도가 아니라, 해당 범주에서 <em>최고</em>여야 합니다. simdvec은 이러한 사고방식을 바탕으로 시스템의 핵심 요소인 엔진에 집중하여 개발되었습니다. <a href="https://en.wikipedia.org/wiki/Single_instruction,_multiple_data">단일 명령어 다중 데이터</a>(SIMD)에 최적화된 특수 목적 커널 라이브러리로, Java에서 <a href="https://openjdk.org/projects/panama/">Panama</a> F외부 함수 인터페이스(FFI)를 통해 호출되는 수동 조정 네이티브 C++ 거리 함수를 제공합니다. 벌크 스코어링, 캐시 라인 프리페칭, 그리고 Elasticsearch에서 사용되는 모든 벡터 유형 및 레이아웃을 지원합니다.</p><p>모든 쿼리 뒤에 있는 엔진입니다.</p><h3>왜 저희가 직접 구축했는지</h3><p>2023년에 Apache Lucene의 Panama Vector API로 시작했습니다. float32 내적에는 잘 작동했지만, Elasticsearch의 요구 사항은 빠르게 충족할 수 있는 범위를 넘어섰습니다. Elasticsearch는 int8, int4, bfloat16, 단일 비트, 비대칭 BBQ 등 다양한 양자화 벡터 유형을 지원합니다. 각 유형은 서로 다른 SIMD 전략, 패킹 레이아웃, 누산기 요구 사항을 가지고 있습니다. 유형 지원 외에도 Elasticsearch의 스코어링 경로는 단일 쌍 처리량 이상의 것을 요구합니다. HNSW는 한 번의 단계로 여러 그래프 이웃을 스코어링해야 하고, IVF는 프리페칭을 통해 수천 개의 후보를 벌크 스코어링해야 하며, 디스크 기반 스코어링은 복사 없이 mmap된 메모리에서 직접 작동해야 합니다. 사용 가능한 기존 라이브러리를 살펴보았지만, 모든 요구 사항을 충족하는 것은 없었습니다.</p><p>그래서 simdvec을 구축했습니다. simdvec은 FFI를 통해 Java에서 호출되는 수동 조정 네이티브 C++ 커널로, 벌크 스코어링, 프리페칭, 그리고 Elasticsearch에서 사용하는 모든 벡터 유형을 지원합니다. 라이브러리를 직접 소유함으로써 전체 스택을 제어할 수 있습니다. BBQ와 같은 새로운 양자화 유형을 추가하면 시스템 전체에 걸쳐 최적화된 SIMD 커널이 연결됩니다. 상위 라이브러리의 지원을 기다리지 않으며, 어떤 유형에 대해서도 성능이 저하되지 않습니다. Elasticsearch의 모든 벡터 쿼리(HNSW, IVF, 순위 재지정 또는 하이브리드)는 실제로 사용하는 연산 및 유형을 중심으로 구축된 이 엔진에서 실행됩니다.</p><p>simdvec은 x86 및 ARM용으로 별도의 네이티브 라이브러리를 제공하며, 각 라이브러리는 시작 시 여러 명령어 세트 아키텍처(ISA) 계층을 선택할 수 있습니다. FFI를 통한 Java의 호출 오버헤드는 <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#ffm-downcall-overhead-measurements">한 자릿수 나노초</a>로 매우 낮습니다.</p><h3>환경</h3><p>SIMD 최적화 벡터 거리 커널을 개발하는 곳은 저희뿐만이 아닙니다. 생태계는 매우 풍부하며, 저희는 simdvec의 성능을 이해하고 싶었습니다. 프로젝트 순위를 매기려는 것이 아니라 컨텍스트를 제공하고 Elasticsearch 엔진의 위치를 설명하기 위해서입니다. 각기 다른 접근 방식을 대표하는 세 가지 프로젝트를 참조 대상으로 선정했습니다.</p><ul><li><p><strong>jvector:</strong> x86에서 네이티브 C 가속 옵션과 함께 벡터화된 거리 계산을 위해 Panama Vector API를 사용하는 Java 근사 최근접 이웃(ANN) 라이브러리입니다.</p></li><li><p><strong>FAISS:</strong> 널리 배포된 오픈 소스 벡터 검색 프레임워크로, 수동 조정 AVX2/AVX-512 커널을 사용합니다.</p></li><li><p><strong>NumKong</strong> (이전 SimSIMD): 거리 함수, 행렬 연산 및 지리 공간 계산을 아우르는 2,000개 이상의 수동 조정 SIMD 커널로 구성된 종합적인 제품군입니다.</p></li></ul><p>각 프로젝트는 서로 다른 목적을 가지고 있으며 각기 다른 절충점을 고려합니다. Elasticsearch에서 필요한 특정 연산에 대한 simdvec의 성능을 이해하는 데 도움이 되도록 각 프로젝트의 참조 번호를 제공합니다.</p><h3>측정 방법</h3><p>simdvec 및 <a href="https://github.com/ChrisHegarty/jvector-kernel-benchmarks">jvector 벤치마크</a>는 표준 JVM 마이크로벤치마크 도구인 JMH를 사용하여 Java로 작성되었으며, FFI 오버헤드가 포함되어 있습니다. <a href="https://github.com/ldematte/simsimd-benchmarks">NumKong 벤치마크</a>와 <a href="https://github.com/ChrisHegarty/faiss-kernel-benchmarks">FAISS 벤치마크</a>의 경우, 표준 C++ 마이크로벤치마크 프레임워크인 Google Benchmark를 사용하여 소규모 C/C++ 하네스를 작성했습니다. 두 프레임워크 모두 웜업 및 반복 보정을 거쳐 연산당 나노초 단위의 시간을 보고합니다. 하드웨어 성능 카운터를 통해 모든 라이브러리가 두 플랫폼 모두에서 SIMD를 사용하고 있음을 확인했습니다. 모든 벤치마크 코드는 링크된 GitHub 리포지토리(그리고 simdvec의 경우 <a href="https://github.com/elastic/elasticsearch">elasticsearch</a> 리포지토리)에서 공개적으로 사용할 수 있습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt90a7d66553be3c9d/6a1701d166c4f942caf8bea5/aee116772df161cf86b7668f575ac34c733a23c5-1580x238.png" alt="두 가지 플랫폼을 나열한 표: x86(AMD EPYC Turin(Zen 5), AVX2 및 AVX-512, AWS c8a.4xlarge) 및 ARM(Graviton 4(Neoverse V2), NEON 및 SVE2, AWS c8g.4xlarge)." /><p><strong>소프트웨어:</strong> JDK 25.0.2, JMH 1.37, GCC 14, Google Benchmark(최신).</p><h2>한 번에 하나의 벡터</h2><p>벡터 검색에서 가장 기본적인 연산은 두 벡터 사이의 거리를 계산하는 것입니다. 모든 HNSW 이웃 평가, 모든 IVF 후보 점수, 모든 순위 재지정 비교는 이 내부 루프로 축소됩니다.</p><p>두 플랫폼 모두에서 1024 차원의 단일 쌍 처리량을 측정했으며, 기준 유형이자 생태계 경쟁이 가장 치열한 float32부터 시작했습니다. simdvec을 FAISS 및 jvector와 비교했습니다. NumKong은 float32에 float64 누산기를 사용하기 때문에 (플랫폼에 따라) 처리량보다 수치 정밀도를 우선시하여 3.2배에서 5.3배 느리므로 비교 대상에서 제외했습니다. 공정한 비교를 위해 NumKong은 simdvec과 동일한 누산기 전략을 사용하는 int8에서 벤치마킹했습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3bc2ecaf3ad2b61/6a1701d2ab7f08039ddb9d0f/352cfa0fc18f123140f746d843404f80127fb1b7-1500x675.png" alt="'float32 Dot Product — AMD Turin'이라는 제목의 가로 막대 차트는 FAISS AVX‑512(23.2ns/op), ES simdvec AVX‑512(28.3ns/op), FAISS AVX2(36.4ns/op), ES simdvec AVX2(38.9ns/op), jvector(43.9ns/op)의 다섯 가지 구현을 비교합니다." /><p>x86에서 FAISS AVX-512는 23ns로 가장 빠른 단일 쌍 커널입니다. simdvec AVX-512는 28ns로 그 뒤를 잇는데, 이 차이는 FFI 호출 오버헤드를 반영합니다. 두 구현 모두 멀티 누산기 언롤링을 사용하는 512비트 FMA를 사용합니다. AVX2 수준에서는 두 구현의 속도가 각각 36ns와 39ns로 훨씬 더 근접하며, 두 구현 모두 256비트 레지스터 및 메모리 로드 폭의 제약을 받습니다. jvector는 Java Panama Vector API를 사용하여 44ns의 성능을 보였습니다. Panama는 우수한 SIMD 코드를 생성하지만, 수동 조정 C++ 내장 함수가 여전히 우위를 점하고 있습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcbbbe442631a575d/6a1701d42b835f81bcf4b083/95e44d9767f21ec4bccaed835e3c99aa180431ee-1500x495.png" alt="'float32 Dot Produc — Graviton 4(ARM)'이라는 제목의 가로 막대 그래프는 ES simdvec이 70.2ns/op, jvector가 110.0ns/op, FAISS가 155.6ns/op임을 보여줍니다." /><p>ARM에서는 simdvec은 70ns로 jvector(110ns)와 FAISS(156ns)를 크게 앞서고 있습니다. simdvec은 aarch64용으로 수동 조정 NEON 커널을 사용합니다. jvector는 네이티브 ARM 코드가 없으며 Panama에 의존합니다. FAISS는 명시적인 NEON 내장 함수 대신 컴파일러의 자동 벡터화에 의존하기 때문에 성능 차이가 더 큽니다. 이는 커널 라이브러리를 소유함으로써 얻을 수 있는 실질적인 이점을 반영합니다. Elasticsearch가 Graviton으로 확장되었을 때, NEON 전용 커널을 추가했습니다. jvector나 FAISS는 ARM 네이티브 코드에 이처럼 우선순위를 두지 않았습니다.</p><p>하지만 Elasticsearch는 float32만 지원하는 것이 아닙니다. <strong>Int8</strong> 양자화는 메모리 사용량을 4배, bfloat16은 2배, BBQ는 32배 줄여줍니다. 각 유형에는 고유한 SIMD 전략이 필요하며, simdvec은 모든 유형에 대해 수동 조정 네이티브 커널을 제공합니다.</p><p>비교한 라이브러리 중 int8에 대해 유사한 커널을 제공하는 것은 NumKong뿐입니다. 1024 차원에서 int8 내적, 제곱 유클리드, 코사인을 측정했습니다.</p><p><strong>Int8 단일 쌍 스코어링(1,024차원, ns/vec op ― 낮을수록 좋음)</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3ac255d158e93504/6a1701d5a292997e48d00eb1/a0b852fd5f51d57bd2488886600472ee65ab64da-1594x378.png" alt="내적, 제곱 유클리드, 코사인 연산에 대한 x86과 ARM 성능을 비교한 표로, 두 아키텍처에서 각 연산에 대한 ES, NumKong, 차이값이 나열되어 있습니다." /><p>두 아키텍처 모두에서 NumKong은 중소 차원까지는 동일하거나 더 빠르며, 그 차이는 주로 호출 오버헤드(직접 C 호출 vs. Java FFI)가 더 낮기 때문입니다. 더 큰 크기에서는 simdvec이 따라잡는데, 이는 더 효율적인 커널 구현(캐스케이드 언롤링 사용)이 호출 비용을 분산시키기 때문입니다. 차원이 증가함에 따라 <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#single-pair-i8-nsop-2">이 격차는 줄어들고 결국 역전됩니다</a>. 교차점은 함수와 아키텍처에 따라 768에서 1536 사이의 차원에서 발생합니다.</p><p>Java FFI의 오버헤드가 약간 더 높지만, simdvec은 고도로 최적화된 C/C++ 라이브러리와 동등한 수준입니다. float32 <em>및</em> int8 모두에 대해 최적화된 커널을 제공하는 유일한 라이브러리일 뿐만 아니라, ARM에서는 가장 우수한 성능을 보이며 x86에서는 FAISS에 비해 약간 뒤처지고(float32의 경우), int8의 경우 두 아키텍처 모두에서 NumKong과 매우 유사한 성능을 보입니다. bfloat16, int4, 바이너리, BBQ의 경우에도 대안이 존재하지만, simdvec은 각 유형의 데이터 레이아웃에 맞춰 수동 조정 SIMD를 통해 차별화된 성능을 제공합니다.</p><p>하지만 프로덕션 검색 엔진은 한 번에 하나의 벡터를 점수화하는 것이 아니라 쿼리당 수천 개의 벡터를 점수화합니다. 이제 관건은 이러한 규모에서 실제로 어떤 일이 벌어지는가 하는 점입니다.</p><h3>한 번에 수천 개씩</h3><p>단일 쌍 성능은 전체 그림의 일부일 뿐입니다. 실제로 중요한 것은 시스템이 부하 상태에서 어떻게 작동하는지입니다. 단일 HNSW 쿼리는 수백 개의 그래프 이웃에 점수를 매길 수 있습니다. IVF 스캔은 수천 개의 게시 목록 항목에 점수를 매길 수 있습니다. 순위 재지정 단계는 수만 개의 후보에 점수를 매길 수 있습니다. 단일 쌍 처리량도 중요하지만, 더 중요한 것은 많은 벡터를 얼마나 빨리 점수화할 수 있는지, 그리고 작업 세트가 CPU 캐시 범위를 벗어날 때 성능이 얼마나 완만하게 떨어지는지입니다.</p><p>simdvec은 모든 데이터 유형에 대해 벌크 스코어링을 제공합니다. 이는 단순히 단일 쌍 커널에 대한 루프가 아니라 차원 스트라이드당 한 번씩 쿼리 벡터를 로드하고 여러 문서 벡터에 걸쳐 공유하는 다중 누적기 내부 루프를 사용하며, 다음 배치에 대한 명시적인 캐시 라인 프리페칭을 제공합니다. jvector와 FAISS는 (작성 시점 기준으로) 이와 동등한 기능을 제공하지 않습니다. jvector는 벌크 API가 없으므로 호출자는 루프에서 한 번에 한 쌍씩 점수를 매깁니다. FAISS는 <code>fvec_inner_products_ny</code>을(를) 노출하는데, 작성 시점 기준으로 이는 쿼리 상각이나 프리페칭 없이 단일 쌍 거리 함수에 대한 루프로 구현되어 있습니다.</p><p><strong>Float32.</strong> 커널 수준에서의 영향을 측정하기 위해, HNSW와 유사한 산포 그래프 이웃 조회를 시뮬레이션하는 무작위 접근 패턴을 사용하여 1024 차원 float32 문서 벡터의 개수를 늘려가며 단일 쿼리에 대한 점수를 매겼습니다. 세 가지 데이터 세트 크기(32, 625, 32,500개 벡터)는 작업 세트가 각각 L1, L2, L3 캐시를 초과합니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df64ec77a1921ae/6a1701d714b270393ae3c4de/1d90267be1c63ac82b8ba588617ebedb0be0d1b6-1334x558.png" alt="AMD Turin(x86, AVX‑512) 및 Graviton 4(ARM, NEON)에서 세 가지 크기(32개, 625개, 32,500개 벡터)에 대해 Elasticsearch simdvec, FAISS 및 jvector의 벌크 Float32 내적 스코어링 시간을 비교하는 두 개의 막대 그래프입니다." /><p>데이터가 캐시에 모두 수용될 때, simdvec이 두 플랫폼 모두에서 가장 빠르지만, 커널 산술이 우세하기 때문에 차이는 크지 않습니다. 실제 성능 차이는 작업 세트가 L3를 넘어 커질수록 나타납니다. x86에서 simdvec은 벡터당 95ns를 기록하는 반면, FAISS는 165ns, jvector는 412ns가 필요합니다. ARM에서도 패턴은 동일합니다. simdvec은 162ns를 유지하는 반면, FAISS는 347ns, jvector는 476ns까지 증가합니다. simdvec의 프리페칭 및 쿼리 상각은 단일 쌍 커널에 대한 단순 루프로는 따라잡을 수 없는 방식으로 메모리 지연 시간을 숨겨주며, 이러한 이점은 실제 검색 워크로드가 작동하는 메인 메모리 깊숙한 곳에서 더욱 두드러집니다.</p><p><strong>Int8.</strong> 양자화된 유형에서도 동일한 패턴이 나타납니다. 동일한 L1, L2 및 L3 캐시 경계를 초과하도록 선택된 데이터 세트 크기로 1024 차원에서 int8 내적 벌크 스코어링을 측정하여 루프 내에서 simdvec의 벌크 스코어링과 NumKong의 단일 쌍 스코어링을 비교했습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcda85e10007188d0/6a1701d9cf4f25d722b2cff7/9ee97d98b40d13b19370b76b33e67ea66bfb3250-1580x338.png" alt=" 'x86 — 벌크 스코어링, int8 내적(ns/op, 값이 낮을수록 좋음)'이라는 제목의 표는 세 가지 벡터 크기(128, 2,500, 130,000)에 걸쳐 ES simdvec과 NumKong을 비교하고, 해당 ns/op 값과 속도 향상 비율을 보여줍니다." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt972c311b7d08ba73/6a1701dadc55dec02ee00c87/601f50a03fa3e6263cbac9700281dfe3e511de60-1580x338.png" alt="'ARM — 벌크 스코어링, int8 내적(ns/op, 값이 낮을수록 좋음)'이라는 제목의 표는 세 가지 벡터 크기(128, 2,500, 130,000)에 걸쳐 ES simdvec과 NumKong을 비교하고, 해당 ns/op 값과 속도 향상 비율을 보여줍니다." /><p>x86에서는 명시적 프리페칭과 배치 처리의 조합으로 simdvec이 1.2배~1.9배 더 빠릅니다. ARM에서도 simdvec은 모든 데이터 세트 크기에서 1.7~1.9배 더 빠른 성능을 보입니다. 이러한 이점은 한 번에 네 개의 벡터를 배치 처리하여 인터리브 액세스 패턴을 통해 메모리 수준의 병렬 처리를 제공하는 데서 비롯됩니다. 두 경우 모두 가장 두드러진 결과는 가장 중요하고 가장 데이터 세트 크기에서 나타납니다.</p><p>제곱 거리 및 코사인에 대한 결과도 유사한 패턴을 보이며, ARM의 경우 1.4~1.8배, x86의 경우 1.3~3.0배의 속도 향상을 보입니다(자세한 내용은 <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md">여기</a>를 참조).</p><h3>메모리가 중요한 경우</h3><p>프로덕션 벡터 인덱스는 일반적으로 CPU 캐시에 적합하지 않습니다. 1024 차원의 10M 벡터 int8 인덱스는 10GB입니다. 후보를 스코어링하려면 DRAM에서 데이터를 스트리밍해야 하는데, 바로 이 부분에서 벌크 스코어링 아키텍처가 중요한 역할을 합니다.</p><p>일괄 스코어링 중 CPU 내부에서 발생하는 일을 측정하기 위해 하드웨어 성능 카운터를 사용했으며, 메모리 지연 시간을 숨기려면 아키텍처별로 하나씩, 근본적으로 다른 두 가지 전략이 필요하다는 것을 발견했습니다.</p><p><strong>x86에서는 명시적 프리페칭을 통해 캐시 미스를 방지할 수 있습니다. </strong>벌크 커널은 벡터를 순차적으로 처리하며, 다음 배치에 대한 프리페칭 명령어를 발행하면서 이전 배치가 완전히 계산된 후에 다음 배치를 처리합니다. 따라서 CPU가 데이터를 필요로 하기 전에 미래에 쓰일 데이터를 미리 L1 캐시로 끌어옵니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt368f29b5143d0f5a/6a1701dcc1e8a51780f8817b/a39548f8060c2a4a5154521a4047dd92d8cd77be-1580x309.png" alt="x86(AMD Turin) — int8 연산당 하드웨어 카운터'라는 제목의 표는 L1 캐시 미스, IPC, dTLB 미스에 대한 단일 모드와 벌크 모드를 비교하고, 해당 개선 요소를 보여줍니다." /><p>ARM에서는 프리페칭을 사용하더라도 동일한 순차적 접근 방식의 성능이 저조했습니다. 대신 <strong>벌크 커널</strong>은 매 스트라이드 위치마다 4개의 벡터에서 로드를 인터리브하여 순서에 상관없이 실행되는 엔진에 4개의 독립적인 메모리 스트림을 제공합니다. CPU는 데이터를 더 빠르게 가져오는 것이 아니라 메모리 요청이 처리되는 동안 항상 다른 계산 작업을 수행할 수 있으므로 대기 시간을 줄입니다. 자세한 분석은 <a href="https://github.com/elastic/elasticsearch/issues/145412">이 GitHub 이슈</a>에서 확인할 수 있습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8751ac5b20b75508/6a1701deab7f08db83db9d13/832de3bc0d556a493b7bf3f250196018acfc1585-1580x238.png" alt="'ARM(Graviton 4) — int8 연산당 하드웨어 카운터'라는 제목의 표는 L1 캐시 미스 및 백엔드 스톨에 대한 단일 모드와 벌크 모드를 비교하고 해당 개선 사항을 설명합니다." /><p>수치는 두 가지 다른 이야기를 들려줍니다.</p><ol><li><p>x86에서는 프리페칭을 통해 139,000개의 캐시 미스가 19,000개로 줄어들고, 사이클당 명령어 수(IPC)는 두 배 이상 증가합니다. 프리페칭은 점점 더 비용이 많이 드는 DRAM 왕복을 숨겨주기 때문에 데이터 세트 크기가 커질수록 이러한 이점은 더욱 커져 L2 캐시에서는 1.2배, L3 이상에서는 2.8배에 이릅니다.</p></li><li><p>ARM에서는 캐시 미스는 거의 변하지 않습니다. 달라지는 것은 활용률입니다. 인터리브 액세스 패턴 덕분에 파이프라인에 데이터가 지속적으로 공급되어 백엔드 스톨이 40% 감소합니다. 데이터가 캐시에서 오든 DRAM에서 오든 메모리 수준 병렬 처리가 적용되므로 이러한 이점은 데이터 세트 크기와 관계없이 1.8배로 일관되게 유지됩니다.</p></li></ol><p>두 가지 아키텍처, 두 가지 전략, 하나의 결과: 프로덕션 규모에서 simdvec은 벡터가 메인 메모리에 분산되어 있더라도 CPU 파이프라인을 계속 바쁘게 유지합니다.</p><h2>Elasticsearch 사용자에게 의미하는 바</h2><p>이러한 커널 수준 기능은 복합적으로 작용합니다. 단일 벡터 검색 쿼리는 수백만 개의 거리 연산(HNSW 그래프 탐색, 후보 스코어링, 순위 재지정)을 수행할 수 있습니다. 수천 개의 동시 쿼리에서 연산당 나노초 단위의 차이는 쿼리 지연 시간과 클러스터 처리량에 직접적인 영향을 미칩니다. float32, int8, bfloat16 또는 BBQ를 사용하든, 인덱스가 메모리에 있든 디스크에 있든, simdvec은 그 기반 엔진이며, 이러한 모든 연산은 마지막 나노초까지 최적화된 동일한 엔진을 통해 실행됩니다.</p><p>핵심은 프로덕션 규모에서 벡터 검색 성능이 주로 원시 SIMD 처리량에 의해 결정되는 것이 아니라는 점입니다. 시스템이 얼마나 효율적으로 메모리 지연 시간을 숨기면서 수백만 개의 소규모 연산에 걸쳐 컴퓨팅을 유지하느냐에 따라 결정됩니다.</p><p>simdvec 커널은 거의 모든 Elasticsearch 릴리즈에서 개선됩니다. 새로운 양자화 유형과 하드웨어 플랫폼이 등장하면 첫날부터 최적화된 커널이 제공됩니다. 또한 기존 유형은 이미 출시된 구현을 개선하면서 계속해서 빨라집니다.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-simdvec-engine</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-simdvec-engine</guid>
    <category><![CDATA[벡터 데이터베이스]]></category>
    <category><![CDATA[Elastic 내부]]></category>
    <dc:creator><![CDATA[Chris Hegarty,Lorenzo Dematte,Simon Cooper]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta18088409621369b/6a1701dfdc55de7297e00c8b/df9646091bafbbf0a6dfd212ff8a6bd1e8589708-1280x720.png" length="0" type="image/png"/>
    <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[스위스식 해시 테이블을 사용한 더 빠른 ES|QL 통계 처리]]></title>
    <description><![CDATA[스위스식 해싱과 SIMD 친화적인 설계가 Elasticsearch 쿼리 언어(ES|QL)에서 일관되고 측정 가능한 속도 향상을 실현하는 방법.]]></description>
    <content:encoded><![CDATA[<p>최근 Elasticsearch의 해시 테이블 구현의 핵심적인 부분을 스위스식 설계로 교체하였으며, 균일하고 카디널리티가 높은 워크로드에서 빌드 및 반복 시간이 최대 2~3배 빨라지는 결과를 확인했습니다. 결과적으로 Elasticsearch 쿼리 언어(ES|QL) 통계 및 분석 작업에서 더 낮은 지연 시간, 더 나은 처리량 및 더 예측 가능한 성능을 구현할 수 있게 되었습니다.</p><h2>이것이 중요한 이유</h2><p>대부분의 일반적인 분석 워크플로우는 결국 데이터를 그룹화하는 작업으로 귀결됩니다. 호스팅당 평균 바이트 계산, 사용자당 이벤트 계산 또는 다양한 차원에 걸친 메트릭 집계 등의 작업을 수행하더라도 핵심 작업은 동일합니다. 키를 그룹에 맵핑하고 실행 중인 집계를 업데이트하는 것입니다.</p><p>작은 규모에서는 거의 모든 합리적인 해시 테이블이 잘 작동합니다. 대규모 환경(수억 건의 문서와 수백만 개의 개별 그룹)에서는 아주 작은 세부 사항들이 중요해지기 시작합니다. 로드 팩터, 탐색 전략, 메모리 레이아웃 및 캐시 동작이 선형적인 성능 향상을 이뤄내느냐, 혹은 캐시 미스의 장벽에 가로막히느냐를 결정짓는 차이를 만듭니다.</p><p>Elasticsearch는 수년간 이러한 워크로드를 지원해 왔지만, 핵심 알고리즘을 현대화할 수 있는 기회를 항상 모색하고 있습니다. 따라서 스위스 테이블에서 영감을 받은 새로운 접근 방식을 평가하고 이를 ES|QL의 통계 계산 방식에 적용했습니다.</p><h2>스위스 테이블의 본질은 무엇인가요?</h2><p>스위스 테이블은 Google의 SwissTable로 대중화되고 나중에 Abseil 및 기타 라이브러리에서 채택된 현대적인 해시 테이블의 한 계열입니다.</p><p>기존의 해시 테이블은 포인터를 쫓아가거나 키를 로드하는 데 많은 시간을 소비하지만, 그 결과가 일치하지 않는 경우가 많습니다. 스위스 테이블의 주요 특징은 키와 값과는 별도로 저장되는 <em>제어 바이트</em>라는 작은 캐시 상주 배열 구조를 사용하여 대부분의 탐색을 거부함으로써 메모리 트래픽을 획기적으로 줄일 수 있다는 점입니다.</p><p>각 제어 바이트는 하나의 슬롯을 나타내며, 저희의 경우에는 두 가지 정보를 인코딩합니다. 바로 해당 슬롯이 비어 있는지 여부와 해시값에서 추출한 짧은 지문입니다. 이러한 제어 바이트는 일반적으로 16개의 그룹으로 메모리에 연속적으로 배치되어 <a href="https://en.wikipedia.org/wiki/Single_instruction,_multiple_data">단일 명령, 다중 데이터</a>(SIMD) 처리에 적합합니다.</p><p>스위스 테이블은 한 번에 하나의 슬롯을 탐색하는 대신 벡터 명령어를 사용하여 전체 제어 바이트 블록을 스캔합니다. CPU는 단 한 번의 연산으로 새로 들어온 키의 지문을 16개의 슬롯과 비교하고 비어 있는 항목들을 걸러냅니다. 이 빠른 경로에서 살아남은 소수의 후보만 실제 키를 로드하고 비교해야 합니다.</p><p>이 설계는 약간의 추가 메타데이터를 사용하는 대신, 훨씬 뛰어난 캐시 지역성을 확보하고 무작위 로드 횟수를 획기적으로 줄입니다. 테이블이 커지고 탐색 체인이 길어질수록 이러한 속성의 가치는 점점 더 중요해집니다.</p><h2>핵심에 자리잡은 SIMD</h2><p>이 모든 것의 진정한 주인공은 SIMD입니다.</p><p>제어 바이트는 단순히 컴팩트할 뿐만 아니라 벡터 명령어로 처리되도록 명시적으로 설계되었습니다. 단일 SIMD 비교를 통해 한 번에 16개의 지문을 확인할 수 있어, 일반적으로 루프로 처리되는 작업을 몇 가지 광범위한 작업으로 전환할 수 있습니다. 그 예는 다음과 같습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1f710e87dd749ab3/6a170cc46234e052dadb1a49/bd418778f0c6144f8f5f18419f6220ac0c935c7a-903x407.png" alt="Elasticsearch의 핵심에 자리잡은 SIMD" /><p>실제로 이는 다음과 같은 의미를 지닙니다.</p><ul><li><p>분기 명령 감소.</p></li><li><p>탐색 체인 단축.</p></li><li><p>키 및 값 메모리로부터의 데이터 로드 횟수 감소.</p></li><li><p>CPU 실행 유닛의 활용도 대폭 향상.</p></li></ul><p>대부분의 조회 작업은 제어 바이트 스캔 단계에서 마무리됩니다. 다음 단계로 넘어가는 경우, 남은 작업은 매우 집중적이며 예측 가능합니다. 최신 CPU가 잘 처리하는 워크로드는 바로 이런 종류의 워크로드입니다.</p><h2>SIMD의 작동 원리 살펴보기</h2><p>애플리케이션의 내부 작동 원리를 살펴보고 싶은 독자를 위해, 테이블에 새 키를 삽입할 때 어떤 일이 일어나는지 알려드리겠습니다. 128비트 벡터를 사용하는 파나마 벡터 API를 활용하여 16개의 제어 바이트를 병렬로 처리합니다.</p><p>다음 스니펫은 Intel Rocket Lake에서 AVX-512로 생성된 코드를 보여 줍니다. 명령어는 해당 환경을 반영하지만, 설계는 AVX-512에 의존하지 않습니다. 동일한 고수준 벡터 연산은 동등한 명령어(예: AVX2, SSE 또는 NEON)를 사용하여 다른 플랫폼에서도 실행됩니다.</p>; Load 16 control bytes from the control block
vmovdqu xmm0, XMMWORD PTR [r9+r10*1+0x10]

; Broadcast the 7-bit fingerprint of the new key across the vector
vpbroadcastb xmm1, r11d

; Compare all 16 control bytes to the new fingerprint
vpcmpeqb k7, xmm0, xmm1
kmovq rbx, k7

; Check if any matches were found
test rbx, rbx
jne &lt;handle_match&gt;<p>각 명령어는 삽입 과정에서 명확한 역할을 수행합니다.</p><ul><li><p><code>vmovdqu</code>: 128비트 <code>xmm0</code> 레지스터에 연속된 16개의 제어 바이트를 로드합니다.</p></li><li><p><code>vpbroadcastb</code>새로운 키의 7비트 지문을 <code>xmm1</code> 레지스터의 모든 레인에 복제합니다.</p></li><li><p><code>vpcmpeqb</code>: 각 제어 바이트를 브로드캐스트된 지문과 비교하여 일치할 가능성이 있는 마스크를 생성합니다.</p></li><li><p><code>kmovq</code> + <code>test</code>: 마스크를 범용 레지스터로 이동하고 일치하는 항목이 있는지 빠르게 확인합니다.</p></li></ul><p>벤치마킹 결과에 따르면 더 넓은 레지스터를 사용하여 32바이트 또는 64바이트로 확장해도 측정 가능한 성능 이점을 얻을 수 없었기 때문에, 최종적으로 한 번에 16개의 제어 바이트로 구성된 프로빙 그룹을 사용하기로 결정했습니다.</p><h2>ES|QL과의 통합</h2><p>Elasticsearch에서 스위스식 해싱을 채택한 것은 단순히 기존 방식을 대체하는 것이 아니었습니다. ES|QL은 메모리 회계, 안정성, 및 나머지 연산 엔진과의 통합 측면에서 매우 엄격한 요구 사항을 가지고 있습니다.</p><p>새로운 해시 테이블을 페이지 리사이클러 및 서킷 브레이커 회계 기능을 포함한 Elasticsearch의 메모리 관리 기능과 긴밀하게 통합하여 할당이 가시적이고 제한된 범위 내에서 이루어지도록 했습니다. Elasticsearch의 집계는 밀집된 형태로 저장되고 그룹 ID로 색인되어 메모리 레이아웃을 컴팩트하게, 반복 작업 속도를 빠르게 유지할 뿐만 아니라 임의 접근을 허용함으로써 특정 성능 최적화를 가능하게 합니다.</p><p>가변 길이 바이트 키의 경우, 그룹 ID와 함께 전체 해시를 캐시합니다. 이렇게 하면 탐색 과정에서 비용이 많이 드는 해시 코드를 다시 계산하지 않아도 되고, 관련 메타데이터를 서로 가깝게 유지하여 캐시 로컬리티를 개선할 수 있습니다. 리해싱 시에 실제 값을 검사할 필요 없이, 캐싱된 해시 값과 제어 바이트에만 의존하여 처리할 수 있으므로 리사이징 비용을 낮게 유지할 수 있습니다.</p><p>구현에서 한 가지 중요한 단순화 포인트는 항목을 절대 삭제하지 않는다는 점입니다. 이를 통해 <em>툼스톤</em>(이전에 점유했던 슬롯을 식별하는 마커)이 필요 없으며, 빈 슬롯을 완전히 비어 있는 상태로 유지할 수 있게 되었습니다. 이는 탐색 동작을 더욱 개선하고 제어 바이트 스캔을 효율적으로 유지합니다.</p><p>그 결과, Elasticsearch의 실행 모델에 자연스럽게 녹아들면서도 스위스 테이블만의 매력적인 성능 특성을 유지하는 설계가 탄생했습니다.</p><h2>성능은 어떻습니까?</h2><p>작은 카디널리티에서 스위스 테이블은 기존 구현과 거의 동등한 성능을 발휘합니다. 이는 예상된 결과입니다. 테이블의 크기가 작을 때는 캐시 효과의 영향이 적고, 최적화할 만한 탐색 과정이 거의 없기 때문입니다.</p><p>카디널리티가 증가함에 따라 상황은 급격히 달라집니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt09b13af2fe162f59/6a170cc66f7f04485c9148b8/24900afc47ab07b0e9933f6117b99d0f4613f794-962x599.png" alt="스위스식 해시 테이블을 사용한 ES|QL 통계" /><p>위의 히트맵은 1,000개에서 최대 10,000,000개 그룹에 이르는 카디널리티 범위에 걸쳐, 다양한 키 크기(8, 32, 64, 128바이트)별 시간 개선 지수를 보여 줍니다. 카디널리티가 증가함에 따라 개선 지수는 꾸준히 증가하며, 균등 분포의 경우 최대 2~3배에 달합니다.</p><p>이러한 추세는 설계 단계에서 예측한 바와 정확히 일치합니다. 기존의 해시 테이블은 카디널리티가 높아질수록 탐색 체인이 길어지지만, 스위스식 탐색은 대부분의 조회를 SIMD 연산에 최적화된 제어 바이트 블록 내에서 해결합니다.</p><h2>캐시 동작이 알려 주는 이야기</h2><p>속도 향상이 가능했 이유를 더 잘 이해하기 위해, 동일한 JMH <a href="https://github.com/elastic/elasticsearch/pull/139343/files#diff-d0e0cc91a7495bf36b2d44eacce95f5185d01879e5f6c38089ac7a89aad17da7"><code>benchmarks</code></a>를(을) Linux <code>perf</code> 환경에서 실행하여 캐시 및 TLB 통계를 캡처했습니다.</p><p>원본 구현과 비교할 때 스위스 버전은 전반적으로 약 60% 적은 캐시 참조를 수행합니다. 최종 레벨 캐시 로드가 4배 이상 감소하고, LLC 로드 미스는 6배 이상 감소합니다. LLC 미스는 보통 메인 메모리 접근으로 곧장 이어지기 때문에, 이러한 감소 만으로도 전체 성능 향상의 상당 부분을 설명할 수 있습니다.</p><p>CPU와 더 가까울수록 L1 데이터 캐시 미스가 감소하고, 데이터 TLB 미스는 거의 6배나 줄어어, 공간 지역성이 더 치밀해지고 메모리 접근 패턴이 더 예측 가능해졌음을 의미합니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb987a5bd98c0d7eb/6a170cc8a929cf9655ae0a25/6e49b7609fba83e33692cb9834552b6ca7e42a83-998x499.png" alt="캐시 동작: 기존 구현과 Swiss식 해시 테이블을 사용한 ES|QL 통계 비교" /><p>이것이 바로 SIMD 친화적인 제어 바이트가 가져다주는 실질적인 이득입니다. 메모리에 흩어져 있는 키와 값을 반복해서 로드하는 대신, 대부분의 탐색 과정을 캐시에 상주하는 컴팩트한 구조를 스캔하여 해결합니다. 메모리 접근 횟수가 줄어들면 미스가 줄고, 미스가 적을수록 쿼리가 더 빨라집니다.</p><h2>결론</h2><p>스위스식 해시 테이블 설계를 채택하고 SIMD 친화적인 탐색을 적극적으로 활용함으로써, 카디널리티가 높은 ES|QL 통계 워크로드에서 2~3배의 속도 향상과 더불어 더욱 안정적이고 예측 가능한 성능을 달성했습니다.</p><p>이 연구는 최신 CPU 인식 데이터 구조가 해시 테이블과 같이 이미 잘 알려진 문제에서도 상당한 성능 향상을 가져올 수 있음을 보여줍니다. 여기에는 추가적인 기본 유형 특수화 및 조인과 같은 다른 고카디널리티 경로에서의 사용 등 탐구할 여지가 더 많습니다. 이 모든 것은 Elasticsearch 내부를 지속적으로 현대화하기 위해 광범위하세 진행 중인 노력의 일부일 뿐입니다.</p><p>자세한 내용이 궁금하시거나 작업 과정을 살펴보고 싶으시다면, 이 <a href="https://github.com/elastic/elasticsearch/pull/139343">풀 리퀘스트</a> 및 <a href="https://github.com/elastic/elasticsearch/issues/138799">메타 이슈</a> 추적 진행 상황을 Github에서 확인하세요.</p><p>해싱을 즐기십시오!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/esql-swiss-hash-stats</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/esql-swiss-hash-stats</guid>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Chris Hegarty,Matthew Alp,Nik Everett]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf76dd688c5b737e6/6a170cc9839dfa7fc7dcff40/21036e031070f14faccb2b53b22723de2750c391-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch에서 NVIDIA cuVS를 활용하여 벡터 색인화 속도 최대 12배 향상: GPU 가속화 챕터 2]]></title>
    <description><![CDATA[Elasticsearch가 GPU 가속 벡터 색인화와 NVIDIA cuVS로 어떻게 거의 12배 더 높은 색인화 처리량을 달성하는지 알아보세요.]]></description>
    <content:encoded><![CDATA[<p>올해 초 Elastic은 NVIDIA와의 <a href="https://ir.elastic.co/news/news-details/2025/Elastic-Brings-Enterprise-Data-to-NVIDIA-AI-Factories/default.aspx">협업</a>을 통해 Elasticsearch에 GPU 가속화를 도입하여 <a href="https://developer.nvidia.com/cuvs">NVIDIA cuVS</a>와 통합한다고 발표했으며, <a href="https://www.nvidia.com/en-us/on-demand/session/gtc25-S71286/">NVIDIA GTC의 세션</a>과 다양한 <a href="https://www.elastic.co/search-labs/blog/gpu-accelerated-vector-search-elasticsearch-nvidia">블로그</a>에 자세히 설명되어 있습니다. 이 게시물은 NVIDIA 벡터 검색 팀과의 공동 엔지니어링 활동에 대한 업데이트입니다.</p><h2>요약</h2><p>먼저 현황을 간략하게 설명하겠습니다. Elasticsearch는 강력한 벡터 데이터베이스로서, 풍부한 기능과 대규모 유사성 검색을 위한 뛰어난 성능을 제공하며 자리매김했습니다. 스칼라 양자화, Better Binary Quantization(<a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">BBQ</a>), <a href="https://www.elastic.co/blog/accelerating-vector-search-simd-instructions">SIMD</a> 벡터 연산, 그리고 <a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction">DiskBBQ</a>와 같은 디스크 효율적인 알고리즘을 통해 벡터 워크로드를 효율적이고 유연하게 관리할 수 있는 다양한 옵션을 제공합니다.</p><p>NVIDIA cuVS를 벡터 검색 작업을 위한 호출 가능한 모듈로 통합함으로써 벡터 색인화 성능과 효율성을 크게 향상해 대규모 벡터 워크로드를 보다 효과적으로 지원하는 것을 목표로 합니다.</p><h2>당면 과제</h2><p>고성능 벡터 데이터베이스를 구축하는 데 있어 매우 어려운 과제 중 하나는 벡터 인덱스, 즉 <a href="https://arxiv.org/abs/1603.09320">HNSW</a> 그래프를 구성하는 것입니다. 인덱스 구축은 각 벡터가 다른 수많은 벡터와 비교되기 때문에 수백만, 심지어 수십억 개의 산술 연산으로 빠르게 진행됩니다. 또한 압축 및 병합과 같은 인덱스 수명 주기 작업은 색인화의 전체 컴퓨팅 오버헤드를 더 증가시킬 수 있습니다. 데이터 볼륨과 관련 벡터 임베딩이 기하급수적으로 증가함에 따라 대규모 병렬 처리와 높은 처리량의 연산을 위해 구축된 가속 컴퓨팅 GPU는 이러한 워크로드를 처리하는 데 최적의 위치에 있습니다.</p><h2>Elasticsearch-GPU 플러그인 입력</h2><p><a href="https://developer.nvidia.com/cuvs">NVIDIA cuVS</a>는 GPU 가속 벡터 검색 및 데이터 클러스터링을 위한 오픈 소스 CUDA-X 라이브러리로, AI 및 추천 워크로드를 위한 빠른 인덱스 구축 및 임베딩 검색을 가능하게 합니다.</p><p>Elasticsearch는 커뮤니티가 개발하고 NVIDIA가 관리하는 오픈 소스 라이브러리인 <a href="https://mvnrepository.com/artifact/com.nvidia.cuvs/cuvs-java">cuvs-java</a>를 통해 cuVS를 사용합니다. cuvs-java 라이브러리는 경량이며, <a href="https://docs.rapids.ai/api/cuvs/nightly/c_api/">cuVS C API</a>를 기반으로 <a href="https://openjdk.org/projects/panama/">Panama</a> Foreign Function을 사용하여 cuVS 기능을 관용적인 Java 방식으로 노출하면서도 최신 기술과 뛰어난 성능을 유지합니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7fd7361099da05a/6a17e920be608670af00477f/5f6daa1eb07f704a6707d9e6b7ccb81d0abaa8c9-566x419.png" alt="Elasticsearch가 NVIDIA cuVS, CPU 및 GPU 색인화로 작동하는 방식" /><p>cuvs-java 라이브러리는 <a href="https://github.com/elastic/elasticsearch/pull/135545">새로운 Elasticsearch 플러그인</a>에 통합되어 있습니다. 따라서 GPU에서의 벡터 색인화는 동일한 Elasticsearch 노드와 프로세스에서 외부 코드나 하드웨어를 프로비저닝할 필요 없이 수행할 수 있습니다. 인덱스 구축 중에 cuVS 라이브러리가 설치되고 GPU가 존재하며 구성된 경우 Elasticsearch는 GPU를 사용하여 벡터 색인화 프로세스를 가속화합니다. 벡터는 GPU에 전달되어 <a href="https://arxiv.org/abs/2308.15136">CAGRA</a> 그래프를 구성합니다. 이 그래프는 HNSW 형식으로 변환되어 CPU에서 벡터를 즉시 검색할 수 있게 됩니다. 구축된 그래프의 최종 형식은 CPU에서 구축되는 것과 동일합니다. 이를 통해 Elasticsearch는 기본 하드웨어가 지원할 경우 높은 처리량의 벡터 색인화에 GPU를 활용할 수 있으며, 동시에 CPU 자원을 다른 작업(동시 검색, 데이터 처리 등)에 사용할 수 있습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt485f55f29d6df5c4/6a17e922be6086dcf3004785/3ea255bd9bfd7983f78143c5eba999d2149d72be-671x356.png" alt="" /><h2>인덱스 구축 가속화</h2><p>Elasticsearch에 GPU 가속화를 통합하는 과정에서 cuvs-java에 여러 가지 개선 사항이 적용되었으며, 특히 효율적인 데이터 입출력 및 함수 호출에 중점을 두었습니다. 핵심적인 개선 사항 중 하나는 <a href="https://github.com/rapidsai/cuvs/blob/2cf5fa7666d703dccbe655f8214656b0952bb69b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSMatrix.java">cuVSMatrix</a>를 사용하여 Java 힙, 오프힙 또는 GPU 메모리에 저장된 벡터를 투명하게 모델링하는 것입니다. 이를 통해 데이터가 메모리와 GPU 간에 효율적으로 이동하여 수십억 개의 벡터를 불필요하게 복사하는 것을 방지할 수 있습니다.</p><p>이러한 기본 제로 카피 추상화 덕분에 GPU 메모리로의 전송과 그래프 검색이 모두 직접 이루어질 수 있습니다. 색인화하는 동안 벡터는 먼저 Java 힙의 메모리에 버퍼링된 다음 GPU로 전송되어 CAGRA 그래프를 구성합니다. 그 후 그래프는 GPU에서 검색되어 HNSW 형식으로 변환된 후 디스크에 유지됩니다.</p><p>병합 시점에 벡터는 이미 디스크에 저장되어 있으므로 Java 힙을 완전히 우회합니다. 인덱스 파일은 메모리 맵핑 방식으로 처리되며 데이터는 GPU 메모리로 직접 전송됩니다. 또한 이 설계는 float32 또는 int8과 같은 다양한 비트 폭을 쉽게 수용할 수 있으며 다른 양자화 방식으로도 자연스럽게 확장됩니다.</p><h2>자, 그럼 성능은 어떨까요?</h2><p>수치를 살펴보기 전에, 약간의 배경 설명이 필요합니다. Elasticsearch에서 세그먼트 병합은 보통 색인 과정 중 백그라운드에서 자동으로 실행되기 때문에, 이를 단독으로 분리해 벤치마크하기가 어렵습니다. 재현 가능한 결과를 얻기 위해, 이번에는 강제 병합을 사용하여 통제된 실험 환경에서 세그먼트 병합을 명시적으로 트리거했습니다. 강제 병합은 백그라운드 병합과 동일한 기본 병합 작업을 수행하므로, 실제 색인 워크로드에서는 정확한 향상 폭이 다를 수 있지만, 성능 개선 효과를 가늠하는 유용한 지표로 볼 수 있습니다.</p><p>이제 수치를 확인해 보겠습니다.</p><p>초기 벤치마크 결과는 매우 희망적입니다. 로컬로 연결된 NVMe 저장 공간이 있는 AWS <code>g6.4xlarge</code> 인스턴스에서 벤치마크를 실행했습니다. Elasticsearch의 단일 노드는 기본 최적의 색인화 스레드 수(8개 - 물리적 코어당 1개)를 사용하고 <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/merge">병합 스로틀링</a>을 비활성화하도록 구성되었습니다(빠른 NVMe 디스크에는 적용하기 어렵습니다).</p><p>데이터 세트에는 <a href="https://github.com/elastic/rally-tracks/blob/master/openai_vector/README.md">OpenAI Rally 벡터 트랙</a>에서 가져온 1,536차원의 260만 개 벡터를 사용했으며, <a href="https://github.com/elastic/elasticsearch/pull/137072">base64 스트링</a>으로 인코딩하고 float32 <em>hnsw</em>로 색인화했습니다. 모든 시나리오에서 구성된 그래프는 최대 95%의 재현율을 달성했습니다. 결과는 다음과 같습니다.</p><ul><li><p><strong>색인화 처리량:</strong> 인메모리 버퍼 플러시 중 그래프 구성을 GPU로 이동하여 처리량이 약 12배 증가합니다.</p></li><li><p><strong>강제 병합:</strong> 색인화가 완료된 후에도 GPU는 세그먼트 병합을 계속 가속화하여 강제 병합 단계의 속도를 최대 7배까지 높입니다.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfea4ee13b5a3b10d/6a17e923e9ea879c6aa9c616/f60ea9ee5996e456f393ffd195ee7eada6e5a7c2-948x387.png" alt="" /><ul><li><p><strong>CPU 사용량:</strong> 그래프 구성을 GPU로 오프로드하면 평균 및 최대 CPU 사용량이 많이 감소합니다. 아래 그래프는 색인화 및 병합 중 CPU 사용량을 보여주며, 이러한 작업이 GPU에서 실행될 때 GPU 작업량이 얼마나 낮아지는지를 강조합니다. GPU 색인화 중 CPU 사용률이 낮아지면 CPU 사이클이 확보되어 검색 성능 향상에 활용할 수 있습니다.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt80ff9c53f9b6884a/6a17e925445de9ee4b4d0187/5e680a5fc41700a877f3d8b2e5ce18ebd3f37a0b-1600x562.png" alt="" /><ul><li><p><strong>재현율:</strong> CPU와 GPU 실행 간의 정확도는 사실상 동일하지만, GPU로 구축된 그래프는 재현율이 약간 더 높습니다.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cbe084eca27b8e4/6a17e926faa913317093c8b7/48a2b7758606bd321712b7d8378cd2640e652a4e-1384x544.png" alt="" /><h2>가격 측면에서 비교</h2><p>앞선 비교에서는 의도적으로 동일한 하드웨어를 사용했으며 유일한 차이점은 색인 과정에서 GPU를 사용했는지 여부였습니다. 이 설정은 순수 연산 성능의 영향을 분리하여 파악하는 데 유용하지만 비용 관점에서의 비교도 가능합니다.</p><p>GPU 가속 구성과 거의 동일한 시간당 요금으로 CPU 전용 구성을 프로비저닝할 수 있습니다. 이 경우 비교 가능한 CPU 및 메모리 리소스가 약 두 배(32 vCPU(AMD EPYC), 64GB RAM)로 제공되며 색인 스레드 수를 16개로 두 배 늘릴 수 있습니다.</p><p>공정하고 일관된 비교를 위해 GPU를 명시적으로 비활성화한 상태로 AWS g6.8xlarge 인스턴스에서 CPU 전용 실험을 수행했습니다. 이를 통해 다른 모든 하드웨어 특성을 동일하게 유지하면서 GPU 가속과 CPU 전용 색인 간의 비용 대비 성능 트레이드오프를 평가할 수 있었습니다.</p><p>예상대로 더 강력한 CPU 인스턴스는 위 섹션의 벤치마크와 비교했을 때 향상된 성능을 보여줍니다. 그러나 이 더 강력한 CPU 인스턴스를 원래의 GPU 가속 결과와 비교해 보면 GPU는 여전히 상당한 성능 향상을 제공합니다. 색인화 처리량에서 <strong>약 5배</strong>, 강제 병합에서 <strong>약 6배</strong>의 성능 향상을 보이며, 동시에 최대 <strong>95%</strong>의 재현율을 달성하는 그래프를 구축할 수 있습니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt94b5eb6f95ba307d/6a17e928abe0f255d4dfea35/8ffa58cae3ad175ef2932a351aeef4c34a1407b9-948x394.png" alt="" /><h2>결론</h2><p>엔드 투 엔드 시나리오에서 NVIDIA cuVS를 사용한 GPU 가속화는 색인화 처리량을 거의 12배 향상하고 강제 병합 지연 시간을 7배 단축하는 동시에 CPU 사용률을 크게 낮춥니다. 이는 벡터 색인화 및 병합 워크로드가 GPU 가속화를 통해 상당한 성능 향상을 얻을 수 있음을 보여줍니다. 비용을 고려한 비교에서도 GPU 가속화는 색인화 처리량을 약 5배, 강제 병합 작업 속도를 약 6배 향상하는 등 상당한 성능 향상을 제공합니다.</p><p>GPU 가속 벡터 색인화는 현재 Elasticsearch 9.3의 기술 미리 보기로 계획되어 있으며, 2026년 초에 출시될 예정입니다.</p><p>더 많은 소식을 기대해 주세요.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-gpu-accelerated-vector-indexing-nvidia</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-gpu-accelerated-vector-indexing-nvidia</guid>
    <category><![CDATA[벡터 데이터베이스]]></category>
    <dc:creator><![CDATA[Chris Hegarty,Hemant Malik,Corey Nolet,Manas Singh,Mithun Radhakrishnan,Mayya Sharipova,Lorenzo Dematte,Ben Frederickson]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1248d51633bd75d9/6a17e92ae9ea8714b3a9c61a/08f7469a4daaf67b7c5999585aae179b6680c78d-896x746.png" length="0" type="image/png"/>
    <pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[NVIDIA와 함께 Elasticsearch에서 GPU 가속 벡터 검색 살펴보기: 1장]]></title>
    <description><![CDATA[NVIDIA cuVS를 기반으로 하는 이 협력은 개발자들에게 Elasticsearch의 벡터 검색을 위한 GPU 가속을 제공하기 위한 것입니다.]]></description>
    <content:encoded><![CDATA[<p>Elastic 엔지니어링 조직에서는 한동안 벡터 데이터베이스 성능을 최적화하느라 바빴습니다. 우리의 사명: 최고의 벡터 데이터베이스를 만드는 것. 루씬과 엘라스틱서치를 최고의 벡터 데이터베이스로 만드는 것입니다. 하드웨어 가속 <a href="https://www.elastic.co/kr/blog/accelerating-vector-search-simd-instructions">CPU SIMD 명령어를</a> 통해 새로운 벡터 데이터 압축 혁신<a href="https://www.elastic.co/kr/search-labs/blog/better-binary-quantization-lucene-elasticsearch">(Better Binary Quantization, 일명 BBQ)</a>을 도입하고, 더 많은 이점을 위해 BBQ에 대한 알고리즘 접근 방식을 업데이트하여 기대치를 뛰어넘고 <a href="https://www.elastic.co/kr/search-labs/blog/filtered-hnsw-knn-search">필터링된 HNSW를 더욱 빠르게 만들었습니다</a>. 요점은 더 빠르고, 더 좋고, 더 효율적인(?) 환경을 구축한다는 것입니다. 벡터 데이터베이스를 통해 개발자들이 헝겊처럼 지저분한 문제를 해결할 수 있습니다!</p><p>효율성을 뒤처지지 않겠다는 사명의 일환으로, 여러분도 들어보셨을지도 모르는 이 신기한 컴퓨터 칩, 즉 엔비디아 GPU로 가속 기회를 모색하고 있습니다! (정말 안 들어보셨나요?).</p><p>성능에 집착할 때, 기하급수적으로 많은 데이터를 색인하는 방법, 데이터에서 인사이트를 검색하는 방법, ML 모델이 관련된 경우 이를 수행하는 방법 등 여러 가지 문제를 탐구해야 합니다. GPU가 있을 때 가능한 모든 혜택을 누릴 수 있어야 합니다.</p><p>이 포스팅에서는 NVIDIA 벡터 검색 팀과의 협업을 통해 Elasticsearch에서 GPU 가속 벡터 검색을 살펴봅니다. 이 작업은 개발자가 실제 Elasticsearch 기반 앱에 GPU와 CPU를 혼합하여 사용할 수 있는 사용 사례의 길을 열어줍니다. 신나는 시간!</p><h2>Elasticsearch GPU</h2><p>Elasticsearch 엔지니어링 팀이 벡터 검색 알고리즘을 위한 바인딩을 노출하는 개발자를 위한 오픈 소스 cuVS Java API 환경을 구축하는 데 도움을 주고 있다는 소식을 알려드리게 되어 기쁩니다. 이 작업은 파나마 FFI에 대한 이전 경험을 활용합니다. Elasticsearch와 Apache Lucene은 인덱싱 중에 NVIDIA cuVS API를 사용해 그래프를 구축합니다. 자, 너무 앞서 나갔으니 잠시 뒤로 돌아가 보겠습니다.</p><p>이 협업의 중심에는 오픈 소스 C++ 라이브러리인 <a href="https://developer.nvidia.com/cuvs">NVIDIA cuVS가</a> 있습니다. 더 높은 처리량, 더 낮은 지연 시간, 더 빠른 인덱스 구축 시간을 제공함으로써 벡터 검색에 GPU 가속을 도입하는 것을 목표로 합니다. 하지만 Elasticsearch와 Apache Lucene은 Java로 작성되어 있는데 어떻게 작동할까요?</p><p><a href="https://github.com/SearchScale/lucene-cuvs">lucene-cuvs와</a> Elastic-NVIDIA-SearchScale 협업을 통해 이를 Lucene 에코시스템에 도입하여 Elasticsearch에서 GPU 가속 벡터 검색을 탐색하세요. 최근 NVIDIA cuVS 25.02 릴리스에서는 cuVS용 Java API를 추가했습니다. 새로운 API는 실험 중이며 계속 발전해 나갈 예정이지만 현재 사용 가능합니다. Java에서 네이티브 함수 호출은 느리지 않나요? 더 이상은 아닙니다! 바인딩에는 새로운 <a href="https://openjdk.org/projects/panama/">파나마 FFI</a> (외부 함수 인터페이스)를 사용하고 있으며, 이는 Java에서 네이티브 다운콜에 대한 오버헤드를 최소화합니다.</p><p>저희는 한동안 <a href="https://www.elastic.co/kr/search-labs/blog/lucene-and-java-moving-forward-together">Elasticsearch와 Lucene에서 Panama FFI를</a> 사용해 왔습니다. 멋지네요! 하지만... 항상 "하지만"이 붙는 법이죠? FFI는 Java 버전에 따라 가용성 문제가 있습니다. 저희는 cuVS API를 Java 21로 컴파일하고 Java 22를 대상으로 하는 다중 릴리스 컨테이너 내에 구현을 캡슐화하여 이 문제를 극복했습니다. 이를 통해 Lucene과 Elasticsearch에서 직접 cuVS Java를 사용할 수 있습니다.</p><p>이제 cuVS Java API가 생겼으니 또 무엇이 필요할까요?</p><h2>CPU를 위한 두 가지 알고리즘 이야기</h2><p>Elasticsearch는 확장 가능한 근사 KNN 검색을 위해 <a href="https://arxiv.org/abs/1603.09320">HNSW 알고리즘을</a> 지원합니다. 그러나 GPU를 최대한 활용하기 위해 유니티는 GPU가 제공하는 높은 수준의 병렬 처리를 위해 특별히 설계된 다른 알고리즘인<a href="https://arxiv.org/pdf/2308.15136">CAGRA[</a><a href="https://arxiv.org/pdf/2308.15136"></a><a href="https://arxiv.org/pdf/2308.15136"><em>CUDA</em></a> <a href="https://arxiv.org/pdf/2308.15136"></a><a href="https://arxiv.org/pdf/2308.15136"><em>ANN</em></a> <a href="https://arxiv.org/pdf/2308.15136"></a><a href="https://arxiv.org/pdf/2308.15136"></a><a href="https://arxiv.org/pdf/2308.15136">GRAph] 를 사용합니다.</a></p><p>CAGRA에 대한 지원을 추가하는 방법을 살펴보기 전에, Elasticsearch와 Lucene이 "코덱 형식"을 통해 인덱스 데이터에 액세스하는 방법을 살펴보겠습니다. 이는 다음과 같이 구성됩니다.</p><ol><li><p>온디스크 표현입니다,</p></li><li><p>데이터 읽기 및 쓰기를 위한 인터페이스입니다,</p></li><li><p>그리고 Lucene의 세그먼트 기반 아키텍처를 처리하기 위한 기계입니다.</p></li></ol><p>내부적으로 cuVS Java API를 사용하여 GPU에서 인덱싱하고 검색하는 새로운 KNN(k-근접 이웃) <a href="https://lucene.apache.org/core/10_1_0/core/org/apache/lucene/codecs/KnnVectorsFormat.html">벡터 형식을</a> 구현하고 있습니다. 여기에서 이 코덱 유형을 인덱스의 필드 유형에 대한 Elasticsearch의 매핑을 통해 '수직'으로 연결합니다. 따라서 기존 KNN 쿼리는 지원 인덱스가 CAGRA 그래프를 사용하든 HNSW 그래프를 사용하든 관계없이 계속 작동합니다. 물론 여기에는 많은 세부 사항이 포함되어 있으며, 향후 블로그에서 다룰 예정입니다. 다음은 GPU 가속 Elasticsearch의 하이레벨 아키텍처입니다.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb6197b631a34f8b6/6a170b0da6c2b9e60ce7970b/be6b7356c03df4dee7230625c2c9af3b019f93be-756x510.png" alt="" /><p>이 새로운 코덱 형식의 기본값은 CAGRA입니다. 그러나 CPU에서 검색할 수 있도록 CAGRA 그래프를 HNSW 그래프로 변환하는 기능도 지원합니다.</p><h2>GPU에서 색인 및 검색: 몇 가지 "핵심" 결정 내리기</h2><p>인덱싱과 검색을 분리하는 Elasticsearch 서버리스의 상태 저장소 없는 <a href="https://www.elastic.co/kr/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch">아키텍처를</a> 통해 이제 책임 소재가 명확하게 구분됩니다. 이러한 각각의 독립적인 책임을 수행할 수 있는 최고의 하드웨어 프로필을 선택합니다.</p><p>사용자들은 크게 두 가지 배포 전략을 고려할 것으로 예상됩니다:</p><ol><li><p>GPU에서 색인 및 검색: 색인하는 동안 CAGRA 그래프를 작성하여 검색 중에 사용하면 지연 시간이 매우 짧은 검색이 필요한 경우에 이상적입니다.</p></li><li><p>GPU에서 색인하고 CPU에서 검색합니다: 인덱싱하는 동안 CAGRA 그래프를 작성하고 이를 HNSW 그래프로 변환합니다. HNSW 그래프는 인덱스에 저장되며, 나중에 CPU에서 검색에 사용할 수 있습니다.</p></li></ol><p>이러한 유연성은 다양한 배포 모델을 제공하여 비용과 성능 간의 절충점을 제공합니다. 예를 들어, 인덱싱 서비스에서는 검색을 위해 저전력 CPU를 사용하면서 그래프를 적시에 효율적으로 작성하고 병합하기 위해 GPU를 사용할 수 있습니다.</p><h2>따라서 Elasticsearch에서 GPU 가속 벡터 검색을 위한 계획은 다음과 같습니다.</h2><p>비용과 성능의 균형을 맞출 수 있는 다양한 옵션을 제공하여 사용자에게 배포 전략으로 성능 향상과 유연성을 제공할 수 있기를 기대합니다. 이 작업이 자세히 소개된 <a href="https://www.nvidia.com/gtc/session-catalog/?tab.catalogallsessionstab=16566177511100015Kus&amp;search=Lucene#/">NVIDIA GTC 2025 세션은</a> 다음과 같습니다.</p><p>환상적인 협업을 보여준 NVIDIA와 SearchScale의 엔지니어링 팀에 감사의 말씀을 전합니다. 다음 블로그에서는 구현 세부 사항과 성능 분석에 대해 더 자세히 살펴보겠습니다. 호기심 모자를 꽉 잡아주세요 🎩!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/gpu-accelerated-vector-search-elasticsearch-nvidia</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/gpu-accelerated-vector-search-elasticsearch-nvidia</guid>
    <category><![CDATA[벡터 데이터베이스]]></category>
    <dc:creator><![CDATA[Chris Hegarty,Hemant Malik]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt298e839e708ca11c/6a170b0fb339d560c2769fc2/38bc0377a6adce7eae0099f61902fdbbe644eb4a-1440x960.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[루씬 래핑 2024]]></title>
    <description><![CDATA[2024년은 아파치 루씬에게 또 다른 중요한 해입니다. 이 블로그에서는 주요 내용을 살펴봅니다.]]></description>
    <content:encoded><![CDATA[<p>2024년에는 3년 만의 대규모 업데이트를 비롯해 흥미로운 개선 사항과 새로운 기능으로 가득 찬 수많은 릴리스가 출시되는 등 Apache Lucene이 상당한 활동을 보였습니다. 주요 특징 몇 가지를 살펴보겠습니다.</p><h2>Lucene &amp; 커뮤니티</h2><p>프로젝트는 그것을 지원하는 커뮤니티만큼만 강력합니다. 20년이 넘는 개발 기간에도 불구하고 Lucene 프로젝트는 열정적이고 적극적인 기여자 덕분에 여전히 활기차고 번창하고 있습니다.</p><p>2024년에 Lucene 프로젝트는 98명의 고유 기여자로부터 2,000개 이상의 커밋과 800개에 가까운 풀 리퀘스트를 받았습니다. 새로운 커미터와 PMC 멤버가 프로젝트에 합류하여 성공을 이끄는 등 기여자의 수가 계속 증가하고 있습니다.</p><h2>루씬 10</h2><p>2024년에는 거의 3년 만에 처음으로 185명의 고유 기여자로부터 2,000개 이상의 커밋을 받은 Lucene 10이 출시되었습니다. 루씬이 따르는 개발 모델에서는 마이너 릴리스에서 많은 개선 사항과 기능을 제공할 수 있지만, 메이저 릴리스에서는 더 큰 기능과 현대화를 제공할 수 있는 기회를 제공합니다. 예를 들어, Lucene 10에는 최소 Java 21이 필요합니다. 최소 Java 버전을 상향 조정하면 Lucene이 최신 Java가 제공하는 개선 사항을 계속 활용할 수 있습니다.</p><p>Lucene 10의 주요 초점은 실행되는 하드웨어를 더 잘 활용하는 것입니다. 주요 특징 몇 가지를 간단히 살펴보겠습니다:</p><ul><li><p><strong>검색 병렬성 향상</strong> - 검색 실행은 이미 세그먼트 전체에서 병렬화되어 있지만, 이제 더 나아가 세그먼트 내에서 병렬화합니다. 이렇게 하면 온디스크 표현과 실행 성능이 분리되어 단일 세그먼트도 최신 시스템에서 코어 수의 이점을 누릴 수 있습니다.</p></li><li><p><strong>향상된 I/O 병렬</strong> 처리 - Lucene이 사용하는 간단한 동기식 I/O 모델이 프리페치 단계로 개선되었습니다. 이렇게 하면 호출 스레드를 차단하지 않으면서도 가까운 시일 내에 인덱스 파일의 영역이 필요하다는 것을 OS에 알립니다.</p></li><li><p><strong>희소 인덱싱으로 CPU 및 스토리지 효율성 향상</strong> - Lucene 10은 다른 데이터 저장소에서 기본 키 인덱싱 또는 영역 인덱싱이라고도 하는 희소 인덱싱을 지원합니다.</p></li></ul><p>루씬 10에 대한 자세한 내용은 루씬 10에 대한 전용 <a href="https://www.elastic.co/search-labs/blog/apache-lucene-10-release-highlights">문서를</a> 참조하세요.</p><h2>루씬 연구 및 혁신</h2><p>2024년에 루씬은 특히 머신 러닝 통합, 벡터 검색, 대규모 데이터 세트 최적화 분야에서 연구와 혁신이 급증했으며, 10개의 개별 <a href="https://scholar.google.com/scholar?as_ylo=2024&amp;q=lucene&amp;hl=en&amp;as_sdt=0,5">연구 논문과 출판물을</a> 참조할 수 있습니다. 주요 연구 분야 및 개발 사항에는 다음이 포함됩니다:</p><ul><li><p><strong>벡터 검색 및 임베딩 지원</strong> - Lucene은 벡터 기반 검색을 위한 강력하고 확장 가능한 솔루션을 제공하여 대규모의 의미론적 검색을 가능하게 합니다. 사용자는 Lucene의 강력한 색인 및 검색 인프라를 활용하여 기존 텍스트 검색의 장점과 최신 벡터 검색의 고급 기능을 결합함으로써 광범위한 검색 및 정보 검색 작업을 위한 포괄적인 솔루션으로 활용할 수 있습니다.</p></li><li><p><strong>하이브리드 검색 모델</strong> - 루씬은 기존의 키워드 기반 검색과 최신 벡터 기반 검색을 결합하는 하이브리드 검색 기법도 연구했습니다. 용어 기반 인덱스와 고밀도 벡터 표현을 병합함으로써 Lucene은 보다 정확하고 맥락에 맞는 검색 결과를 제공하여 기존 검색 엔진의 정확성과 시맨틱 검색의 유연성 사이의 간극을 메울 수 있습니다.</p></li></ul><p>2024년에 진행 중인 연구 노력은 특히 AI, 시맨틱 검색 및 빅 데이터 애플리케이션의 맥락에서 최신 검색 기술의 진화하는 요구 사항에 대한 Lucene의 적응력을 입증합니다. 이 프로젝트는 기존 검색 사용 사례와 최첨단 검색 사용 사례 모두를 위한 강력하고 유연하며 효율적인 플랫폼으로 계속 성장하고 있습니다.</p><h2>2024년 Lucene 릴리즈</h2><p>정확한 반영은 아니지만, 엄청난 양의 릴리스가 커뮤니티의 지속적인 헌신과 에너지를 강조합니다. 이번 업데이트에는 벡터 검색 성능 및 효율성의 대폭적인 개선, 매드바이즈 지원, 포스팅 목록 디코딩 최적화, SIMD를 통한 속도 향상 등이 포함됩니다.</p><p>전체 릴리스 목록은 다음과 같습니다:</p><ul><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-1010-available">10.1.0</a> (2024-12-20)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-9121-available">9.12.1</a> (2024-12-13)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-1000-available">10.0.0</a> (2024-10-14)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-9120-available">9.12.0</a> (2024-09-28)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-8114-available">8.11.4</a> (2024-09-24)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-9111-available">9.11.1</a> (2024-06-27)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-9110-available">9.11.0</a> (2024-06-06)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-9100-available">9.10.0</a> (2024-02-20)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-8113-available">8.11.3</a> (2024-02-08)</p></li><li><p><a href="https://lucene.apache.org/core/corenews.html#apache-lucenetm-992-available">9.9.2</a> (2024-01-29)</p></li></ul><p>자세한 정보 및 릴리스 노트는 <a href="https://projects.apache.org/project.html?lucene-core">Lucene Core</a> 페이지에서 확인할 수 있습니다. 또한 이에 상응하는 <a href="https://projects.apache.org/project.html?lucene-pylucene">PyLucene</a> 릴리스도 있습니다.</p><h2>마무리</h2><p>Lucene이 성숙해짐에 따라 헌신적이고 활기찬 커뮤니티 덕분에 계속 발전하고 있습니다. 지금까지 살펴본 바와 같이 2024년은 놀랍도록 생산적인 한 해였으며, 이제 2025년에 가져올 흥미로운 발전을 기대해봅니다.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/apache-lucene-wrapped-2024</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/apache-lucene-wrapped-2024</guid>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Chris Hegarty]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt901211870015335c/6a17ddf6a292998b08d02b93/29a02c89b3c5adb37a5f900de634ff09cb63fdd9-1792x1024.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>