Traffine I/O

日本語

2023-05-05

Pineconeで適切なポッドのタイプとサイズを選ぶ方法

はじめに

Pineconeのデプロイを計画する際に、適切なポッドのタイプとサイズを選ぶことは重要なステップです。この記事では、ポッドの選択に関する基本的な理解を提供します。

Pineconeにおけるポッド

Pineconeのポッドの概念、異なるタイプ、サイズ、およびそれらがサービスのパフォーマンスに与える影響について説明します。

ポッド、ポッドのタイプ、およびポッドのサイズ

Pineconeにおいて、ポッドとはPineconeサービスを実行するために割り当てられた事前設定されたハードウェアユニットです。サービス内の各インデックスは、1つまたは複数のポッドで実行されます。デプロイメントで使用するポッドの数は、直接的にストレージ容量、レイテンシ、およびスループットに影響を与えます。ポッドの数が多いほど、一般的にはストレージ容量が増加し、レイテンシが低下し、スループットが向上します。異なるポッドのサイズも利用可能であり、サービスのパフォーマンスを最適化するための柔軟性を提供します。

特定のポッドタイプを使用してインデックスが作成された場合、その後ポッドタイプを変更することはできないことに注意してください。

ポッドのタイプ

Pinecone内には、さまざまなタイプのポッドがあり、それぞれ独自の利点と使用ケースがあります。主なポッドのタイプは次のとおりです。

s1ポッド

s1ポッドは、大容量のストレージと、若干の高いクエリ遅延に比べて低い総コストを提供する、ストレージ重視のポッドです。ストレージ容量が非常に大きく、レイテンシ要件が中程度または緩和された場合に最適です。

s1ポッドには、768次元の約5Mのベクトルを格納する十分な容量があります。

p1ポッド

p1ポッドは、非常に低いクエリ遅延を提供するパフォーマンス重視のポッドです。ただし、s1ポッドと比較してポッドあたりのベクトル数は少なくなります。p1ポッドは、レイテンシ要件が厳しいアプリケーション(100ms未満)に最適です。各p1ポッドは、768次元のベクトル約100M個を快適に格納することができます。

p2ポッド

p2ポッドは、高いクエリスループットと低いレイテンシのバランスが取れた組み合わせを提供します。特に128次元未満のベクトルや、topK値が50未満のクエリに適しています。p2ポッドは、レプリカごとに1秒あたり最大200クエリ(QPS)をサポートし、クエリの応答時間は10ms未満です。各p2ポッドは、768次元のベクトル約100M個を格納することができますが、この容量はベクトルの次元数によって異なる場合があります。ただし、p2ポッドのデータ取り込み速度はp1ポッドよりも遅くなります。なお、p2ポッドは疎なベクトル値をサポートしていないことに注意してください。

ポッドのサイズ

ポッドのパフォーマンスは、タイプだけでなくサイズにも依存します。各ポッドタイプは、次の4つのポッドサイズをサポートしています。

  • x1
  • x2
  • x4
  • x8

インデックスのストレージと計算容量は、サイズのステップごとに2倍になります。デフォルトのポッドサイズはx1ですが、インデックスの作成後にポッドのサイズを増やすこともできます。

適切なPineconeインデックスの選択

Pineconeインデックスの設定方法を決定する際の主な考慮事項は以下の5つあります。

  • ベクトルの数
  • ベクトルの次元数
  • 各ベクトルのメタデータのサイズ
  • QPS(秒あたりのクエリ数)のスループット
  • インデックスされたメタデータのカーディナリティ

これらの考慮事項は、インデックスのサイズ、ポッドのタイプ、およびレプリケーション戦略に関する要件を伴います。

ベクトルの数

サイズの決定において最初でもっとも重要な考慮事項は、処理するベクトルの数です。おおよその目安として、単一のp1ポッドは約100M個のベクトルを格納できますが、s1ポッドは最大で約500M個のベクトルを格納できます。ただし、この容量は次元数やメタデータなどの他の要素によって影響を受ける可能性があるため、注意が必要です。

ベクトルの次元数

上記の容量の見積もりは、各ベクトルが768次元であると想定しています。個々のユースケースに応じて、ベクトルの次元数は異なる場合があり、それに応じて必要なスペースも増減する可能性があります。

1つのベクトルの各次元は、メモリとストレージごとに4バイトを消費します。したがって、768次元の1Mのベクトルを想定すると、メタデータやその他のオーバーヘッドを考慮しない場合、約3GBのストレージが必要です。以下の表には、特定のインデックスに必要な一般的なポッドサイズと数の例が示されています。

ポッドのタイプ 次元数 推定されるポッドあたりの最大ベクトル数
p1 512 1,250,000
768 1,000,000
1024 675,000
p2 512 1,250,000
768 1,100,000
1024 1,000,000
s1 512 8,000,000
768 5,000,000
1024 4,000,000

秒あたりのクエリ数(QPS)

クエリ速度は、QPS(秒あたりのクエリ数)で測定されます。QPSは、ポッドのタイプ、レプリカの数、およびクエリのtop_k値の組み合わせによって決まります。異なるポッドのタイプはさまざまなユースケースに最適化されているため、ポッドのタイプはQPSに大きな影響を与えます。

一般的な目安として、単一のp1ポッドは、768次元の1Mのベクトルを持ち、レプリカがない場合に約20のQPSを処理できます。メタデータのサイズ、ベクトルの数、ベクトルの次元数、および検索のtop_k値によって、より高いまたは低い速度を得ることができます。

ポッドのタイプ top_k 10 top_k 250 top_k 1000
p1 30 25 20
p2 150 50 20
s1 10 10 10

上記の表のQPSの値は、1Mのベクトルと768次元を基準としています。

QPSを増やすためのもっとも簡単な方法は、レプリカを追加することです。各レプリカはおおよそ同じQPSによってスループットを増加させるため、p1ポッドを使用して150のQPSを目指す場合は、プライマリポッドとレプリカ5つを使用することになります。また、アプリケーション内でスレッド処理やマルチプロセス処理を使用することも重要です。シーケンシャルに単一のクエリを発行すると、基礎となるレイテンシからの遅延が発生するためです。PineconeのgRPCクライアントを使用すると、アップサートのスループットを増やすこともできます。

メタデータのカーディナリティとサイズ

インデックスを計画する際の最後の考慮事項は、メタデータのカーディナリティとサイズです。数百万のベクトルを扱う場合には、ストレージ要件がわずかであっても、メタデータの増加によるストレージ要件は実際に影響を及ぼす可能性があります。特に数億または数十億のベクトルを処理するような大規模なアプリケーションでは、ストレージ要件の増加は重要な要素となります。

ユニークなユーザーIDを各ベクトルに格納するような高カーディナリティのインデックスでは、メモリ要件が大幅に増加することがあります。その結果、ポッドあたりのベクトル数が減少する場合があります。さらに、ベクトルごとのメタデータのサイズが大きい場合、インデックスのストレージ要件が増加します。

アプリケーションとサイズの例

これまでに説明したガイドラインと原則が、実際のシナリオでどのように適用されるかを説明します。公式ドキュメントにある2つの例のアプリケーションを参照し、適切なタイプ、サイズ、およびポッドの数を選択する方法を示します。

例1: ニュース記事のセマンティックサーチ

ニュース記事のセマンティックサーチのデータセットを使用すると仮定します。このデータセットでは、204,135のベクトルがあり、各ベクトルは300の次元を利用しています。次元数は一般的な768次元の基準以下です。単一のp1.x1ポッドでこのアプリケーションを実行することができます。ポッドの容量使用率は低いですが、意味検索アプリケーションにおける低レイテンシと高速なクエリ応答の需要を考慮すると、p1ポッドタイプがもっとも適切な選択です。

例2: 顔認識

より複雑なケースとして、顔認識アプリケーションを考えてみます。セキュアな銀行アプリで顔認識を使用して顧客を識別するアプリケーションを構築しているとします。顔認識に使用するベクトルは最低128次元で動作しますが、金融セキュリティのために精度を高めるために2048次元のベクトルを選択することにします。さらに、100Mの顧客に対応する予定です。

必要なポッドを推定するために、まずは通常の設定で1Mのベクトルと768次元のp1.x1ポッドに収まるケースを考えます。この基準をもとに、必要なポッドの推定を行います。

100M / 1M = 100 base p1 pods
2048 / 768 = 2.667 vector ratio
2.667 * 100 = 267

この計算により、267個のp1.x1ポッドが必要となります。しかし、レイテンシよりもストレージ容量を重視するs1ポッドに切り替えることで、この数を減らすことができます。s1.x1ポッドはp1.x1ポッドの5倍のストレージを持っているため、新しい計算は以下のとおりです。

267 / 5 = 54

したがって、推定では、銀行の顧客ごとに非常に高次元のデータを格納するために54個のs1.x1ポッドが必要です。

参考

https://docs.pinecone.io/docs/choosing-index-type-and-size
https://docs.pinecone.io/docs/indexes

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!