3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Oracle APEX】ONNXモデルをAutonomous AI Databaseにロードしてマルチモーダル・ベクトル検索を実現する方法

Posted at

はじめに

昨今、マルチモーダル検索(テキスト↔画像の類似度検索)が注目されていますが、実装にはPython環境や推論サーバーの構築が必要でハードルが高いと感じていませんか?

Oracle AI Database 23ai (Autonomous AI Database) を使えば、データベースの中にAIモデル(ONNX)を直接取り込み、SQLだけで推論が可能になります。つまり、APEXなどのローコードツールと組み合わせることで、素早くでAIアプリが開発できます。

今回は、以前の記事「Oracle AI Database 26aiでマルチモーダル検索を実現! ~CLIP ONNXモデルを最速で手に入れる方法~」で作成したCLIPのONNXモデルを、Autonomous AI Database (ADB) 上のAPEXで利用できるようにするための「ONNXモデルのアップロードとロード手順」を解説します。

これができれば、APEXから「テキストで画像を検索」するアプリがすぐに作れるようになります!

ゴール

Autonomous Database (ADB) のAPEXからONNXモデルをロードし、APEXから利用できる状態にする。

前提条件

  • ONNXファイルを持っていること
    こちらに作成手順が載っています。
  • OCIアカウントがあること
  • Autonomous AI Database (Always Freeでも可)を使用
  • APEXワークスペースを利用

参考リンク

Qiita:

ドキュメント

OCIチュートリアル

1. ONNXをオブジェクト・ストレージへアップロード

まずは、作成したONNXファイルをデータベースがアクセスできる場所(OCI Object Storage)に配置します。
参考:OCIチュートリアル - オブジェクト・ストレージを使う

1-1. オブジェクト・ストレージの作成

OCIコンソールからオブジェクト・ストレージへ移動し、バケットを作成します。ここに .onnx ファイルをアップロードします。
image.png
image.png
image.png

バケット設定等はデフォルトで問題ありません。
image.png
image.png

作成したバケットにファイルをアップロードします。
image.png
image.png
image.png

1-2. 事前認証済リクエストの取得

オブジェクトタブに移動し、それぞれのファイルに対して事前認証済リクエストの作成を行います。
まず、画像ベクトル化用のONNXの事前認証済リクエストの作成を行います。
image.png
image.png
image.png

画像をベクトル化するONNXファイル(clip_img.onnx)のURLをコピーします。
image.png
次に、テキストベクトル化用のONNXの事前認証済リクエストの作成を行います。
image.png
image.png

テキストをベクトル化するONNXファイル(clip_img.onnx)のURLをコピーします。
image.png

ここで取得したURLはなくさないようにメモ帳などに張り付けて取っておきましょう。

1-2. 認証情報の準備(APIキー/Auth Token)

データベースからオブジェクトストレージにアクセスするための認証情報を作成します。ユーザー設定からAPIキーまたはAuth Tokenを発行し、OCIDや秘密鍵などを控えておきます。

ポイント
この後、ADB側でクレデンシャルを作成する際に、ここで取得したOCIDやフィンガープリント、秘密鍵の中身を使用します。

画面右上の部分から自分のプロフィールを選択します。
image.png

次に、APIキー > APIキーの追加をクリックします。
image.png
秘密キーをダウンロードします。
image.png
構成ファイルのプレビューの内容を保存しておきます。
image.png

 

オブジェクト・ストレージのURL(text用とimg用で2つ)、構成ファイルのプレビューの内容、秘密キーの内容を全てメモ帳などに張り付けて、すぐに使えるようにしておきます。

2. Autonomous AI Database (ADB) 作成

ベースとなるADBを作成します。26aiを選択します。
参考:ADBインスタンスを作成してみよう

2-1. Autonomous AI Databaseの作成

OCIコンソール画面からAutonomous AI Databaseを選択/作成します。
image.png

image.png

下記の項目を記入していきます。

  • 表示名:分かりやすい名前にします
  • データベース名:分かりやすい名前にします
  • ワークロード・タイプ:トランザクション処理
  • Always Free:無償枠を利用したい場合はONにします。
  • データベース・バージョンの選択:26ai
  • ECPU数:自由(節約のため1を記入)
  • 自動スケーリング:自由(節約のためOFF)
  • ストレージ:自由(節約のため100GB)
  • パスワード:自由

Oracle AI DatabaseでAI機能を存分に活用するために26aiを選択しましょう!

image.png
image.png
image.png
image.png

3. APEXワークスペースの作成と権限付与

3-1. APEXワークスペースの作成

ADB付属のAPEXを利用するためのセットアップを行います。
まず、Autonomous AI Databaseのコンソール画面から
データベース・アクション > すべてのデータベース・アクションの表示を選択し、
開発タブからAPEXをクリックして開きます。
image.png
image.png

先ほど作成したAutonomous AI Databaseの管理用パスワードを記入します。
image.png

image.png

ワークスペースを作成します。

  • ワークスペース名:自由(ここではMULTIMODAL_ADBとしています)
  • ワークスペース・ユーザー名:自由(ここではMULTIMODAL_USERとしています)
  • ワークスペース・パスワード:自由
    image.png
    image.png

サインアウトをして、ワークスペースにログインします。
image.png

3-2. 必要な権限の付与

SQLワークショップ > SQLコマンドを指定
image.png

画面右上のスキーマを確認します。
私の場合、「WKSP_MULTIMODALADB」となっています。後程この情報を使います。
image.png

OCIコンソール画面のAutonomous AI Databaseの画面から
データベース・アクション > すべてのデータベース・アクションの表示
を選択します。

image.png

開発タブからSQLを選択します。

image.png

Database Actions (SQL) を開き、ADMINユーザーで実行してください。
下記のSQLでWKSP_MULTIMODALADBに対して権限付与を行います。
これは先ほど確認したSQLワークショップの画面右上に記載されていたスキーマ名となります。

GRANT RESOURCE to WKSP_MULTIMODALADB;
GRANT DB_DEVELOPER_ROLE to WKSP_MULTIMODALADB;
GRANT EXECUTE ON DBMS_CLOUD TO WKSP_MULTIMODALADB;
GRANT EXECUTE ON DBMS_VECTOR TO WKSP_MULTIMODALADB;
GRANT EXECUTE ON DBMS_VECTOR_CHAIN TO WKSP_MULTIMODALADB;
GRANT CREATE ANY DIRECTORY TO WKSP_MULTIMODALADB;
ALTER USER WKSP_MULTIMODALADB QUOTA UNLIMITED ON DATA;

3-3. クレデンシャルの作成

APEXの設定画面に戻り、SQLワークショップ > SQLコマンドに移動します。
image.png

下記のSQLを実行します。
この情報は1-2. で取得したメモ帳に記載した情報をあてはめます。

BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OBJ_STORE_CRED',
        user_ocid       => 'OCIユーザーのOCID',
        tenancy_ocid    => 'OCIテナンシーのOCID',
        private_key     => '秘密鍵',
        fingerprint     => 'フィンガープリント'
    );
END;
/

image.png

4. ONNXのアップロードとデータベースへのロード

いよいよONNXモデルをデータベース内に取り込みます。

4-1. ディレクトリの作成

ファイルを一時保存するディレクトリ・オブジェクトを作成します。
参考ドキュメント

CREATE DIRECTORY staging AS 'stage';

image.png

4-2. オブジェクトストレージからファイルをGET

DBMS_CLOUD.GET_OBJECT を使い、先ほどアップロードしたONNXファイルをDBサーバー上のディレクトリ(stage)にコピーします。

BEGIN
  DBMS_CLOUD.GET_OBJECT(
    credential_name => 'OBJ_STORE_CRED',
    object_uri => 'オブジェクトストレージ上のclip_imgのONNXモデルファイルのURL',
    directory_name => 'staging',
    file_name => 'clip_img.onnx'
  );
  DBMS_CLOUD.GET_OBJECT(
    credential_name => 'OBJ_STORE_CRED',
    object_uri => 'オブジェクトストレージ上のclip_textのONNXモデルファイルのURL',
    directory_name => 'staging',
    file_name => 'clip_txt.onnx'
  );
END;
/

image.png

確認:

SELECT OBJECT_NAME, CREATED FROM TABLE(DBMS_CLOUD.LIST_FILES('staging'));

image.png

4-3. ONNXモデルをIn-Databaseモデルとしてロード

DBMS_VECTOR.LOAD_ONNX_MODEL を実行すると、DBがONNXを解析し、SQLから使える関数として登録してくれます。

BEGIN
  DBMS_VECTOR.LOAD_ONNX_MODEL(
    'staging',
    'clip_txt.onnx',
    'CLIP_TXT_MODEL',
    json('{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}')
  );
  DBMS_VECTOR.LOAD_ONNX_MODEL(
    'staging',
    'clip_img.onnx',
    'CLIP_IMG_MODEL',
    json('{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}')
  );
END;
/

image.png

正しくロードされたか確認してみましょう。

SELECT MODEL_NAME, MINING_FUNCTION,
    ALGORITHM, ALGORITHM_TYPE, round(MODEL_SIZE/1024/1024) MB FROM user_mining_models;

image.png

CLIP_TXT_MODEL と CLIP_IMG_MODEL が表示されていれば成功です!

5. APEXでの確認(ベクトル・プロバイダへの登録)

最後に、APEXの「ベクトル・プロバイダ」から、ロードしたモデルが見えているか確認します。

APEXワークスペースにログイン

アプリケーション・ビルダー > ワークスペース・ユーティリティ > すべてのワークスペース・ユーティリティ

image.png

ベクトル・プロバイダを選択

image.png

ここで「作成」をクリックし、プロバイダ・タイプでデータベースONNXモデルを選択すると、先ほどロードした CLIP_IMG_MODEL や CLIP_TXT_MODEL が選択肢として現れるはずです!

image.png

image.png

image.png

image.png

image.png

これで、APEXから、これらのモデルを使ってベクトル化ができるようになりました。

画像用のベクトル化モデル(CLIP_IMG_MODEL)とテキスト用のベクトル化モデル(CLIP_IMG_MODEL)によって、画像もテキストも同じベクトル空間上にベクトル化されます。
これによってテキスト↔テキスト、画像↔画像、画像↔テキストの類似度検索が可能になります。

おわりに

今回は、ONNXモデルをOracle AI Autonomous Databaseにロードし、APEXで利用可能にするまでの手順を紹介しました。

これができれば、あとはAPEX側で

  1. 画像をアップロードする
  2. CLIP_IMG_MODEL でベクトル化して保存
  3. 検索ワードを CLIP_TXT_MODEL でベクトル化して検索

というフローを組むだけで、マルチモーダル検索アプリの完成です。
外部APIを叩く必要がないので、セキュリティ的にも堅牢で、レスポンスも高速です。

ぜひ、データベース内のAIで遊んでみてください!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?