$30 off During Our Annual Pro Sale. View Details »

8.0からのkNNはどう変わったのか / How kNN search changed in the Elasticsearch 8.0

Kazuma Arimura
February 16, 2022

8.0からのkNNはどう変わったのか / How kNN search changed in the Elasticsearch 8.0

Kazuma Arimura

February 16, 2022
Tweet

More Decks by Kazuma Arimura

Other Decks in Technology

Transcript

  1. 8.0からのkNNはどう変わったの

    第46回 Elasticsearch勉強会
    Kazuma Arimura
    February 16th, 2022

    View Slide

  2. Kazuma Arimura (pakio)
    株式会社メルカリ
    Software Engineer US@Tokyo
    好きなこと : カレー/Elasticsearch/日本語
    苦手なこと : 英語
    @pakio / @paki0o

    View Slide

  3.   
    US事業について

    Got stuff you don’t use?
    Sell or buy almost anything from home.
    メルカリは、ミッションである「新たな価値を生みだす世界的なマーケットプレイスを創る」ことを目指し、創業翌年から海外展開を推
    し進めています。2014年9月にUS事業を開始し、現地の嗜好やマーケットの特徴に合わせたブランディングやUI・UXの改良、配送
    網の構築等に取り組んでいます。巨大かつ多様性に富む人口基盤を有するUSでの成功が、メルカリのミッションを実現する上で重
    要なマイルストーンであると認識しており、注力しています。

    3
    Your Marketplace
    Factbookより引用


    View Slide

  4. Contents
    ● これまでのおさらい
    ● 主な変更点について
    ● ベンチマーク
    ● まとめ

    View Slide

  5. はじめに
    今回取り上げる機能は8.0リリース時点でTechnical Previewとなっています
    !

    View Slide

  6. おさらい

    View Slide

  7. おさらい - これまでのkNNについて
    これまでサポートされていた方法
    1. マッピング時にdense_vector typeを指定し、ベクトルをそのまま保存
    2. script_scoreでquery_vectorを指定し、クエリとドキュメントの類似度を計算

    View Slide

  8. おさらい - これまでのkNNについて
    これまでサポートされていた方法
    1. マッピング時にdense_vector typeを指定し、ベクトルをそのまま保存
    2. script_scoreでquery_vectorを指定し、クエリとドキュメントの類似度を計算
    全探索をするため計算量が候補数に比例

    View Slide

  9. 主な変更点について

    View Slide

  10. 主な変更点について
    HNSW AlgorithmベースのApproximate kNNのサポート
    kNN Search APIの追加
    1
    2

    View Slide

  11. 主な変更点について - Approximate kNNのサポート
    dense_vector type指定時のオプションが追加
    ● index : trueにすると、kNN Search APIで利用可能に
    ● similarity : ベクトルの類似度計算の際に用いる尺度
    ○ l2_norm, dot_product, cosine をサポート
    ● index_option : ベクトルのindexing algorithmの設定詳細

    View Slide

  12. 主な変更点について - Approximate kNNのサポート
    dense_vector type指定時のオプションが追加
    ● index : trueにすると、kNN Search APIで利用可能に
    ● similarity : ベクトルの類似度計算の際に用いる尺度
    ○ l2_norm, dot_product, cosine をサポート
    ● index_option : ベクトルのindexing algorithmの設定詳細
    前処理を加えることでkNNの計算対象範囲を狭め高速化

    View Slide

  13. 主な変更点について - Approximate kNNのサポート
    kNNとANNの違い
    kNN : クエリが与えられた時、全候補に対しベクトル間の類似度を
    正確に計算
    ANN : クエリが与えられた時、近似的に最も近いベクトルを探す
    ANNで用いられるアルゴリズム例 [1]
    ● Locality Sensitive Hashing
    ● Tree / Space Partitioning
    ● Graph traversal
    ○ 今回採用されたHNSWもこの一種

    View Slide

  14. 主な変更点について - Approximate kNNのサポート
    Hierarchical Navigable Small Worlds (HNSW)
    画像引用元 : [2]

    View Slide

  15. 主な変更点について - kNN Search APIの追加
    script_scoreを利用したベクトル検索

    View Slide

  16. 主な変更点について - kNN Search APIの追加
    kNN Search APIによるベクトル検索

    View Slide

  17. ベンチマーク

    View Slide

  18. ベンチマーク
    データセット
    ● ann-benchmark の Fashion-MNIST (784次元)
    https://github.com/erikbern/ann-benchmarks
    https://github.com/zalandoresearch/fashion-mnist
    環境:
    ● 環境 : EC2 c5a.2xlarge × 1 node
    ● バージョン: Elasticsearch 8.0
    引用元 : [3]

    View Slide

  19. ベンチマーク : 1. インデキシング性能
    比較条件
    ● # docs : 60,000
    ● docs/req : 100
    ● 並列数 : 4
    ● 比較対象
    ○ index=falseのdense_vector
    ○ index=trueのdense_vector

    View Slide

  20. ベンチマーク : 1. インデキシング性能
    比較結果
    60,000件程度では差異なし
    件数が増えると影響あるかも?
    What's new in 8.0 # New kNN search API
    “In exchange for slower indexing and imperfect
    accuracy, the new kNN search API lets you run
    approximate kNN searches on larger datasets and at
    faster speeds.”

    View Slide

  21. ベンチマーク : 2. 検索性能
    比較条件
    ● 対象インデックス : 1で作成したもの(784次元 × 60,000件)
    ● Top K : 10
    ● ANNの際のnum_candidates : 100
    ○ 各shard内で何件候補を選出するか

    View Slide

  22. ベンチマーク : 2. 検索性能
    比較結果
    精度は落ちるが、速度面では圧倒的に有利
    間違って出たケース
    kNN ANN
    正確性 100% 99.7%
    50%ile 60 ms 9 ms
    90%ile 60 ms 10 ms

    View Slide

  23. ベンチマーク : 2. 検索性能 ドキュメント数N倍
    kNN ANN
    50%ile (original) 60 ms 9 ms
    90%ile (original) 60 ms 10 ms
    50%ile (# doc × 2) 119 ms 10 ms
    90%ile (# doc × 2) 119 ms 11 ms
    50%ile (# doc × 3) 178 ms 11 ms
    90%ile (# doc × 3) 179 ms 12 ms
    kNN(script)はドキュメント数に比例、ANNは穏やか

    View Slide

  24. まとめ

    View Slide

  25. まとめ
    👍メリット:
    ● 多少の検索精度を引き換えに、検索が高速に
    ● (scriptと比較して)直感的なAPI
    ● 類似度の尺度が事前に定義可能、誤用の防止
    👎デメリット:
    ● インデキシング速度の低下 (?)
    ● メモリ・データサイズの増加
    ● Query DSLとの併用不可

    View Slide

  26. We are hiring!!
    ● Software Engineer, Search - US App
    https://apply.workable.com/mercari/j/7C11672DDA/
    ● Engineering Manager, Search - US App
    https://apply.workable.com/mercari/j/1CDC7D5CEF/

    View Slide

  27. Thanks!

    View Slide

  28. Appendix

    View Slide

  29. 参考文献
    ● [1] : [CVPR20 Tutorial] Billion-scale Approximate Nearest Neighbor Search
    https://speakerdeck.com/matsui_528/cvpr20-tutorial-billion-scale-approximate-nearest-neighbor-search
    ● [2] : Hierarchical Navigable Small Worlds (HNSW)
    https://www.pinecone.io/learn/hnsw/
    ● [3] : Fashion-MNIST
    https://github.com/zalandoresearch/fashion-mnist
    ● [4] : kNN Search API | Elasticsearch
    https://www.elastic.co/guide/en/elasticsearch/reference/8.0/knn-search-api.html

    View Slide