はじめに
情報検索・検索エンジン Advent Calendar 2019 24日目の記事です。
担当は@yktm31です。
本記事ではMilvusという大規模ベクトル類似度検索エンジンについて紹介したいと思います。
一般的な検索は所謂、単語を使って検索するような方式ですが、近しいベクトルの計算によって
画像から画像を検索する、テキストから画像を検索するようなことにも応用ができます。
Milvusはそのような用途に適切なライブラリです。
zillizという上海のベンチャー企業が開発していて、2019年11月5日にOSS化されました。
たまたまGitHubのTrendingで見つけ興味を持ったのですが、なんにせよ公開から日が浅く、情報が少ないです。
2019年12月現在、手がかりとなる有力なソースは主に3つです。
1. 公式webサイト
2. GitHubリポジトリ
3. medium
本記事では、そんなMilvusについてわかったことまとめていきたいと思います。
Milvus
ベクトル類似度検索
高速ベクトル検索OSSとしては、既にいくつか有名どころがあります。
それらと比べたときに、Milvusがどういったポジションにいるのか見ていきます。
まずは、既存の有名どころを簡単に整理しておきます。
annoy
・Spotifyが開発
・Approximate Nearest Neighbors Oh Yeahの略
・プロセス間でインデックスを共有可能
・日本語参考記事
では、Milvusはどういった特徴を持っているのでしょうか。
公式ドキュメントの中で、faiss・SPTAGとMilvusの比較がされています。
こちらのブログを要約すると、Milvusが目指しているのは「音声・画像/映像・テキストといった、非構造化データをシンプルかつスケーラブルに扱える検索エンジン」ということになりそうです。
企業が持つデータが多様化するなか、検索エンジンとしても多様なデータを扱えるようにならないとね、
ということだと思いました。
機能としても、単に計算ライブラリとしてではなく、デプロイ・運用・監視を見据えたアプリケーションという側面が強くでていると思います。
Milvusの特徴
Milvusの目指すところが掴めたところで、次にMilvusの特徴について具体的に見ていきます。
公式が出しているKey Featuresの中からいくつかピックアップしてみます。
・Heterogeneous computing
つまるところ、様々なコンピュータアーキテクチャ上で動作すると言うことみたいです。
現状では、 x86/GPU/ARMに対応しています。
ゆくゆくは、TPU や ASICにも対応する予定があるそうです。
・Multiple indexes
quantization, tree系, graph探索系に対応しています。
データ規模や、ハードウェアスペックに合わせて選択することができます。
・Visualized monitor
Prometheus/Grafanaを利用した、パフォーマンス監視・アラート通知に対応しているそうです。
ドキュメントに、立ち上げ方の手順が載っています。
Milvusの使い所
実際にアプリケーション・プロダクトとしてどう使えるのか、気になるところかと思います。
結論から言うと、まだ実運用を想定した事例について情報を集めることは難しそうです。
サンプルとしては、実装面ではサンプルコードが、利用面では三つのユースケースが提供されています。
紹介されているユースケースは、以下の三つです。
①パーソナルレコメンド
②マルチモーダル検索
③重複動画の削除
ただ、あくまでシナリオとしての紹介で詳細については述べられていません。
この辺は実際に触ってみて、知見を蓄積・共有していくことが必要なのだと思いました。
Milvusの動かし方
最後に、Milvusを実際に動かしてみます。
具体的には、Dockerコンテナを立ち上げ、Python用のSDKでサンプルコードを動かします。
実行環境は以下の通りです。
OS | Ubuntu18.04 |
GPU | 1080ti |
python | 3.7.5 |
docker | 19.03 |
nvidia-driver | 418 |
まず、MilvusのDockerコンテナを立てます。
公式からイメージが提供されているので、簡単に立ち上げることができます。
$ docker pull milvusdb/milvus:latest # Milvusの設定ファイルをダウンロードする。 $ mkdir -p /home/$USER/milvus/conf $ cd home/$USER/milvus/conf $ wget https://raw.githubusercontent.com/milvus-io/docs/master/assets/config/server_config.yaml $ wget https://raw.githubusercontent.com/milvus-io/docs/master/assets/config/log_config.conf # Milvusを起動する。 $ docker run -d --name milvus_gpu --gpus all -e "TZ=Asia/Tokyo" -p 19530:19530 -p 8080:8080 -v /home/$USER/milvus/db:/var/lib/milvus/db -v /home/$USER/milvus/conf:/var/lib/milvus/conf -v /home/$USER/milvus/logs:/var/lib/milvus/logs milvusdb/milvus:latest
次に、Python SDKをインストールし、サンプルコードを実行します。
# Milvus Python SDKのインストール $ pip3 install pymilvus==0.2.6 # サンプルコードのダウンロード $ wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/example.py # サンプルコードの実行 $ python3 example.py
正しく動作すれば、最後に Query result is correct. と出ます。
example.pyの中身としては、以下のような処理が走っています。
①Milvusコンテナに接続
②テーブル作成
③16次元 10000ベクトルデータを投入
④Index (IVFLAT)の作成
⑤サーチを実施
⑥サーチ結果の確認
⑦テーブル削除とコネクション切断
ソースにはコメントも入っていて、Milvusの基本的なオペレーションを理解することができました。
まとめ
本記事では、Milvusという公開されて間もないベクトル検索エンジンについて、公開情報を基にまとめて見ました。
しかし、実際の実装や構築周りについては、サンプルを動かした程度までなので、
手元で動かしてみた結果を別の記事としてまとめたいと思います。
また今回、類似度検索で使われる詳細なアルゴリズムに関しては触れてきませんでした。
そのあたりについては、松井勇佑さんの資料がわかりやすかったので、参考として挙げさせていただきます。
・近似最近傍探索の最前線
・billion-scaleの近似最近傍探索
まだまだ事例も情報も少ないMilvusですが、今後どうなっていくのか引継ぎウォッチングしたいと思います。
次は実装を積んで、利用感などをまとめていきます。
最後までありがとうございました。
それでは、よいお年を!
Acroquest Technologyでは、キャリア採用を行っています。
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- Elasticsearch等を使ったデータ収集/分析/可視化
- マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。データを活用し社会を進化させたい機械学習エンジニアWanted!! - Acroquest Technology株式会社のエンジニアの求人 - Wantedlywww.wantedly.com