ファイル・エクスポートによるOracle Machine Learning Servicesへのデータベース内モデルのデプロイ

この例では、Oracle Machine LearningモデルをあるAutonomous Databaseから別のAutonomous Databaseにエクスポートする方法を示します。また、シリアライズされたモデルをOracle Machine Learning Servicesにデプロイする方法を示します。

データ・サイエンティストと企業は、多くの場合、機械学習モデルの開発とテストのためと、デプロイメントのために、別々のデータベースを使用します。1つの環境で複数のモデルを構築し、その機械学習モデルによって満足な結果が得られると、開発データベースからそれらをエクスポートして本番データベースにインポートし、Oracle Machine Learning Servicesにデプロイします。したがって、基本的に、Oracle Machine Learningでは次のことができます:
  • 同じデータベース内の、あるスキーマから別のスキーマにモデルをエクスポートする
  • あるデータベースから別のデータベースにモデルをエクスポートする。このシナリオでは、次のものからモデルをエクスポートできます:
    • Autonomous DatabaseからAutonomous Databaseへ
    • Autonomous DatabaseからOracleオンプレミス・データベースへ
    • Oracleオンプレミス・データベースからAutonomous Databaseへ
    • Oracleオンプレミス・データベースからOracleオンプレミス・データベースへ

データベース間でのOMLモデルのエクスポートとインポートの詳細は、テンプレート例のノートブック「OML Export and Import Serialized Model」を参照してください。このノートブックは、Oracle Machine Learningユーザー・インタフェースの「テンプレート」の下の「例」にあります。

この例では、DBMS_DATA_MININGパッケージを使用して、シリアライズされたモデルをAutonomous Database (ソース・データベース)から別のAutonomous Database (ターゲット・データベース)にエクスポートする方法を示します。シリアライズされたモデルの形式は、スコアリングをサポートするための軽量な手法です。シリアライズされたモデル内には、スコアリングに必要なモデル・データとメタデータのみがあります。そのため、よりコンパクトであり、より速くターゲット環境に転送されます。

シリアライズされたモデルを、Oracle Machine Learning Servicesにデプロイすることもできます。Oracle Machine Learning Servicesでは、Autonomous DatabaseでホストされているRESTエンドポイントが提供されます。これらのエンドポイントにより、OMLモデルの格納とスコアリング・エンドポイントの作成が可能になります。OMLサービスのREST APIでは、OMLモデルとONNX形式モデルが両方サポートされており、認識テキスト機能が有効になります。シリアライズされたモデルのエクスポートでは、スコアを生成するモデルのみがサポートされています。属性重要度、相関ルール、指数平滑法およびO-Clusterはサポートされていません。すべてのモデル詳細が必要な場合は、DBMS_DATA_MINING.EXPORT_MODELプロシージャを使用してそのモデルをエクスポートします。

この例では、次のステップを示します:
  1. Autonomous Database (ソース・データベース)からオブジェクト・ストレージに、シリアライズされた形式でモデルをエクスポートします。これにより、DBMS_DATA_MINING.EXPORT_SERMODELプロシージャを使用して、単一のモデルが、シリアライズされたBLOBにエクスポートされます。
  2. オブジェクト・ストレージから別のAutonomous Database (ターゲット・データベース)にモデルをインポートします。これにはDBMS_DATA_MINING.IMPORT_SERMODELプロシージャが使用されます。それにより、シリアライズされたBLOBが取得され、シリアライズされた形式でのモデルがターゲット・データベースにインポートされます。
  3. シリアライズされたモデルをOracle Machine Learning Servicesにデプロイします。そのステップを次に示します:
    • 認証トークンを取得する
    • モデルをモデル・リポジトリに格納する
    • モデル・スコアリング・エンドポイントを作成する
    • そのエンドポイント用のOpen APIドキュメントを取得する
    • そのモデル・エンドポイントをスコアリングする

この例では、シリアライズされたモデルをAutonomous Database (ソース・データベース)から別のAutonomous Database (ターゲット・データベース)にエクスポートするシナリオを示します。Autonomous Databaseから別のAutonomous Databaseにモデルをエクスポートするには前提条件があります:

前提条件:
  • シリアルライズされたBLOBにモデルを書き込むプロシージャを作成する
  • クラウド・サービスとやり取りするためにDBMS_CLOUDパッケージにアクセスする
    • クラウド資格証明を作成します
    • Oracle Cloudの事前認証済リクエスト(PAR) - PARは、オブジェクト・ストレージ・データの共有とアップロードに使用されます。
    • オブジェクトを永続化するためのディレクトリ - モデルをAutonomous Databaseからエクスポートするときは、シリアライズされたモデルが、オブジェクト・ストレージに送信される前にデータ・ポンプ・ディレクトリに永続化されます。Autonomous Databaseでは、データベース内に、事前定義されたデータ・ポンプ・ディレクトリDATA_PUMP_DIRが含まれており、そこにファイルを配置できます。
    • 次の権限付与を指定する必要があります:
      • DBMS_CLOUDパッケージ内のプロシージャを実行する権限を付与します。次を実行します:
        SQL> 
        GRANT EXECUTE ON DBMS_CLOUD TO OMLUSER;
      • オブジェクトを保存するためのデータ・ポンプ・ディレクトリへの読取りおよび書込みアクセス権を付与します。次を実行します:
        SQL> 
        GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO OMLUSER;

1: モデルをシリアライズされた形式でAutonomous Databaseからオブジェクト・ストレージにエクスポートする

このプロシージャでは、モデルGLM_MODが、シリアライズされた形式GLM_MOD.modで、オブジェクト・ストレージにエクスポートされます。ここから、それをスコアリングのために別のデータベースまたはOracle Machine Learning Servicesに移動できます。
  1. OMLノートブック内の%script段落で、次のPL/SQLスクリプトを実行してモデルGLM_MODを作成します。ここでは、回帰マイニング機能を使用しており、CARS表にあるデータを問い合せています。
    %script
    
    BEGIN DBMS_DATA_MINING.DROP_MODEL('GLM_MOD');
    EXCEPTION WHEN OTHERS THEN NULL; END;
    /
    
    DECLARE
      v_setlst DBMS_DATA_MINING.SETTING_LIST;
        
    BEGIN
      v_setlst('PREP_AUTO') := 'ON';
      v_setlst('ALGO_NAME') := 'ALGO_GENERALIZED_LINEAR_MODEL';
      v_setlst('GLMS_DIAGNOSTICS_TABLE_NAME') := 'GLMR_DIAG';
        
      DBMS_DATA_MINING.CREATE_MODEL2(
        model_name          => 'GLM_MOD',
        mining_function     => 'REGRESSION',
        data_query          => 'SELECT * FROM CARS',
        set_list            =>  v_setlst,
        case_id_column_name => 'CID',
        target_column_name  => 'MPG');
    END;
  2. 別の%script段落で、次のスクリプトを実行して、モデルGLM_MODをエクスポートし、それをシリアライズされた形式GLM_MOD.modでオブジェクト・ストレージに保存します。
    %script
    
    DECLARE
      MODNAME VARCHAR2(100) := 'GLM_MOD';
      SER_MODNAME VARCHAR2(100);
      LOCATION_URI VARCHAR2(200) := 'https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/eUs89dFd_m_5OoGJ1PLj50bS-glojzHXZAZ3csGg4Iw9kQwKHzkZ8jorPD0si_ls/n/adwc4pm/b/OML-Resources/o/'; 
      BLOB_MODEL BLOB;
    
    -----------------------------------------
    -- Define a model name to store the model
    -----------------------------------------
     
    BEGIN
      SELECT CONCAT(MODNAME,'.mod') INTO SER_MODNAME from dual;
      DBMS_OUTPUT.PUT_LINE('Serialized model will be exported with name: '||SER_MODNAME);
    
    -----------------------------------------------------------------------
    -- Read the Serialized Model from Object Storage into a binary object
    -----------------------------------------------------------------------
    
      DBMS_LOB.CREATETEMPORARY(BLOB_MODEL, FALSE);
      DBMS_DATA_MINING.EXPORT_SERMODEL(BLOB_MODEL, MODNAME);   
      
    ----------------------------------------------------------------------
    -- Function to write a model to a BLOB
    ----------------------------------------------------------------------
    
      write_serialized_model(BLOB_MODEL, 'DATA_PUMP_DIR', SER_MODNAME);  
      DBMS_LOB.FREETEMPORARY(BLOB_MODEL);
    
    ----------------------------------------------------------------------
    -- Save serialized model in the data pump directory to Object Storage
    ----------------------------------------------------------------------
      
      DBMS_CLOUD.PUT_OBJECT(                                            
        credential_name => 'MY_CLOUD_CRED',
        object_uri => LOCATION_URI||SER_MODNAME,
        directory_name => 'DATA_PUMP_DIR',
    	file_name => SER_MODNAME);	
    	     
        SELECT CONCAT(MODNAME,'.mod') INTO SER_MODNAME from dual;
        DBMS_OUTPUT.PUT_LINE('Serialized model saved in Object Storage with the name: '||SER_MODNAME);
    END;
    説明:
    • MODNAME - これは、エクスポートされるモデルの名前です。ここでは、GLM_MODです。
    • SER_MODNAME - エクスポートされたモデルが格納される、オブジェクト・ストレージ内のファイルです。ここでは、GLM_MODを格納するモデルです。
    • LOCATION_URI - これは、オブジェクト・ストレージのURLです。
    • write_serialized_model - BLOBにモデルを書き込む関数です。パラメータv_blob blobdirName varchar2filName varchar2を指定します。ここでは、dirNameDATA_PUMP_DIRで、fileNameSER_MODNAMEです。
    • DBMS_DATA_MINING.EXPORT_SERMODEL - シリアライズされたモデルをエクスポートしてデータ・ポンプ・ディレクトリ、オブジェクト・ストレージの順に保存するプロシージャです。詳細は、EXPORT_SERMODELプロシージャを参照してください。
    • credential_name - DBMS_CLOUD.PUT_OBJECTプロシージャにクラウド資格証明を指定します。その他のパラメータを次に示します:
      • object_uri
      • directory_name
      • file_name

このプロシージャが正常に実行されると、次のメッセージが生成されます:

Serialized model will be exported with name: GLM_MOD.mod 
Serialized model saved in Object Storage with the name: GLM_MOD.mod

2: シリアライズされたモデルをオブジェクト・ストレージから別のAutonomous Databaseインスタンスにインポートする

モデルをエクスポートしオブジェクト・ストレージに保存した後は、そのモデルを別のデータベースにインポートすることもできます。

モデルを別のデータベースにインポートするPL/SQLスクリプトの例を次に示します。ここでは、DBMS_DATA_MINING.IMPORT_SERMODELプロシージャを使用して、シリアライズされた形式でのモデルをデータベースにインポートしています。
%script

DECLARE
    SER_MODNAME VARCHAR2(100) := 'GLM_MOD.mod';
    MODNAME VARCHAR2(500);
    LOCATION_URI VARCHAR2(200) := 'https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/eUs89dFd_m_5OoGJ1PLj50bS-glojzHXZAZ3csGg4Iw9kQwKHzkZ8jorPD0si_ls/n/adwc4pm/b/OML-Resources/o/';
    BLOB_MODEL BLOB;

BEGIN
    DBMS_OUTPUT.PUT_LINE('Serialized model name in Object Storage is: '||SER_MODNAME);
  
--------------------------------------------------
-- Define a model name to save the imported model
--------------------------------------------------

    SELECT UPPER(REGEXP_SUBSTR(SER_MODNAME, '[^.]+')) INTO MODNAME from dual;
    DBMS_OUTPUT.PUT_LINE('Model will be saved with name: '||MODNAME);

------------------------------------------------------------------------
-- Read the serialized model from Object Storage into a binary variable
------------------------------------------------------------------------

    BEGIN DBMS_DATA_MINING.DROP_MODEL(model_name => MODNAME);
    EXCEPTION WHEN OTHERS THEN NULL; END;

    BLOB_MODEL := DBMS_CLOUD.GET_OBJECT(                            
                      credential_name => 'MY_CLOUD_CRED',
                      object_uri => LOCATION_URI||SER_MODNAME);
-----------------------------------------------
-- Import the serialized model to the database
-----------------------------------------------                    
  
    DBMS_DATA_MINING.IMPORT_SERMODEL(BLOB_MODEL, MODNAME);
    DBMS_OUTPUT.PUT_LINE('New model successfully imported with name: '||MODNAME);

END;
この例では、
  • SER_MODNAME - シリアライズされたモデルが格納されている、オブジェクト・ストレージからインポートされるファイル。ここでは、GLM_MOD.modです。
  • LOCATION_URI - これは、オブジェクト・ストレージの場所です。
  • DBMS_DATA_MINING.IMPORT_SERMODEL - シリアライズされたBLOBをデータベースにインポートするパッケージです。詳細は、IMPORT_SERMODELプロシージャを参照してください。
このプロシージャが正常に実行されると、次のメッセージが生成されます:
Serialized model name in Object Storage is: GLM_MOD.mod
Model will be saved with name: GLM_MOD
New model successfully imported with name: GLM_MOD

3: シリアライズされたモデルをOracle Machine Learning Servicesにデプロイする

前提条件:
  • 認証トークンを取得する
  • シリアライズされたモデルをローカルに保存する
Oracle Machine Learning Servicesにモデルをデプロイするには:
  1. 認証に記載されている手順に従って、トークンを取得します。これはベアラー・トークン(HTTP認証スキームのセキュリティ・トークン)です。リクエストの実行時に、Authorizationヘッダーのこのトークンを送信する必要があります。

    ノート:

    トークンを取得できるデータベース・アカウントには、OML_DEVELOPERロールが必要です。
  2. POSTリクエストをOracle Machine Learning Servicesリポジトリに送信することで、モデルをデータベース内のモデル・リポジトリに格納します。次のcURLコマンドを使用します。
    curl -X POST --header "Authorization: Bearer $token" 
    <oml-cloud-service-location-url>/omlmod/v1/models \
    -H 'content-type: multipart/form-data; boundary=Boundary' \
    -F modelData=@modelfile \
    -F modelName=GLM_MOD \
    -F modelType=OML \
    -F 'description=Regression model' \
    -F shared=true \
    -F version=1.0

    ノート:

    モデルをリポジトリに格納すると、一意のIDが生成されます。これは、モデル・エンドポイントの作成時に使用するmodelIdです。
    この例の説明は、次のとおりです。
    • $tokenは、認可APIを介して取得されたトークンに割り当てられる環境変数を表します。
    • GLM_MODはモデル名です
  3. POSTリクエストを使用することでモデル・スコアリング・エンドポイントを作成します。このメソッドは、modelIduriを入力として取ります。モデルをデプロイするPOSTリクエストの例:
    curl -X POST --header "Authorization: Bearer $token" 
    <oml-cloud-service-location-url>/omlmod/v1/deployment\
    --header 'Content-Type: application/json' \
    -d '{"uri":"glm_model","modelId":"8c8a4499-a6cd-4706-b9bf-dbf489104a95"}'
    説明:
    • $tokenは、認可APIを介して取得されたトークンに割り当てられる環境変数を表します。
    • glm_modelはそのURIです。
    • 8c8a4499-a6cd-4706-b9bf-dbf489104a95はmodelIdです。

    ノート:

    モデル所有者のみがモデルをデプロイできます。モデル所有者とは、モデルを格納するユーザーです。デプロイ済モデルに対して新しいエンドポイントが作成されます。
  4. GETリクエストを送信することで、このエンドポイント用のOpen APIドキュメントを取得します。

    URIがglm_modelであるデプロイ済モデル・エンドポイントのOpen APIドキュメントの例を次に示します:

    curl  -X GET --header "Authorization: Bearer $token" 
     <oml-cloud-service-location-url>/omlmod/v1/deployment/glm_model/api
    この例の説明は、次のとおりです。
    • $tokenは、認可APIを介して取得されたトークンに割り当てられる環境変数を表します。
    • glm_modelはそのURIです。
  5. 次のようにPOSTリクエストを使用して、モデル・エンドポイントをスコアリングします。
    curl  -X POST --header "Authorization: Bearer $token" 
    <oml-cloud-service-location-url>/omlmod/v1/deployment/glm_model/score\
     --header 'Content-Type: application/json' --header 'Accept: application/json'\
    -d '{"inputRecords":[{"X1":1,"X2":5}]}'
    この例の説明は、次のとおりです。
    • $tokenは、認可APIを介して取得されたトークンに割り当てられる環境変数を表します。
    • /deployment/glm_model/はそのURIです。
    • inputRecordsは配列で、単一のレコード(例を参照)または複数のレコードのミニバッチを渡すことができます。
  6. スコアリング・エンドポイントの削除: URIで識別されるスコアリング・エンドポイントを削除するには、次のcURLコマンドを実行します:
    curl -i -X DELETE "<oml-cloud-service-location-url>/omlmod/v1/deployment/glm_model" \
    --header "Authorization: Bearer $token"

    この例では、glm_modelがそのURIです。このコマンドでは、スコアリング・エンドポイントが削除されます。

  7. モデルの削除: modelIdで特定されているモデルを削除するには、次のcURLコマンドを実行します:
    curl -i -X DELETE "<oml-cloud-service-location-url>/omlmod/v1/models/8c8a4499-a6cd-4706-b9bf-dbf489104a95" \
    --header "Authorization: Bearer $token" 

    この例では、8c8a4499-a6cd-4706-b9bf-dbf489104a95modelIdです。このコマンドでは、モデルが削除されます。