Proxima CE は、ベクトル検索と百万 TopK 検索による検索タスクをサポートしています。本記事では、Proxima CE でベクトル検索オフラインタスクを実行する方法と例を紹介します。
前提条件
Proxima CE パッケージをインストールし、入力テーブルを準備しておく必要があります。詳細については、「Proxima CEパッケージのインストール」をご参照ください。
制限事項
テナントレベルのスキーマ構文スイッチが有効になっているプロジェクトでは、ベクトル検索タスクの実行はサポートされていません。実行すると、Schema xxx does not exist のようなエラーが発生します。テナントレベルのスキーマ構文スイッチが有効になっていないプロジェクトで、本記事のコード例を実行してください。
注意事項
-
Volume 権限を既に取得しており、外部ボリュームの作成に成功している場合は、DataWorks または odpscmd で Volume 方式を使用して実行できます。それ以外の場合は、
AKまたはrole_arnを必須の起動パラメータとして入力する必要があります。これにより、Proxima CE タスクがプログラムによる作成と使用を行います。 -
DataWorks で Proxima CE タスクを実行する場合は、[Shared Resource Groups for Scheduling] を使用して [Smoke Testing] を実施する必要があります。詳細については、「スモークテスト」をご参照ください。
入力テーブルへのデータインポート
まず全体の流れをテストしたい場合は、DataWorks の SQL ノードで以下のコマンドを実行し、簡単な小規模データテーブルを生成して、シンプルな検索例を実行できます。
関連するベクトルデータを、作成済みの doc テーブルと query テーブルにインポートする必要があります。
ALTER TABLE doc_table_float_smoke ADD PARTITION(pt='20221111');
INSERT OVERWRITE TABLE doc_table_float_smoke PARTITION (pt='20221111') VALUES
('1.nid','1~1~1~1~1~1~1~1'),
('2.nid','2~2~2~2~2~2~2~2'),
('3.nid','3~3~3~3~3~3~3~3'),
('4.nid','4~4~4~4~4~4~4~4'),
('5.nid','5~5~5~5~5~5~5~5'),
('6.nid','6~6~6~6~6~6~6~6'),
('7.nid','7~7~7~7~7~7~7~7'),
('8.nid','8~8~8~8~8~8~8~8'),
('9.nid','9~9~9~9~9~9~9~9'),
('10.nid','10~10~10~10~10~10~10~10');
ALTER TABLE query_table_float_smoke ADD PARTITION(pt='20221111');
INSERT OVERWRITE TABLE query_table_float_smoke PARTITION (pt='20221111') VALUES
('q1.nid','1~1~1~1~2~2~2~2'),
('q2.nid','4~4~4~4~3~3~3~3'),
('q3.nid','9~9~9~9~5~5~5~5');
実行
DataWorks または odpscmd で実行できます。実際の状況に応じて適切な実行ツールを選択してください。
以下のサンプルコードで使用されているパラメータ設定の詳細については、「リファレンス: Proxima CE パラメータ」をご参照ください。
DataWorks での実行
DataWorks で新しい MaxCompute ODPS MR ノードを作成し、ODPS SQL スクリプトを使用して Proxima CE を実行できます。
-
Volume 方式
--@resource_reference{"<proxima_ce_jar>"} -- アップロードした proxima-ce jar パッケージを参照します。[データ開発] ページで、アップロード済みの JAR パッケージを右クリックし、[リソースの参照] を選択すると、このコメント行が生成されます jar -resources <proxima_ce_jar> -- アップロードした proxima-ce jar パッケージ -classpath <proxima_ce_jar> com.alibaba.proxima2.ce.ProximaCERunner -- classpath で main 関数のエントリクラスを指定 -doc_table doc_table_float_smoke -- 入力 doc テーブル -doc_table_partition 20221111 -- 入力 doc テーブルのパーティション -query_table query_table_float_smoke -- 入力 query テーブル -query_table_partition 20221111 -- 入力 query テーブルのパーティション -output_table output_table_float_smoke -- 出力テーブル -output_table_partition 20221111 -- 出力テーブルのパーティション -data_type float -- ベクトルデータ型 -dimension 8 -- ディメンション -topk 1 -- ベクトル検索の topk -job_mode train:build:seek:recall -- 検索タスクモードを指定します。デフォルトは train:build:seek で、recall を追加すると今回の検索の再現率を計算できます -external_volume_name <ext_volume> -- ユーザーが作成した OSS 上の Volume。対応する OSS ディレクトリも作成しておく必要があります。作成されていない場合、実行は失敗します -owner_id <oid> -- ユーザーが自身を識別するために提供する一意の ID ; -- セミコロンを忘れないでください。これは ODPS SQL の終了を示す記号です上記のコードを実行する際は、実際の状況に応じて以下のパラメータを置き換える必要があります。
パラメータ名
説明
proxima_ce_jar
アップロード済みの Proxima CE インストールパッケージ名 (例:proxima-ce-aliyun-1.0.1.jar)。詳細については、「Proxima CEパッケージのインストール」をご参照ください。
ext_volume
作成済みの外部ボリューム名。外部ボリュームの作成方法については、「外部ボリュームの操作」をご参照ください。
oid
数字で構成されるユーザーの一意の識別子。長さは 32 桁以内を推奨します (例:123456)。Alibaba Cloud アカウント ID の使用を推奨します。
-
role_arn 方式
--@resource_reference{"<proxima_ce_jar>"} -- アップロードした proxima-ce jar パッケージを参照します。[データ開発] ページで、アップロード済みの JAR パッケージを右クリックし、[リソースの参照] を選択すると、このコメント行が生成されます jar -resources <proxima_ce_jar> -- アップロードした proxima-ce jar パッケージ -classpath <proxima_ce_jar> com.alibaba.proxima2.ce.ProximaCERunner -- classpath で main 関数のエントリクラスを指定 -doc_table doc_table_float_smoke -- 入力 doc テーブル -doc_table_partition 20221111 -- 入力 doc テーブルのパーティション -query_table query_table_float_smoke -- 入力 query テーブル -query_table_partition 20221111 -- 入力 query テーブルのパーティション -output_table output_table_float_smoke -- 出力テーブル -output_table_partition 20221111 -- 出力テーブルのパーティション -data_type float -- ベクトルデータ型 -dimension 8 -- ディメンション -topk 1 -- ベクトル検索の topk -job_mode train:build:seek:recall -- 検索タスクモードを指定します。デフォルトは train:build:seek で、recall を追加すると今回の検索の再現率を計算できます -oss_role_arn <rolearn> -- ユーザーが指定する、OSS にアクセス可能な Alibaba Cloud アカウントの role_arn (形式: acs:ram::1234xxx5678:role/xxx-role) -oss_endpoint <endpoint> -- ターゲットリージョンのエンドポイント -oss_bucket <bucket> -- 作成済みの OSS バケット -owner_id <oid> -- ユーザーが自身を識別するために提供する一意の ID ; -- セミコロンを忘れないでください。これは ODPS SQL の終了を示す記号です上記のコードを実行する際は、実際の状況に応じて以下のパラメータを置き換える必要があります。
パラメータ名
説明
proxima_ce_jar
アップロード済みの Proxima CE インストールパッケージ名 (例:proxima-ce-aliyun-1.0.1.jar)。詳細については、「Proxima CEパッケージのインストール」をご参照ください。
rolearn
RAM ロールの ARN 情報 (例:
acs:ram::1234xxx5678:role/xxx-role)RAM コンソールにログインし、左側メニューにある アイデンティティ ドロップダウンリストの ロール ページで取得できます。
endpoint
MaxCompute プロジェクトがあるリージョンの OSS 内部ネットワークエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。
bucket
MaxCompute プロジェクトと同じリージョンにある OSS バケット名。バケット名の確認方法については、「バケットのリスト表示」をご参照ください。
oid
数字で構成されるユーザーの一意の識別子。長さは 32 桁以内を推奨します (例:123456)。Alibaba Cloud アカウント ID の使用を推奨します。
odpscmd での実行
odpscmd を使用して実行する場合は、MaxCompute クライアント (odpscmd) で以下のスクリプトを実行できます。
-
Volume 方式
jar -resources <proxima_ce_jar> -classpath <proxima_ce_jar_path> com.alibaba.proxima2.ce.ProximaCERunner -doc_table doc_table_float_smoke -doc_table_partition 20221111 -query_table query_table_float_smoke -query_table_partition 20221111 -output_table output_table_float_smoke -output_table_partition 20221111 -data_type float -dimension 8 -topk 1 -job_mode train:build:seek:recall -external_volume_name <ext_volume> -owner_id <oid> ;上記のコードを実行する際は、実際の状況に応じて以下のパラメータを置き換える必要があります。
パラメータ名
説明
proxima_ce_jar
アップロード済みの Proxima CE インストールパッケージ名 (例:proxima-ce-aliyun-1.0.1.jar)。詳細については、「Proxima CEパッケージのインストール」をご参照ください。
proxima_ce_jar_path
Proxima CE の JAR パッケージが配置されているローカルパス。ここでは JAR パッケージ名を直接使用しており、実行スクリプトと同じディレクトリに配置されていることを示します。
ext_volume
作成済みの外部ボリューム名。外部ボリュームの作成方法については、「外部ボリュームの操作」をご参照ください。
oid
数字で構成されるユーザーの一意の識別子。長さは 32 桁以内を推奨します (例:123456)。Alibaba Cloud アカウント ID の使用を推奨します。
-
role_arn 方式
jar -resources <proxima_ce_jar> -classpath <proxima_ce_jar_path> com.alibaba.proxima2.ce.ProximaCERunner -doc_table doc_table_float_smoke -doc_table_partition 20221111 -query_table query_table_float_smoke -query_table_partition 20221111 -output_table output_table_float_smoke -output_table_partition 20221111 -data_type float -dimension 8 -topk 1 -job_mode train:build:seek:recall -oss_role_arn <rolearn> -oss_endpoint <endpoint> -oss_bucket <bucket> -owner_id <oid> ;上記のコードを実行する際は、実際の状況に応じて以下のパラメータを置き換える必要があります。
パラメータ名
説明
proxima_ce_jar
アップロード済みの Proxima CE インストールパッケージ名 (例:proxima-ce-aliyun-1.0.1.jar)。詳細については、「Proxima CEパッケージのインストール」をご参照ください。
proxima_ce_jar_path
Proxima CE の JAR パッケージが配置されているローカルパス。ここでは JAR パッケージ名を直接使用しており、実行スクリプトと同じディレクトリに配置されていることを示します。
rolearn
RAM ロールの ARN 情報 (例:
acs:ram::1234xxx5678:role/xxx-role)RAM コンソールにログインし、左側メニューにある アイデンティティ ドロップダウンリストの ロール ページで取得できます。
endpoint
MaxCompute プロジェクトがあるリージョンの OSS 内部ネットワークエンドポイント。詳細については、「リージョンとエンドポイント」をご参照ください。
bucket
MaxCompute プロジェクトと同じリージョンにある OSS バケット名。バケット名の確認方法については、「バケットのリスト表示」をご参照ください。
oid
数字で構成されるユーザーの一意の識別子。長さは 32 桁以内を推奨します (例:123456)。Alibaba Cloud アカウント ID の使用を推奨します。
実行結果
-
標準出力結果の例
ベクトル検索 データ型: 4、ディメンション: 8、検索方式: HNSW、計算方法: SquaredEuclidean、構築モード: train:build:seek:recall doc テーブル情報 テーブル名: doc_table_float_smoke、パーティション: 20221111、doc数: 10、ベクトル区切り文字: ~ query テーブル情報 テーブル名: query_table_float_smoke、パーティション: 20221111、query数: 3、ベクトル区切り文字: ~ 出力テーブル情報 テーブル名: output_table_float_smoke、パーティション: 20221111 行列情報 行数: 1、列数: 1、各列のインデックスdoc数: 1000000 Volume インデックスをクリアするか: false 各ワーカーの所要時間 (単位: 秒) : SegmentationWorker: 1 TmpTableWorker: 0 KmeansGraphWorker: 0 BuildJobWorker: 120 SeekJobWorker: 60 TmpResultJoinWorker: 0 RecallWorker: 60 CleanUpWorker: 1 合計所要時間 (単位: 分) : 実際の再現率 Recall@1: 1.0 -
出力テーブルの結果例
+------------+------------+------------+------------+ | pk | knn_result | score | pt | +------------+------------+------------+------------+ | q1.nid | 1.nid | 4.0 | 20221111 | | q2.nid | 3.nid | 4.0 | 20221111 | | q3.nid | 7.nid | 32.0 | 20221111 |
百万TopK検索
Proxima 2.x カーネルのパフォーマンス向上により、Proxima CE は百万レベルの TopK 検索リコール (つまり、百万レベルのベクトルの中から、クエリベクトルと最も類似した上位 K 件の結果を高速に検索すること) をサポートしています。起動パラメータ -topk を直接設定するだけで利用できます。