メインコンテンツまでスキップ
メインコンテンツまでスキップ

Laion-400M dataset

Laion-400Mデータセットは、英語の画像キャプションを持つ4億の画像を含んでいます。現在、Laionはさらに大きなデータセットを提供していますが、取り扱いは似ています。

このデータセットには、画像のURL、画像および画像キャプションの埋め込み、画像と画像キャプションの間の類似度スコア、さらに画像の幅/高さ、ライセンス、NSFWフラグなどのメタデータが含まれています。このデータセットを使用して、ClickHouseでの近似最近傍検索を示すことができます。

データ準備

埋め込みとメタデータは、生のデータの別々のファイルに保存されています。データ準備ステップでは、データをダウンロードし、ファイルをマージし、CSVに変換してClickHouseにインポートします。以下のdownload.shスクリプトを使用できます:

スクリプトprocess.pyは以下のように定義されています:

データ準備パイプラインを開始するには、次のコマンドを実行します:

データセットは410のファイルに分割されており、各ファイルには約100万行が含まれています。データの小さなサブセットで作業したい場合は、リミットを調整するだけです。例:seq 0 9 | ...

(上記のPythonスクリプトは非常に遅い(1ファイルあたり約2〜10分)、多くのメモリを消費し(ファイルごとに41 GB)、結果として生成されるCSVファイルは大きい(各10 GB)ため、注意が必要です。十分なRAMがある場合は、並列性を高めるために-P1の数値を増やします。これでもまだ遅い場合は、より良いインジェスト手順を考案することを検討してください。たとえば、.npyファイルをparquetに変換し、その後に他の処理をClickHouseで行うことが考えられます。)

テーブルの作成

インデックスなしでテーブルを作成するには、次のコマンドを実行します:

CSVファイルをClickHouseにインポートするには、次のコマンドを実行します:

ANNインデックスなしでのブルートフォースANN検索の実行

ブルートフォース近似最近傍検索を実行するには、次のコマンドを実行します:

targetは512要素の配列で、クライアントパラメータです。そのような配列を取得する便利な方法は、この記事の終わりに紹介します。今のところ、ランダムな猫の画像の埋め込みをtargetとして実行できます。

結果

ANNインデックスを使用したANNの実行

ANNインデックスを持つ新しいテーブルを作成し、既存のテーブルからデータを挿入します:

デフォルトでは、AnnoyインデックスはL2距離をメトリックとして使用します。インデックスの作成や検索のためのさらなる調整方法については、Annoyインデックスのドキュメントに記載されています。さて、同じクエリで再度確認してみましょう:

結果

スピードは大幅に向上しましたが、精度が低下しました。これは、ANNインデックスが近似検索結果のみを提供するためです。例では類似画像埋め込みを検索しましたが、ポジティブな画像キャプション埋め込みをも検索することが可能です。

UDFを使用した埋め込みの作成

通常、新しい画像や新しい画像キャプションのために埋め込みを作成し、データ内の類似画像/画像キャプションペアを検索したいと思います。UDFを使用して、クライアントを離れることなくtargetベクターを作成できます。データを作成し、検索のために新しい埋め込みを作成する際は、同じモデルを使用することが重要です。以下のスクリプトは、データセットの基盤となるViT-B/32モデルを利用しています。

テキスト埋め込み

最初に、次のPythonスクリプトをClickHouseデータパスのuser_scripts/ディレクトリに保存し、実行可能にします(chmod +x encode_text.py)。

encode_text.py:

次に、ClickHouseサーバ構成ファイルの<user_defined_executable_functions_config>/path/to/*_function.xml</user_defined_executable_functions_config>で参照される場所にencode_text_function.xmlを作成します。

これで、単純に次のように使用できます:

最初の実行は遅くなりますが、モデルをロードするためですが、繰り返しの実行は速くなります。その後、出力をSET param_target=...にコピーして、簡単にクエリを記述できます。

画像埋め込み

画像埋め込みも同様に作成できますが、画像キャプションテキストの代わりにローカル画像へのパスをPythonスクリプトに提供します。

encode_image.py

encode_image_function.xml

次に、このクエリを実行します: