OCI Python SDKを使用したモデルの作成および保存

Pythonでモデルを作成し、モデル・カタログに直接保存します。

モデルを作成して保存するには、最初にモデル・アーティファクトを作成する必要があります。

かわりに、ADSまたはOCI Python SDKを使用して、モデルを作成してモデル・カタログにプログラムで保存することをお薦めします。

重要

  1. (オプション)pip install oci –upgradeを使用してOCI Python SDKをアップグレードします。
  2. モデル・オブジェクトをディスクに保存します。様々なツールを使用して、モデル(Joblib、Cloudpickle、pickle、ONNXなど)を保存できます。モデル・オブジェクトは、モデル・アーティファクトのトップレベル・ディレクトリおよびscore.pyファイルおよびruntime.yamlファイルと同じレベルに保存することをお薦めします。
  3. score.pyファイルを変更して、load_model()およびpredict()関数を定義します。モデルをサポートするように、両方の関数の本体を次のように変更します:
    load_model()

    ディスク上のモデル・ファイルを読み取り、エスティメータ・オブジェクトを返します。モデル・オブジェクトのシリアライズおよびシリアライズ解除に同じライブラリを使用していることを確認してください。

    predict()

    dataおよびmodelの2つのパラメータが含まれます。必須パラメータはdataで、これはデータセット・ペイロードを表し、modelはオプションのパラメータです。デフォルトでは、modelload_model()によって返されるオブジェクトです。データ・パラメータのデータ型が、モデル・デプロイメントで想定されるペイロード形式と一致していることを確認します。

    デフォルトでは、モデル・デプロイメントは、dataがJSONペイロード(MIME type application/JSON)であると想定しています。predict()関数は、JSONペイロードをモデル・オブジェクト・データ形式に変換します。たとえば、PandasデータフレームまたはNumpy配列です(これらがモデル・オブジェクトでサポートされているデータ形式の場合)。predict()の本体には、データ変換、およびモデル予測が行われる前のその他のデータ操作タスクを含めることができます。

    さらに検討すべき事項:

    • load_model()およびpredict()の関数シグネチャは編集できません。これらの関数は、本体のみ編集してカスタマイズできます。
    • アーティファクト・ファイルで使用可能なカスタムPythonモジュールは、score.pyを使用してインポートすることも、推論目的で使用されるconda環境の一部としてインポートすることもできます。
    • アーティファクトに複数のモデル・オブジェクトを保存できます。複数のエスティメータ・オブジェクトをメモリーにロードして、アンサンブル評価を実行できます。この場合、load_model()は、predict()が処理するモデル・オブジェクトの配列を返すことができます。

  4. (オプション)score.predict()関数をテストします。

    モデルをモデル・カタログに保存する前に、ローカル環境でpredict()関数をテストすることをお薦めします。次のコード・スニペットは、モデル・デプロイメントを使用してデプロイされたモデルの動作を模倣するpredictにJSONペイロードを渡す方法を示しています。これは、モデル・オブジェクトがload_model()によって読み取られることを確認する適切な方法です。また、モデルによって返される予測が正しく、想定される形式であることも確認されます。ノートブック・セッションでこのコード・スニペットを実行すると、score.pyで定義したロガーの出力も出力セルに表示されされます。

    import sys
    from json import dumps
     
    # The local path to your model artifact directory is added to the Python path.
    # replace <your-model-artifact-path>
    sys.path.insert(0, f"<your-model-artifact-path>")
     
    # importing load_model() and predict() that are defined in score.py
    from score import load_model, predict
     
    # Loading the model to memory
    _ = load_model()
     
    # Take a sample of your training or validation dataset and store it as data.
    # Making predictions on a JSON string object (dumps(data)). Here we assume
    # that predict() is taking data in JSON format
    predictions_test = predict(dumps(data), _)
    # Compare the predictions captured in predictions_test with what you expect for data:
    predictions_test
  5. runtime.yamlファイルを変更します。

    このファイルは、モデル・デプロイメントのランタイム環境に使用するconda環境への参照を提供します。少なくとも、モデル・デプロイメントのファイルには次のフィールドが含まれている必要があります。

    MODEL_ARTIFACT_VERSION: '3.0'
    MODEL_DEPLOYMENT:
      INFERENCE_CONDA_ENV:
        INFERENCE_ENV_SLUG: <the-slugname> # for example mlcpuv1 see: https://docs.oracle.com/en-us/iaas/data-science/using/conda-gml-fam.htm
        INFERENCE_ENV_TYPE: <env-type> # can either be "published" or "data_science"
        INFERENCE_ENV_PATH: <conda-path-on-object-storage>
        INFERENCE_PYTHON_VERSION: <python-version-of-conda-environment>

    次に、runtime.yamlファイルの例を示します。データ・サイエンティストは、データ・サイエンスのCPU用TensorFlow 2.3 conda環境を選択しています。

    MODEL_ARTIFACT_VERSION: '3.0'
    MODEL_DEPLOYMENT:
      INFERENCE_CONDA_ENV:
        INFERENCE_ENV_SLUG: tensorflow23_p37_cpu_v1
        INFERENCE_ENV_TYPE: data_science
        INFERENCE_ENV_PATH: oci://service-conda-packs@id19sfcrra6z/service_pack/cpu/Tensorflow for CPU Python 3.7/1.0/tensorflow23_p37_cpu_v1
        INFERENCE_PYTHON_VERSION: '3.7'
  6. (オプション)(推奨)モデルをカタログに保存する前に、モデル・アーティファクトに対して一連のイントロスペクション・テストを実行することをお薦めします。

    これらのテストの目的は、一連のチェックでscore.pyファイルおよびruntime.yamlファイルを検証してエラーを特定し、構文、パラメータおよびバージョンが正しいことを確認することです。イントロスペクション・テストは、モデル・アーティファクト・コード・テンプレートの一部として定義されます。

    1. テストを実行するには、Pythonバージョン3.5以上が必要です。マシンでテストをローカルで実行する前に、pyyamlおよびrequests Pythonライブラリをインストールする必要があります。このインストールは1回かぎりの操作です。

      アーティファクト・ディレクトリに移動します。次のコマンドを実行して、必要なサードパーティ依存関係をインストールします:

      python3 -m pip install --user -r artifact-introspection-test/requirements.txt
    2. <artifact-directory>をモデル・アーティファクト・ディレクトリへのパスに置き換えて、ローカルでテストを実行します:
      python3 artifact-introspection-test/model_artifact_validate.py --artifact <artifact-path>
    1. テスト結果を調べます。

      model_artifact_validate.pyスクリプトは、モデル・アーティファクトの最上位ディレクトリに2つの出力ファイルを生成します:

      • test_json_output.json

      • test_html_output.html

      どちらのファイルを開いても、エラーを検査できます。HTMLファイルを開くと、赤色の背景にエラー・メッセージが表示されます。

    2. すべてのテストが実行されるまで、ステップ2から6を繰り返します。テストが正常に実行されたら、モデル・アーティファクトをモデル・カタログに保存できます。
  7. OCI SDKとOCI構成ファイル(標準のSDKアクセス管理)を使用して、モデルを作成し、モデル・カタログに保存します。
    1. 次を使用してクライアントを初期化します:
      # Create a default config using DEFAULT profile in default location
      # Refer to
      # https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
      # for more info
       
      import oci
      from oci.data_science.models import CreateModelDetails, Metadata, CreateModelProvenanceDetails, UpdateModelDetails, UpdateModelProvenanceDetails
      config = oci.config.from_file()
      data_science_client = oci.data_science.DataScienceClient(config=config)
       
      # Initialize service client with user principal (config file)
      config = oci.config.from_file()
      data_science_client = oci.data_science.DataScienceClient(config=config)
       
      # Alternatively initialize service client with resource principal (for example in a notebook session)
      # auth = oci.auth.signers.get_resource_principals_signer()
      # data_science_client = oci.data_science.DataScienceClient({}, signer=auth)
    2. (オプション)モデルの来歴をドキュメント化します

      例:

      provenance_details = CreateModelProvenanceDetails(repository_url="EXAMPLE-repositoryUrl-Value",
                                                        git_branch="EXAMPLE-gitBranch-Value",
                                                        git_commit="EXAMPLE-gitCommit-Value",
                                                        script_dir="EXAMPLE-scriptDir-Value",
                                                        # OCID of the ML job Run or Notebook session on which this model was
                                                        # trained
                                                        training_id="<Notebooksession or ML Job Run OCID>"
                                                        )
    3. (オプション)モデル・タクソノミをドキュメント化します

      例:

      # create the list of defined metadata around model taxonomy:
      defined_metadata_list = [
          Metadata(key="UseCaseType", value="image_classification"),
          Metadata(key="Framework", value="keras"),
          Metadata(key="FrameworkVersion", value="0.2.0"),
          Metadata(key="Algorithm",value="ResNet"),
          Metadata(key="hyperparameters",value="{\"max_depth\":\"5\",\"learning_rate\":\"0.08\",\"objective\":\"gradient descent\"}")
      ]
    4. (オプション)カスタム・メタデータ(属性)を追加します

      例:

      # Adding your own custom metadata:
      custom_metadata_list = [
          Metadata(key="Image Accuracy Limit", value="70-90%", category="Performance",
                   description="Performance accuracy accepted"),
          Metadata(key="Pre-trained environment",
                   value="https://blog.floydhub.com/guide-to-hyperparameters-search-for-deep-learning-models/",
                   category="Training environment", description="Environment link for pre-trained model"),
          Metadata(key="Image Sourcing", value="https://lionbridge.ai/services/image-data/", category="other",
                   description="Source for image training data")
      ]
    5. (オプション)モデルの入力および出力データ・スキーマ定義をドキュメント化します
      重要

      入力特徴ベクトルとモデル予測の両方のスキーマ定義は、ドキュメント化の目的で使用されます。このガイドラインは、表形式のデータセットにのみ適用されます。

      例:

      import json
      from json import load
      # Declare input/output schema for our model - this is optional
      # It must be a valid json or yaml string
      # Schema like model artifact is immutable hence it is allowed only at the model creation time and cannot be updated
      # Schema json sample in appendix
      input_schema = load(open('SR_input_schema.json','rb'))
      input_schema_str= json.dumps(input_schema)
      output_schema = load(open('SR_output_schema.json','rb'))
      output_schema_str= json.dumps(output_schema)
    6. (オプション)イントロスペクション・テスト結果をドキュメント化します
      例:
      # Provide the introspection test results
       
      test_results = load(open('test_json_output.json','rb'))
      test_results_str = json.dumps(test_results)
      defined_metadata_list.extend([Metadata(key="ArtifactTestResults", value=test_results_str)])
    7. (オプション)大きいモデル・アーティファクトの保存時にデータ・サイエンス・サービスのタイムアウト・エラーを回避するには、クライアント・タイムアウト値を設定します:
      import oci
       
      config = oci.config.from_file()
      data_science_client = oci.data_science.DataScienceClient(config=config)
      # Change the timeout value to 1800 sec (30 mins)
      data_science_client.base_client.timeout =  30 * 60
    8. モデル・アーティファクトのzipアーカイブを作成します:
      import zipfile
      import os
           
      def zipdir(target_zip_path, ziph, source_artifact_directory):
          ''' Creates a zip archive of a model artifact directory.
           
          Parameters:
           
          - target_zip_path: the path where you want to store the zip archive of your artifact
          - ziph: a zipfile.ZipFile object
          - source_artifact_directory: the path to the artifact directory.
       
          Returns a zip archive in the target_zip_path you specify.    
       
          '''
          for root, dirs, files in os.walk(source_artifact_directory):
              for file in files:
                  ziph.write(os.path.join(root, file),
                             os.path.relpath(os.path.join(root,file),
                                             os.path.join(target_zip_path,'.')))
             
      zipf = zipfile.ZipFile('<relpath-to-artifact-directory>.zip', 'w', zipfile.zip_DEFLATED)
      zipdir('.', zipf, "<relpath-to-artifact-directory>")
      zipf.close()
    9. モデル・カタログにモデルを作成(保存)します。
      # creating a model details object:
      model_details = CreateModelDetails(
          compartment_id='<compartment-ocid-of-model>',
          project_id='<project-ocid>',
          display_name='<display-name-of-model>',
          description='<description-of-model>',
          custom_metadata_list=custom_metadata_list,
          defined_metadata_list=defined_metadata_list,
          input_schema=input_schema_str,
          output_schema=output_schema_str)
       
      # creating the model object:
      model = data_science_client.create_model(model_details)
      # adding the provenance:
      data_science_client.create_model_provenance(model.data.id, provenance_details)
      # adding the artifact:
      with open('<relpath-to-artifact-directory>.zip','rb') as artifact_file:
          artifact_bytes = artifact_file.read()
          data_science_client.create_model_artifact(model.data.id, artifact_bytes, content_disposition='attachment; filename="<relpath-to-artifact-directory>.zip"')
  8. これで、モデル詳細を表示したり、定義したオプションのメタデータを含むモデル情報を表示できるようになりました。

これらのサンプル・コード・ファイルおよびノートブック例を使用すると、モデル・ストアの設計にさらに役立ちます。