Création et enregistrement d'un modèle à l'aide de la trousse SDK Python pour OCI

Créez un modèle avec Python et enregistrez-le directement dans le catalogue de modèles.

Pour créer et enregistrer un modèle, vous devez d'abord créer l'artefact de modèle.

Nous vous recommandons de créer et d'enregistrer des modèles dans le catalogue de modèles par programmation à la place, à l'aide d'ADS ou de la trousse SDK Python pour OCI.

Important

  1. (Facultatif) Mettez à niveau la trousse SDK Python pour OCI avec pip install oci –upgrade.
  2. Enregistrez un objet de modèle sur le disque. Vous pouvez utiliser divers outils pour enregistrer un modèle (Joblib, cloudpickle, pickle, ONNX, etc.). Nous vous recommandons d'enregistrer un objet de modèle dans le répertoire supérieur de votre artefact de modèle et au même niveau que les fichiers score.py et runtime.yaml.
  3. Changez votre fichier score.py pour définir les fonctions load_model() et predict(). Modifiez le corps des deux fonctions pour prendre en charge votre modèle comme suit :
    load_model()

    Lit le fichier de modèle sur le disque et renvoie l'objet d'évaluation. Veillez à utiliser la même bibliothèque pour sérialiser et désérialiser l'objet de modèle.

    predict()

    Contient deux paramètres, data et model. Le paramètre obligatoire est data, qui représente les données utiles d'un jeu de données alors que model est un paramètre facultatif. Par défaut, model est l'objet retourné par load_model(). Assurez-vous que le type de données du paramètre data correspond au format de données utiles attendu pour le déploiement de modèle.

    Par défaut, le déploiement de modèle suppose que data correspond à des données utiles JSON (MIME type application/json). La fonction predict() convertit les données utiles JSON en un format de données d'objet de modèle. Par exemple, une structure de données Pandas ou un tableau Numpy lorsqu'il s'agit du format de données pris en charge par l'objet de modèle. Le corps de predict() peut inclure des transformations de données et d'autres tâches de manipulation de données avant qu'une prédiction de modèle ne soit effectuée.

    Quelques autres points à considérer :

    • Vous ne pouvez pas modifier les signatures des fonctions load_model() et predict(). Vous ne pouvez modifier le corps de ces fonctions que pour les personnaliser.
    • S'ils sont disponibles dans le fichier d'artefact, tous les modules Python personnalisés peuvent être importés à l'aide de score.py ou dans le cadre de l'environnement Conda utilisé à des fins d'inférence.
    • Vous pouvez enregistrer plusieurs objets de modèle dans votre artefact. Vous pouvez charger plusieurs objets d'évaluation dans la mémoire pour effectuer une évaluation d'ensemble. Dans ce cas, load_model() peut retourner un tableau d'objets de modèle que predict() traite.

  4. (Facultatif) Testez la fonction score.predict().

    Nous vous recommandons de tester la fonction predict() dans votre environnement local avant d'enregistrer le modèle dans le catalogue. L'extrait de code suivant montre comment transmettre des données utiles JSON pour la prédiction, qui reproduisent le comportement de votre modèle traité à l'aide du déploiement de modèle. Cette méthode assure que l'objet de modèle est lu par load_model(). Elle assure en outre que les prédictions retournées par vos modèles sont correctes et au format attendu. Si vous exécutez cet extrait de code dans une session de carnet, vous obtenez également le résultat des enregistreurs que vous définissez dans score.py dans la cellule de sortie.

    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. Modifiez le fichier runtime.yaml.

    Ce fichier fournit une référence à l'environnement Conda à utiliser pour l'environnement d'exécution du déploiement de modèle. Au minimum, le fichier doit contenir les champs suivants pour un déploiement de modèle :

    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>

    Voici un exemple de fichier runtime.yaml. L'expert en science des données sélectionne l'environnement Conda TensorFlow.

    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. (Facultatif) (Recommandé) Avant d'enregistrer un modèle dans le catalogue, nous vous recommandons d'exécuter une série de tests d'introspection sur votre artefact de modèle.

    L'objectif de ces tests est d'identifier les erreurs éventuelles en validant les fichiers score.py et runtime.yaml à l'aide d'un jeu de vérifications pour s'assurer que leur syntaxe, leurs paramètres et leurs versions sont corrects. Les tests d'introspection sont définis dans le cadre du modèle de code d'artefact de modèle.

    1. Python version 3.5 ou ultérieure est requis pour exécuter les tests. Avant d'exécuter les tests localement sur votre machine, vous devez installer les bibliothèques Python pyyaml et requests. Il s'agit d'une opération ponctuelle.

      Allez jusqu'à votre répertoire d'artefacts. Exécutez la commande suivante pour installer les dépendances tierces requises :

      python3 -m pip install --user -r artifact-introspection-test/requirements.txt
    2. Exécutez les tests localement en remplaçant <artifact-directory> par le chemin du répertoire d'artefacts de modèle :
      python3 artifact-introspection-test/model_artifact_validate.py --artifact <artifact-path>
    1. Examinez les résultats du test.

      Le script model_artifact_validate.py génère deux fichiers de sortie dans le répertoire supérieur de vos artefacts de modèle :

      • test_json_output.json

      • test_html_output.html

      Vous pouvez ouvrir l'un ou l'autre des fichiers pour inspecter les erreurs. Si vous ouvrez le fichier HTML, les messages d'erreur s'affichent dans l'arrière-plan rouge.

    2. Répétez les étapes 2 à 6 jusqu'à ce que tous les tests aboutissent. Une fois les tests exécutés, l'artefact de modèle est prêt à être enregistré dans le catalogue de modèles.
  7. Créez et enregistrez le modèle dans le catalogue à l'aide de la trousse SDK pour OCI avec un fichier de configuration OCI, qui fait partie de la gestion d'accès standard à la trousse SDK.
    1. Initialisez le client avec :
      # 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. (Facultatif) Documentez la provenance du modèle.

      Par exemple :

      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. (Facultatif) Documentez la taxonomie de modèle.

      Par exemple :

      # 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. (Facultatif) Ajoutez vos métadonnées personnalisées (attributs).

      Par exemple :

      # 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. (Facultatif) Documentez les définitions de schéma de données d'entrée et de sortie du modèle.
      Important

      La définition de schéma pour le vecteur de fonction d'entrée et les prédictions de modèle sont utilisées à des fins de documentation. Cette directive s'applique uniquement aux jeux de données tabulaires.

      Par exemple :

      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. (Facultatif) Documentez les résultats des tests d'introspection.
      Par exemple :
      # 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. (Facultatif) Définissez la valeur de temporisation du client pour éviter une erreur de temporisation du service de science des données lors de l'enregistrement des artefacts de modèle volumineux :
      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. Créez une archive zip de l'artefact de modèle :
      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. Créez (enregistrez) le modèle dans le catalogue de modèles :
      # 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. Vous pouvez maintenant consulter les détails du modèle et afficher les informations du modèle, y compris les métadonnées facultatives que vous avez définies.

Utilisez ces exemples de fichiers de code et des exemples de carnet pour concevoir davantage un magasin de modèles.