Modell mit dem OCI-Python-SDK erstellen und speichern

Erstellen Sie ein Modell mit Python, und speichern Sie es direkt im Modellkatalog.

Um ein Modell zu erstellen und zu speichern, müssen Sie zuerst das Modellartefakt erstellen.

Es wird empfohlen, Modelle stattdessen programmgesteuert mit ADS oder dem OCI-Python-SDK im Modellkatalog zu erstellen und zu speichern.

Wichtig

  1. (Optional) Aktualisieren Sie das OCI-Python-SDK mit pip install oci –upgrade.
  2. Speichern Sie ein Modellobjekt auf dem Datenträger. Sie können ein Modell mit verschiedenen Tools speichern (Joblib, cloudpickle, Pickle, ONNX usw.). Es wird empfohlen, ein Modellobjekt im Verzeichnis der obersten Ebene des Modellartefakts und auf derselben Ebene wie die Dateien score.py und runtime.yaml zu speichern.
  3. Ändern Sie die Datei score.py, um die Funktionen load_model() und predict() zu definieren. Ändern Sie den Body beider Funktionen wie folgt, um Ihr Modell zu unterstützen:
    load_model()

    Liest die Modelldatei auf dem Datenträger und gibt das Schätzerobjekt zurück. Stellen Sie sicher, dass Sie dieselbe Library zum Serialisieren und Deserialisieren des Modellobjekts verwenden.

    predict()

    Enthält zwei Parameter: data und model. Der erforderliche Parameter ist data, der eine Dataset Payload darstellt, während "model" ein optionaler Parameter ist. Standardmäßig ist model das von load_model() zurückgegebene Objekt. Stellen Sie sicher, dass der Datentyp des data-Parameters mit dem für das Modell-Deployment erwarteten Payload-Format übereinstimmt.

    Standardmäßig wird beim Modell-Deployment davon ausgegangen, dass data eine JSON-Payload ist (MIME type application/JSON). Die Funktion predict() konvertiert die JSON-Payload in ein Modellobjektdatenformat. Beispiel: Ein Pandas-Datenframe oder ein Numpy-Array, wenn dieses Datenformat vom Modellobjekt unterstützt wird. Der Body von predict() kann Datentransformationen und andere Datenmanipulationsaufgaben enthalten, bevor eine Modellvorhersage erstellt wird.

    Weitere Hinweise:

    • Sie können die Funktionssignaturen von load_model() und predict() nicht bearbeiten. Sie können nur den Body dieser Funktionen bearbeiten, um sie anzupassen.
    • Wenn benutzerdefinierte Python-Module in der Artefaktdatei verfügbar sind, können sie mit score.py oder als Teil der Conda-Umgebung, die für Inferenzzwecke verwendet wird, importiert werden.
    • Sie können mehrere Modellobjekte in Ihrem Artefakt speichern. Sie können mehrere Schätzerobjekte in den Arbeitsspeicher laden, um eine Ensembleauswertung durchzuführen. In diesem Fall kann load_model() ein Array von Modellobjekten zurückgeben, die von predict() verarbeitet werden.

  4. (Optional) Testen Sie die Funktion score.predict().

    Es wird empfohlen, die Funktion predict() in Ihrer lokalen Umgebung zu testen, bevor Sie das Modell im Modellkatalog speichern. Im folgenden Code-Snippet wird dargestellt, wie Sie eine JSON-Payload an predict übergeben, die das Verhalten Ihres mit dem Modell-Deployment bereitgestellten Modells imitiert. Auf diese Weise können Sie sicherstellen, dass das Modellobjekt von load_model() gelesen wird. Außerdem stellen Sie so sicher, dass die von Ihren Modellen zurückgegebenen Vorhersagen korrekt sind und das erwartete Format aufweisen. Wenn Sie dieses Code-Snippet in einer Notizbuchsession ausführen, erhalten Sie auch die Ausgabe aller Logger, die Sie in score.py in der Ausgabezelle definieren.

    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. Ändern Sie die runtime.yaml-Datei.

    Diese Datei enthält eine Referenz zur Conda-Umgebung, die Sie für die Laufzeitumgebung für das Modell-Deployment verwenden möchten. Die Datei muss mindestens die folgenden Felder für ein Modell-Deployment enthalten:

    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/Content/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>

    Im Folgenden sehen Sie ein Beispiel für eine runtime.yaml-Datei. Der Data Scientist wählt die Conda-Umgebung TensorFlow aus.

    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. (Optional) (Empfohlen) Bevor Sie ein Modell im Katalog speichern, sollten Sie eine Reihe von Introspektionstests für Ihr Modellartefakt ausführen.

    Zweck dieser Tests ist es, Fehler zu identifizieren. Dazu werden die Dateien score.py und runtime.yaml mit einer Gruppe von Prüfungen validiert, um sicherzustellen, dass sie die richtige Syntax, Parameter und Versionen haben. Introspektionstests werden als Teil der Modellartefakt-Codevorlage definiert.

    1. Python Version 3.5 oder höher ist zur Ausführung der Tests erforderlich. Bevor Sie die Tests lokal auf Ihrem Rechner ausführen, müssen Sie die Python-Librarys pyyaml und requests installieren. Diese Installation muss nur einmal ausgeführt werden.

      Gehen Sie zum Artefaktverzeichnis. Führen Sie den folgenden Befehl aus, um die erforderlichen Drittanbieterabhängigkeiten zu installieren:

      python3 -m pip install --user -r artifact-introspection-test/requirements.txt
    2. Führen Sie die Tests lokal aus, indem Sie <artifact-directory> durch den Pfad zum Modellartefaktverzeichnis ersetzen:
      python3 artifact-introspection-test/model_artifact_validate.py --artifact <artifact-path>
    1. Prüfen Sie die Testergebnisse.

      Das Skript model_artifact_validate.py generiert zwei Ausgabedateien im obersten Verzeichnis Ihrer Modellartefakte:

      • test_json_output.json

      • test_html_output.html

      Sie können beide Dateien öffnen, um die Fehler zu prüfen. Wenn Sie die HTML-Datei öffnen, werden Fehlermeldungen im roten Hintergrund angezeigt.

    2. Führen Sie die Schritte 2 bis 6 aus, bis alle Tests erfolgreich ausgeführt werden. Nachdem die Tests erfolgreich ausgeführt wurden, kann das Modellartefakt im Modellkatalog gespeichert werden.
  7. Erstellen und speichern Sie das Modell mit dem OCI-SDK und einer OCI-Konfigurationsdatei, die Teil des standardmäßigen SDK-Zugriffsmanagements ist, im Modellkatalog.
    1. Initialisieren Sie den Client mit:
      # 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. (Optional) Dokumentieren Sie die Modellherkunft.

      Beispiel:

      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. (Optional) Dokumentieren Sie die Modelltaxonomie.

      Beispiel:

      # 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. (Optional) Fügen Sie Ihre benutzerdefinierten Metadaten hinzu (Attribute).

      Beispiel:

      # 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. (Optional) Dokumentieren Sie die Definitionen für die Eingabe- und Ausgabedatenschemas des Modells.
      Wichtig

      Die Schemadefinition für Eingabefeaturevektor und Modellvorhersagen wird zu Dokumentationszwecken verwendet. Diese Richtlinie gilt nur für tabellarische Datasets.

      Beispiel:

      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. (Optional) Dokumentieren Sie die Ergebnisse des Introspektionstests.
      Beispiel:
      # 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. (Optional) Legen Sie den Clienttimeoutwert fest, um einen Timeoutfehler beim Speichern großer Modellartefakte zu vermeiden:
      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. Erstellen Sie ein ZIP-Archiv des Modellartefakts:
      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. Erstellen (speichern) Sie das Modell im Modellkatalog:
      # 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. Jetzt können Sie die Modelldetails und die Modellinformationen anzeigen, einschließlich optionaler Metadaten, die Sie definiert haben.

Verwenden Sie diese Beispielcodedateien und Notizbuchbeispiele, um einen Modellspeicher weiter zu entwerfen.