ONNXモデルをインポートするための代替方法

DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャを使用して、モデルをインポートし、入力名を宣言します。PL/SQLヘルパー・ブロックを使用すると、含まれている例のONNX形式モデルをOracle Databaseにインポートするプロセスが容易になります。

DBMS_DATA_MINING PL/SQLパッケージを使用してONNXモデルをデータベースにインポートするには、次のステップを実行します。
  • dmuserとして接続します。

    CONN dmuser/<password>@<pdbname>;
  • 次のヘルパーPL/SQLブロックを実行します。

    DECLARE
        m_blob BLOB default empty_blob();
        m_src_loc BFILE ;
        BEGIN
        DBMS_LOB.createtemporary (m_blob, FALSE);
        m_src_loc := BFILENAME('DM_DUMP', 'my_embedding_model.onnx');
        DBMS_LOB.fileopen (m_src_loc, DBMS_LOB.file_readonly);
        DBMS_LOB.loadfromfile (m_blob, m_src_loc, DBMS_LOB.getlength (m_src_loc));
        DBMS_LOB.CLOSE(m_src_loc);
        DBMS_DATA_MINING.import_onnx_model ('doc_model', m_blob, JSON('{"function" : "embedding", "embeddingOutput" : "embedding", "input": {"input": ["DATA"]}}'));
        DBMS_LOB.freetemporary (m_blob);
        END;
        /

    このコードでは、BLOBオブジェクトとBFILEロケータを設定し、DM_DUMPディレクトリのmy_embedding_model.onnxファイルを格納するための一時BLOBを作成し、その内容をBLOBに読み取ります。その後、一時BLOBリソースを解放する前に、ファイルをクローズし、そのコンテンツを使用して、ONNXモデルを指定したメタデータとともにデータベースにインポートします。

IMPORT_ONNX_MODELプロシージャのスキーマは、DBMS_DATA_MINING.IMPORT_ONNX_MODEL(model_data, model_name, metadata)です。このプロシージャは、DBMS_DATA_MININGパッケージからIMPORT_ONNX_MODELをロードし、model_nameで指定された名前、m_blobのBLOBコンテンツおよび関連するmetadataを使用して、ONNXモデルをデータベースにインポートします。
  • doc_model: このパラメータは、インポートされたモデルをOracle Databaseに格納するときのユーザー指定の名前です。

  • m_blob: これは、モデルのONNX表現を保持するBLOBのモデル・データです。

  • "function" : "embedding": テキスト埋込みモデルの関数名を示します。

  • "embeddingOutput" : "embedding": 埋込み結果を含む出力変数を指定します。

  • "input": {"input": ["DATA"]}: モデルで予想される入力を記述するJSONオブジェクト("input")を指定します。"input"という名前の入力があり、その値が1つの要素"DATA"を持つ配列である必要があることを指定します。これは、モデルで埋込みを生成するために単一の文字列入力が想定されていることを示します。

または、DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャは、OCIオブジェクト・ストレージから格納およびロードされたONNXファイルを表すBLOB引数を受け入れることもできます。次に、OCIオブジェクト・ストレージに格納されているONNXモデルをロードする例を示します。

DECLARE
  model_source BLOB := NULL;
BEGIN
  -- get BLOB holding onnx model 
  model_source := DBMS_CLOUD.GET_OBJECT(
    credential_name => 'myCredential',
    object_uri => 'https://objectstorage.us-phoenix -1.oraclecloud.com/' ||
      'n/namespace -string/b/bucketname/o/myONNXmodel.onnx'); 
 
  DBMS_DATA_MINING.IMPORT_ONNX_MODEL(
    "myonnxmodel",
    model_source,
    JSON('{ function : "embedding" })
  );
END;
/

このPL/SQLブロックは、model_source変数をBLOB型として初期化することから始まり、最初はNULLに設定されます。次に、DBMS_CLOUD.GET_OBJECTプロシージャを使用して、資格証明(OBJ_STORE_CRED)を指定してOracle Cloud Object StorageからONNXモデルを取得し、モデルのURIを指定します。ONNXモデルは、この場合はbucketnameという名前の特定のバケットに存在し、指定されたURLからアクセスできます。次に、スクリプトはONNXモデルをmodel_source BLOBにロードします。DBMS_DATA_MINING.IMPORT_ONNX_MODELプロシージャは、このモデルをmyonnxmodelとしてOracle Databaseにインポートします。インポート時に、JSONメタデータは、埋込み操作のためにモデルの関数をembeddingとして指定します。

PL/SQLプロシージャについて学習するには、IMPORT_ONNX_MODELプロシージャおよびGET_OBJECTプロシージャおよびファンクションを参照してください。

例: 事前トレーニング済ONNXモデルのOracle Databaseへのインポート

ONNX埋込みのインポートとベクトル埋込みの生成の包括的なステップバイステップの例を次に示します。

conn sys/<password>@pdb as sysdba
grant db_developer_role to dmuser identified by dmuser;
grant create mining model to dmuser;
 
create or replace directory DM_DUMP as '<work directory path>';
grant read on directory dm_dump to dmuser;
grant write on directory dm_dump to dmuser;
>conn dmuser/<password>@<pdbname>;

–- Drop the model if it exits								  
exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'doc_model', force => true);

-- Load Model
EXECUTE DBMS_VECTOR.LOAD_ONNX_MODEL(
	'DM_DUMP', 
	'my_embedding_model.onnx', 
	'doc_model', 
	JSON('{"function" : "embedding", "embeddingOutput" : "embedding"}'));
/
--Alternately, load the model
EXECUTE DBMS_DATA_MINING.IMPORT_ONNX_MODEL(
       'my_embedding_model.onnx',
	'doc_model', 
	JSON('{"function" : "embedding",
	"embeddingOutput" : "embedding",
	"input": {"input": ["DATA"]}}')
	);
 
--check the attributes view
set linesize 120
col model_name format a20
col algorithm_name format a20
col algorithm format a20
col attribute_name format a20
col attribute_type format a20
col data_type format a20 

SQL> SELECT model_name, attribute_name, attribute_type, data_type, vector_info
FROM user_mining_model_attributes
WHERE model_name = 'DOC_MODEL'
ORDER BY ATTRIBUTE_NAME;
 
 
OUTPUT:
 
MODEL_NAME           ATTRIBUTE_NAME       ATTRIBUTE_TYPE       DATA_TYPE  VECTOR_INFO
-------------------- -------------------- -------------------- ---------- ---------------
DOC_MODEL                INPUT_STRING         TEXT                 VARCHAR2
DOC_MODEL                ORA$ONNXTARGET       VECTOR               VECTOR     VECTOR(128,FLOA
                                                                          T32)
 
 
 
SQL> SELECT MODEL_NAME, MINING_FUNCTION, ALGORITHM,
ALGORITHM_TYPE, MODEL_SIZE
FROM user_mining_models
WHERE model_name = 'DOC_MODEL'
ORDER BY MODEL_NAME;
 
OUTPUT:
MODEL_NAME           MINING_FUNCTION                ALGORITHM            ALGORITHM_ MODEL_SIZE
-------------------- ------------------------------ -------------------- ---------- ----------
DOC_MODEL                EMBEDDING                      ONNX                 NATIVE       17762137
 
 
 
SQL> select * from DM$VMDOC_MODEL ORDER BY NAME;
 
OUTPUT:
NAME                                     VALUE
---------------------------------------- ----------------------------------------
Graph Description                        Graph combining g_8_torch_jit and torch_
                                         jit
                                         g_8_torch_jit
 
 
 
                                         torch_jit
 
 
Graph Name                               g_8_torch_jit_torch_jit
Input[0]                                 input:string[1]
Output[0]                                embedding:float32[?,128]
Producer Name                            onnx.compose.merge_models
Version                                  1
 
6 rows selected.
 
 
SQL> select * from DM$VPDOC_MODEL ORDER BY NAME;
 
OUTPUT:
NAME                                     VALUE
---------------------------------------- ----------------------------------------
batching                                 False
embeddingOutput                          embedding
 
 
SQL> select * from DM$VJDOC_MODEL;
 
OUTPUT:
METADATA
--------------------------------------------------------------------------------
{"function":"embedding","embeddingOutput":"embedding","input":{"input":["DATA"]}}
 
 
 
--apply the model
SQL> SELECT TO_VECTOR(VECTOR_EMBEDDING(doc_model USING 'hello' as data)) AS embedding;
  
--------------------------------------------------------------------------------
[-9.76553112E-002,-9.89954844E-002,7.69771636E-003,-4.16760892E-003,-9.69305634E-002,
-3.01141385E-002,-2.63396613E-002,-2.98553891E-002,5.96499592E-002,4.13885899E-002,
5.32859489E-002,6.57707453E-002,-1.47056757E-002,-4.18472625E-002,4.1588001E-002,
-2.86354572E-002,-7.56499246E-002,-4.16395674E-003,-1.52879998E-001,6.60010576E-002,
-3.9013084E-002,3.15719917E-002,1.2428958E-002,-2.47651711E-002,-1.16851285E-001,
-7.82847106E-002,3.34323719E-002,8.03267583E-002,1.70483496E-002,-5.42407483E-002,
6.54291287E-002,-4.81935125E-003,6.11041225E-002,6.64106477E-003,-5.47