検索
ニュース

Spotifyが近傍検索ライブラリ「Voyager」をオープンソースで公開 その実力とは最近傍検索ライブラリ「Annoy」の後継

Spotifyは公式ブログで、同社が開発した新しい近傍検索ライブラリーVoyagerについて紹介した。Voyagerは実稼働環境でのSpotify推奨の最近傍検索ライブラリとしてAnnoyの後継となることを目的としているもので、GitHubで公開されている。

Share
Tweet
LINE
Hatena

 音楽配信サービス事業者のSpotifyは2023年10月25日、公式ブログで同社が開発した新しい近傍検索ライブラリー「Voyager」について紹介した。

 2010年代からおよそ10年間に渡って、Spotifyはパーソナライゼーション、レコメンデーションおよび検索システムを強化するために最近傍検索テクノロジーを使用してきたという。

 これらのテクノロジーを使用することで、エンジニアや研究者は、低速で高価な機械学習アルゴリズムをリアルタイムで実行することなく、類似のアイテム(類似のトラック、アーティスト、アルバムなど)を推奨するシステムを構築できる。

 Spotifyは2013年に、最近傍検索ライブラリである「Annoy」を構築し、オープンソース化した。それ以来、Annoyの機能を多数強化してきたという。

進化する最近傍エコシステム

 過去10年間で、最近傍検索の最先端技術は大幅に進歩した。Spotifyによると、最近傍検索では技術的な進歩に加え、エコシステムの急速な成長が見られる。

 最近傍技術を比較する際に主要な要素となるのが精度と速度の2つだが、Spotifyのエンジニアにとっては他の要素も重要だという。

柔軟性

 最近傍検索の各アプリケーションには、異なるニーズと制約がある。検索アルゴリズムのあらゆる部分をカスタマイズできることは、最大のパフォーマンス、最大のスループット、最小の遅延、最小のコストの間でバランスを取ることができるため、非常に便利だ。

ステートレス性

 Spotifyのシステムの多くはメモリ内で最近傍検索を実行しており、Kubernetes経由でステートレスデプロイメントを可能にし、ステートフルデータベースクラスタを維持するためのメンテナンスとコストの負担をほぼ完全に排除する。

言語サポート

 Spotifyのバックエンドおよびデータエンジニアは、パフォーマンスを最大化するために、JavaやScalaなどのJVMベースの言語で運用システムをデプロイすることを好むが、多くの機械学習ユースケースはPythonで動作する。新しい最近傍テクノロジーの多くは、Python以外の言語のサポートが不十分であるか、多くの言語に対応するクライアントライブラリを提供しているものの、展開と同時にデータベースプロセスを実行する必要がある。

コスト

 最先端の最近傍アルゴリズムは信じられないほど高速で、非常に高品質の出力を生成する。しかし、そのためには多くの場合、大量のメモリが必要になる。ほとんどの使用例では、コストを大幅に削減するために、極度の精度が犠牲になる可能性がある。

Voyager

 2018年以来、Spotify内のチームの多くでhnswlibと呼ばれる最近傍検索用のオープンソースライブラリの実験が行われた。このライブラリはAnnoyに比べて10倍の速度向上を実現し、高次元の埋め込みを必要とするユースケースにスケールアップする際に役立ったという。

 しかし、これを大規模に展開するにつれて、hnswlibに加えるべき変更が多数判明した。これらの変更には、コードベースの保守を容易にするためのディスク上のデータ形式とAPIの変更および大幅なアーキテクチャの変更が含まれている。このような変更により下位互換性が失われるが、ソフトウェアパッケージに多くのユーザーがいる場合、これを行うのは非常に困難だという。

 この問題を回避するために、Spotifyは完全に新しいライブラリであるVoyagerを構築した。

 Voyagerは、hnswlibに基づく新しい最近傍検索ライブラリだ。実稼働環境でのSpotify推奨の最近傍検索ライブラリとしてAnnoyの後継となることを目的としている。Voyagerは、HNSW(Hierarchical Navigable Small World)アルゴリズムによって向上した精度と速度を、十分にテスト、文書化されたJavaとPythonの両方で本番環境に対応したバインディングを兼ね備えている。

Voyagerは何を提供するか

 SpotifyによるとVoyagerの理念は、誰でもPythonまたはJavaで最近傍インデックス検索をアプリケーションに追加できる、堅牢(けんろう)で安定した実稼働対応ライブラリを提供することだ。特徴は下記の通り。

  • Annoyの10倍以上の速度(同じ再現率の場合)、または最大50%高い精度(同じ速度の場合)を持つ
  • Annoyに比べメモリ使用量が最大4倍削減(E4M3 8bit浮動小数点による)
  • 完全にマルチスレッド化されたインデックスの作成とクエリ
  • 同一のインタフェースを備えた完全なPythonおよびJavaバインディングサポート
  • 破損検出機能を備えた実稼働対応のフォールトトレラントなインデックスファイル
  • Google Cloud Platformと互換性のあるストリームベースのI/O(Google Cloudサービスからのストリームインデックス)
  • 文字列ベースの識別子の組み込みサポート(URIによるクエリ)
  • インデックス作成時のメモリ使用量がhnswlibと比較して16分の1に減少
  • 依存関係のないインストール:PythonのNumPy(任意のバージョン)にのみ、Java依存関係がない
  • 「macOS」「Windows」「Linux」のx86とArm64 CPU両方をサポート
  • PythonおよびJavaのドキュメントが十分ある

 Voyagerは、2022年以来、実稼働トラフィックを提供するためにSpotifyの多くのチームによって使用されている。また、GitHubでオープンソースとして公開されており、誰でも使用可能だ。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る