🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI

HomeBlogsMilvusの始め方

Milvusの始め方

  • Engineering
January 17, 2025
Ruben Winastwan

How to get started with Milvus Milvusの始め方

最終更新 2025年1月

大規模言語モデル(LLM)の進化とデータ量の増加により、データベースのような大量の情報を保存するための柔軟でスケーラブルなインフラが必要とされています。しかし、従来のデータベースは表形式や構造化されたデータを保存するように設計されており、高度なLLMや情報検索アルゴリズムの能力を活用するために一般的に有用な情報は、テキスト、画像、動画、音声などの非構造化データである。

ベクターデータベースは、非構造化データ用に特別に設計されたデータベースシステムです。ベクトルデータベースでは、大量の非構造化データを保存できるだけでなく、ベクトル検索も可能です。ベクターデータベースは、Inverted File Index (IVFFlat)やHierarchical Navigable Small World(HNSW)といった高度なインデックス作成方法を持ち、高速で効率的なベクター検索や情報検索処理を行うことができます。

Milvusはオープンソースのベクターデータベースであり、ベクターデータベースが提供できる有益な機能をすべて活用することができます。この投稿で取り上げる内容は以下の通りです:

Milvusとは?

Milvusは オープンソースのベクトルデータベースであり、大量の非構造化データを保存し、高速かつ効率的なベクトル検索を行うことができます。Milvusは、推薦システム、パーソナライズされたチャットボット、異常検知、画像検索、自然言語処理、検索拡張世代RAG)など、多くの一般的なGenAIアプリケーションに非常に有用です。

Milvusをベクトルデータベースとして使用することで得られる利点はいくつかあります:

  • Milvusには複数の導入オプションがあり、ユースケースや構築するアプリケーションの規模に応じて選択することができます。

  • Milvusは、FLAT、IVFFlat、HNSW、SCANNのようなインメモリオプション、メモリ効率のための量子化バリアント、大規模データセット用のオンディスクDANN、メモリ効率の高い高速検索用のGPU_CAGRA、GPU_IVF_FLAT、GPU_IVF_PQのようなGPU最適化インデックスなど、さまざまなデータやパフォーマンスニーズに対応する多様なインデックス作成方法をサポートしています。

  • また、Milvusはハイブリッド検索も提供しており、ベクトル検索操作中に密な埋め込み、疎な埋め込み、メタデータフィルタリングを組み合わせて使用することができ、より正確な検索結果につながります。さらに、Milvus 2.5では全文検索とベクトル検索のハイブリッド検索に対応し、検索精度がさらに向上しました。

  • MilvusはZilliz Cloudを通じてクラウド上で利用することができ、論理クラスタ、ストリーミングデータと履歴データの分離、階層型ストレージ、オートスケール、マルチテナントのホットコールド分離という4つの先進機能により、運用コストとベクトル検索速度を最適化することができます。

Milvusをベクターデータベースとして使用する場合、3つの異なる導入オプションを選択することができ、それぞれに長所と利点があります。それぞれの長所と利点について次のセクションで説明します。

Milvusの展開オプション

Milvusを使い始めるにあたり、Milvus Lite、Milvus Standalone、Milvus Distributed、Zilliz Cloud(マネージドMilvus)の4つのデプロイオプションから選択することができる。各展開オプションは、データのサイズ、アプリケーションの目的、アプリケーションの規模など、ユースケースの様々なシナリオに合わせて設計されています。

Milvus Lite

Milvus LiteはMilvusの軽量版であり、私たちにとって最も簡単に始めることができる方法です。次のセクションでは、Milvus Liteを実際に動かす方法を見ていく。その後、Milvusのコア機能のほとんどをベクターデータベースとして実行することができる。

Milvus Liteは、迅速なプロトタイピングや学習目的に最適で、複雑な設定なしにJupyterノートブックで実行できる。Milvusは、ベクターデータベースのストレージとして、最大100万個のベクター埋め込みを保存することができます。Milvus Liteは、その軽量な機能とストレージ容量から、プライベートドキュメントの検索エンジンやデバイス上でのオブジェクト検出など、エッジデバイスでの作業に最適なデプロイメントオプションです。

Milvusスタンドアロン

Milvus Standaloneは、Dockerイメージにパックされたシングルマシンサーバのデプロイメントです。そのため、DockerにMilvusをインストールし、Dockerコンテナを起動するだけで利用を開始できる。また、Milvus Standaloneの詳細な実装については次のセクションで説明する。

Milvus Standaloneは、最大10Mのベクトル埋め込みを保存できるため、小規模から中規模のアプリケーションの構築とプロダクション化に最適です。さらに、Milvus Standaloneは、プライマリバックアップモードによる高可用性を提供し、プロダクション対応アプリケーションでの使用に高い信頼性をもたらします。

また、Milvus StandaloneとMilvus Liteは同じクライアントサイドAPIを共有しているため、例えばMilvus LiteでMilvusの機能を学習し、プロトタイピングを行った後にMilvus Standaloneを使用することも可能です。

Milvusディストリビューテッド

Milvus Distributedは、クラウドベースのアーキテクチャを活用したデプロイメントオプションであり、データの取り込みと取得が別々に処理されるため、拡張性が高く効率的なアプリケーションを実現することができます。

Milvus Distributedを実行するには、通常、コンテナを複数のマシンや環境で実行できるようにKubernetesクラスタを使用する必要がある。Kubernetesクラスタを適用することで、Milvus Distributedのスケーラビリティと柔軟性が確保され、需要やワークロードに応じて割り当てられたリソースをカスタマイズできる。これはまた、1つの部分に障害が発生しても、他の部分が引き継ぐことができ、システム全体が中断されないことを保証することを意味する。

Milvus Distributedは、最大数百億のベクトル埋め込みデータを扱うことができ、データが大きすぎて単一のサーバーマシンに保存できないようなユースケース向けに特別に設計されている。そのため、この導入オプションは、大規模なユーザーベースにサービスを提供するエンタープライズクライアントに最適です。

図:Milvusの各配備オプションのベクター埋め込みストレージ機能。

この記事では、Milvus LiteとMilvus Standaloneの両方の導入方法を紹介する。ただし、Milvus Distributedは設定が複雑です。一旦Milvus Distributedをセットアップすれば、コレクションの作成、データの取り込み、ベクトル検索の実行などのコードや論理的なプロセスは、クライアント側のAPIを共有しているため、Milvus LiteやMilvus Standaloneと同様である。

上記3つの導入オプションに加え、マネージドMilvus onZilliz Cloudも手間をかけずにお試しいただけます。Zilliz Cloudについては後述します。

Milvus Liteを始めるにあたって

PythonでMilvus Liteを導入するには、Pymilvusというライブラリをpipでインポートします。Pymilvusをインストールする前に、お使いの環境が以下の要件を満たしていることを確認してください:

  • Ubuntu >= 20.04 (x86_64 and arm64)

  • MacOS >= 11.0 (Apple Silicon M1/M2およびx86_64)

  • Python 3.7以降

これらの要件を満たした後、以下のコマンドでMilvus Liteとデモに必要な依存関係をインストールすることができる:

!pip install -U pymilvus
!pip install "pymilvus[model]"
  • !pip install -U pymilvus:このコマンドはMilvusのPython SDKであるpymilvus ライブラリをインストールまたはアップグレードします。Milvus LiteはPyMilvusにバンドルされているため、この1行のコードだけでMilvus Liteをインストールすることができます。

  • !pip install "pymilvus[model]":このコマンドは、Milvusにあらかじめ統合されている高度な機能と追加ツールを追加します。これには、Hugging Face Transformersのような機械学習モデル、Jina AIエンベッディングモデル、リランキングモデルなどが含まれます。

以下はMilvus Liteを使った手順です:

  1. 埋め込みモデルを使って、テキストデータを埋め込み表現に変換する。

  2. Milvusデータベースにスキーマを作成し、テキストデータと埋め込み表現を格納する。

  3. スキーマにデータを格納し、インデックスを作成する。

  4. 格納されたデータに対して簡単なベクトル検索を実行する。

図:ベクトル検索のワークフロー

テキストデータをベクトル埋め込み表現に変換するために、SentenceTransformersの埋め込みモデル'all-MiniLM-L6-v2'を使用する。この埋め込みモデルは、テキストを384次元のベクトル埋め込みに変換します。このモデルを読み込み、テキストデータを変換し、すべてをまとめてみましょう。

from pymilvus import model

docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
    model_name='all-MiniLM-L6-v2', 
    device='cpu' 
)

vectors  = sentence_transformer_ef.encode_documents(docs)
data = [ {"id": i, "vector": vectors[i], "text": docs[i]} for i in range(len(vectors)) ]

次に、上記のデータをMilvusに格納するためのスキーマを作成します。上にあるように、データは3つのフィールドから構成されています:ID、ベクトル、テキストです。そこで、この3つのフィールドを持つスキーマを作成します。

from pymilvus import MilvusClient, DataType, db, connections

schema = MilvusClient.create_schema(
    auto_id=False,
    enable_dynamic_field=True,
)

# Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=384)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=512)

Milvus Liteを使えば、上記で定義したスキーマに基づいて、特定のデータベース上にコレクションを作成し、コレクションにデータを挿入したり、インデックスを作成したりすることが、わずか数行のコードで簡単にできます。

client = MilvusClient("./milvus_demo.db")

index_params = client.prepare_index_params()

#  Add indexes
index_params.add_index(
    field_name="vector", 
    index_type="AUTOINDEX",
    metric_type="COSINE"
)

# Create collection
client.create_collection(
    collection_name="demo_collection",
    schema=schema,
    index_params=index_params
)

# Insert data into collection
res = client.insert(
    collection_name="demo_collection",
    data=data
)

上のコードでは、"milvus_demo "という名前のMilvusデータベース内に "demo_collection "というコレクションを作成しています。次に、作成した "demo_collection "にすべてのデータをインデックスします。

これでデータベース内にデータができたので、任意のクエリに対してベクトル検索を行うことができます。例えば、「アラン・チューリングとは誰か」というクエリがあるとしよう。以下のステップを実行することで、クエリに対する最も適切な答えを得ることができる:

  1. データベース内のデータを埋め込みに変換するのに使ったのと同じ埋め込みモデルを用いて、クエリをベクトル埋め込みに変換する。

  2. コサイン類似度やユークリッド距離などのメトリックスを用いて、クエリの埋め込みとデータベース内の各エントリの埋め込みとの類似度を計算する。

  3. 最も類似したエントリを、クエリに対する適切な回答として取り出す。

以下は、Milvusを使った上記のステップの実装です:

query = ["Who is Alan Turing"]
query_embedding = sentence_transformer_ef.encode_queries(query)

# Load collection
client.load_collection(
    collection_name="demo_collection"
)

# Vector search
res = client.search(
    collection_name="demo_collection",
    data=query_embedding,
    limit=1,
    output_fields=["text"],
)
print(res)
"""
Output:
data: ["[{'id': 1, 'distance': 0.7199002504348755, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.'}}]"] 
"""

以上です!Milvusが提供する他の機能、例えば、データベースの管理、コレクションの挿入と削除、適切なインデックス作成方法の選択、メタデータフィルタリングやハイブリッド検索を用いたより高度なベクトル検索の実行などについては、Milvusのドキュメントをご参照ください。

Milvus Standaloneを始めるにあたって

Milvus Standaloneは、すべてがDockerコンテナにまとめられているデプロイオプションです。そのため、Milvus Standaloneを始めるには、DockerにMilvusをインストールし、Dockerコンテナを起動する必要がある。

Milvus Standaloneをインストールする前に、ハードウェアとソフトウェアの両方がこのページに記載されている要件を満たしていることを確認してください。また、Dockerがインストールされていることを確認してください。Dockerのインストールについては、こちらのページをご参照ください。

システムが要件を満たし、Dockerがインストールできたら、以下のコマンドでDockerにMilvusをインストールします:

# Download the installation script
$ curl -sfL <https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh> -o standalone_embed.sh

# Start the Docker container
$ bash standalone_embed.sh start

上記のコードでは、Dockerコンテナも起動しており、起動すると以下のような出力が得られます:

図:Dockerコンテナ起動成功後のメッセージ。

上記のインストール・スクリプト "standalone_embed.sh "を実行すると、ポート19530で "milvus "という名前のDockerコンテナが起動する。そのため、接続を作成する際にこのポートを指定することで、新しいデータベースを作成したり、milvusデータベースに関連するすべてのものにアクセスしたりすることができる。

例えば、上記のMilvus Liteで行ったような "milvus_demo "というデータベースを作成したいとします。以下のようにすればよい:

conn = connections.connect(host="127.0.0.1", port=19530)
database = db.create_database("milvus_demo")

client = MilvusClient(
    uri="<http://localhost:19530>",
    token="root:Milvus",
    db_name="milvus_demo"
)

次に、Milvus Web UIにアクセスすることで、新しく作成した "milvus_demo "というデータベースが本当にMilvusインスタンスに存在するかどうかを確認することができます。Milvus Web UIは、その名の通り、Milvusが提供するグラフィカルユーザインタフェースで、コンポーネントの統計やメトリクスの確認、データベース、コレクション、設定の一覧や詳細の確認などを行うことができます。Milvus Web UIは、上記のDockerコンテナを起動した後、http://127.0.0.1:9091/webui/。

上記リンクにアクセスすると、このようなランディングページが表示される:

Collections "タブの下に、"milvus_demo "データベースが正常に作成されていることがわかります。ご覧のように、このWeb UIで、コレクションのリスト、コンフィギュレーション、実行したクエリなど、他のことも確認できます。

これで、上記のMilvus Liteのセクションで見たのと全く同じようにすべてを実行することができる。milvus_demo "データベース内に "demo_collection "という3つのフィールドからなるコレクションを作成します。そして、このコレクションにデータを挿入する。

index_params = client.prepare_index_params()

#  Add indexes
index_params.add_index(
    field_name="vector", 
    index_type="AUTOINDEX",
    metric_type="COSINE"
)

# Create collection
client.create_collection(
    collection_name="demo_collection",
    schema=schema,
    index_params=index_params
)

# Insert data into collection
res = client.insert(
    collection_name="demo_collection",
    data=data
)

ベクトル検索を行うコードもMilvus Liteと同じだ:

query = ["Who is Alan Turing"]
query_embedding = sentence_transformer_ef.encode_queries(query)

# Load collection
client.load_collection(
    collection_name="demo_collection"
)

# Vector search
res = client.search(
    collection_name="demo_collection",
    data=query_embedding,
    limit=1,
    output_fields=["text"],
)
print(res)
"""
Output:
data: ["[{'id': 1, 'distance': 0.7199004292488098, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.'}}]"] 
"""

Dockerを使う以外にも、Docker Compose(Linux用)やDocker Desktop(Windows用)を使ってMilvus Standaloneを使うこともできます。

Milvusインスタンスを使わなくなったら、以下のコマンドでMilvus Standaloneを停止することができる:

$ bash standalone_embed.sh stop

Milvusのフルマネージド化

Milvusを使い始める別の方法として、Zilliz Cloudのネイティブクラウドベースのインフラを利用する方法があります。

Zilliz Cloudは、お客様のAIアプリケーションをサポートするための専用環境とリソースを備えた専用クラスタを提供します。Milvus上に構築されたクラウドベースのデータベースであるため、ローカルインフラのセットアップや管理は不要です。また、Zilliz Cloudは、ベクトルストレージと計算の分離、S3のような一般的なオブジェクトストレージシステムへのデータバックアップ、ベクトル検索・取得操作を高速化するデータキャッシングなど、より高度な機能も提供している。

しかし、クラウドベースのサービスを検討する際に考慮しなければならないのは、運用コストである。ほとんどの場合、データの取り込みやベクトル検索のアクティビティがなく、クラスタがアイドル状態であっても支払いが必要だ。アプリケーションの運用コストとパフォーマンスをさらに最適化したいのであれば、Zilliz Cloud Serverlessは優れた選択肢となるだろう。

図:Zilliz Cloud Serverlessを利用する主なメリット。

Zilliz Cloud Serverlessは、AWS、Azure、GCPといった主要なクラウドプロバイダーで利用できる。従量課金、つまりクラスターを利用したときだけ料金を支払うといった特徴がある。

また、Zilliz Cloud Serverlessは、論理クラスタ、自動スケーリング、階層型ストレージ、ストリーミングデータと履歴データの分解、ホットコールドのデータ分離などの先進的なテクノロジーを実装している。これらの機能により、Zilliz Cloud ServerlessはインメモリMilvusと比較して、最大50倍のコスト削減と約10倍のベクトル検索処理の高速化を実現している。

図:階層型ストレージとホットコールド・データ分離の説明図。

Zilliz Cloud Serverlessを始めたい方は、こちらのページをご覧ください。

結論

Milvusは、非構造化データを管理し、最新のAIアプリケーションで高速かつ効率的なベクトル検索処理を実行するという課題を解決するために設計された、汎用的で強力なベクトルデータベースとして際立っている。迅速なプロトタイピングのためのMilvus Lite、小規模から中規模のアプリケーションのためのMilvus Standalone、エンタープライズレベルのスケーラビリティのためのMilvus Distributedといったデプロイメントオプションにより、どのようなプロジェクトの規模や複雑さにも柔軟に対応できる。

さらに、Zilliz Cloud Serverlessは、Milvusの機能をクラウドに拡張し、ローカルのインフラを不要にする費用対効果の高い従量課金モデルを提供します。Zilliz Cloud Serverlessは、階層型ストレージや自動スケーリングなどの高度な機能により、コストを最適化しながらベクトル検索業務の高速化を実現します。

Like the article? Spread the word

続けて読む