Laion-400M データセット
Laion-400M データセット は、英語の画像キャプション付きの4億枚の画像を含んでいます。現在、Laionはさらに大きなデータセットを提供していますが、これを扱う際の方法は似ています。
このデータセットには、画像のURL、画像と画像キャプションの両方の埋め込み、画像と画像キャプション間の類似度スコア、さらにメタデータ(画像の幅/高さ、ライセンス、NSFWフラグなど)が含まれています。このデータセットを使用して、ClickHouseにおける近似最近傍探索のデモを行います。
データ準備
埋め込みとメタデータは、原データ中の別々のファイルに保存されています。データ準備ステップでは、データをダウンロードし、ファイルをマージし、CSVに変換してClickHouseにインポートします。これには、以下のdownload.sh
スクリプトを使用できます:
スクリプトprocess.py
は以下のように定義されています:
データ準備パイプラインを開始するには、次のコマンドを実行してください:
データセットは410ファイルに分割されており、それぞれのファイルには約100万行が含まれています。データの小さなサブセットで作業したい場合は、制限を調整してください。例:seq 0 9 | ...
。
(上記のPythonスクリプトは非常に遅く(1ファイルあたり約2〜10分)、多くのメモリ(1ファイルあたり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
次に、このクエリを実行します: