Preparazione dei metadati del modello

I metadati del modello sono facoltativi, sebbene consigliati.

Metadati provenienza modello

È possibile documentare la provenienza del modello. Facoltativo. La tabella riportata di seguito elenca i metadati di provenienza del modello supportati.

Metadati descrizione;
git_branch Diramazione del repository Git.
git_commit ID commit.
repository_url URL del repository Git remoto.
script_dir Percorso locale della directory artifact.
training_id

OCID della risorsa utilizzata per addestrare il modello, la sessione notebook o l'esecuzione del job.

È possibile utilizzare queste variabili di ambiente quando si salva un modello con l'SDK OCI:

  • NB_SESSION_OCID

Esempio

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>>"
                                                  )

Metadati tassonomia modello

È possibile documentare la tassonomia del modello. Facoltativo.

I campi di metadati associati alla tassonomia del modello consentono di descrivere il caso d'uso e il framework di apprendimento automatico alla base del modello. Le tag metadati definite sono la lista di valori consentiti per il tipo di caso d'uso e il framework per i metadati definiti e i valori di categoria per i metadati personalizzati.

Tassonomia modello preimpostato

Nella tabella riportata di seguito sono elencati i metadati della tassonomia del modello supportati.

Metadati descrizione;
UseCaseType

Descrive il caso d'uso di apprendimento automatico associato al modello utilizzando uno dei valori elencati, ad esempio:

binary_classification
regression
multinomial_classification
clustering
recommender
dimensionality_reduction/representation
time_series_forecasting
anomaly_detection
topic_modeling
ner
sentiment_analysis
image_classification
object_localization
other
Framework

Framework di apprendimento automatico associato al modello utilizzando uno dei valori elencati, ad esempio:

scikit-learn
xgboost 
tensorflow 
pytorch 
mxnet 
keras 
lightGBM
pymc3
pyOD
spacy 
prophet 
sktime 
statsmodels
cuml 
oracle_automl
h2o
transformers 
nltk 
emcee 
pystan 
bert
gensim
flair 
word2vec
ensemble (more than one library) 
other
FrameworkVersion Versione del framework di apprendimento automatico. Questo è un valore di testo libero. Ad esempio PyTorch 1.9.
Algorithm La classe di istanza dell'algoritmo o del modello. Questo è un valore di testo libero. Ad esempio, CART algorithm.
Hyperparameters Iperparametri dell'oggetto modello. Formato JSON.
ArtifactTestResults L'output JSON dei test artifact viene eseguito sul lato client.

Esempio

In questo esempio viene illustrato come documentare la tassonomia del modello acquisendo ogni coppia chiave-valore che crea un elenco di oggetti Metadata().

# 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\"}")
]

Tassonomia modello personalizzato

È possibile aggiungere metadati personalizzati per documentare il modello. La dimensione massima consentita per i metadati definiti e personalizzati combinati è di 32000 byte.

Ogni metadati personalizzato ha i seguenti quattro attributi:

Campo o chiave Richiesto? descrizione;
key

Richiesto

La chiave e l'etichetta dei metadati personalizzati.
value

Richiesto

Il valore associato alla chiave.
category

Facoltativo

Categoria dei metadati. Selezionare uno dei cinque valori riportati di seguito.

  • Performance
  • Training Profile
  • Training and Validation Datasets
  • Training Environment
  • other

L'attributo categoria è utile per filtrare i metadati personalizzati. Ciò è utile quando si dispone di un gran numero di metadati personalizzati per un determinato modello.

description

Facoltativo

Descrizione della medata personalizzata.

Esempio

In questo esempio viene illustrato come aggiungere metadati personalizzati per acquisire la precisione del modello, l'ambiente e l'origine dei dati di addestramento.

# 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")
]

Definizione schemi dati modello

È possibile documentare gli schemi di dati di input e output del modello. La definizione dello schema dei dati di input fornisce il progetto del parametro data della funzione predict() del file score.py. È possibile considerare lo schema dei dati di input come la definizione del vettore della funzione di input richiesto dal modello per effettuare previsioni riuscite. La definizione dello schema di output documenta i risultati della funzione predict().

Importante

La dimensione massima consentita per gli schemi di input e output combinati è di 32000 byte.

La definizione dello schema sia per il vettore della funzione di input che per le previsioni del modello viene utilizzata a scopo di documentazione. Questa linea guida si applica solo ai set di dati in formato tabulare.

Lo schema del vettore della funzione di input del modello e delle previsioni di output è un oggetto JSON. L'oggetto dispone di un elenco di livello superiore con una chiave denominata schema. La definizione dello schema di ogni colonna è una voce diversa nella lista.

Suggerimento

È possibile utilizzare ADS per estrarre automaticamente la definizione dello schema da un data set di addestramento specifico.

Per ogni colonna, lo schema può essere definito completamente assegnando valori a tutti questi attributi:

Campo o chiave Digita Richiesto? descrizione;
name STRING

Richiesto

Il nome della colonna.
description STRING

Facoltativo

La descrizione della colonna.
required BOOL

Richiesto

Indica se la colonna è una funzione di input necessaria per eseguire una previsione del modello.
dtype STRING

Richiesto

Il tipo di dati della colonna.
domain OBJECT

Facoltativo

Intervallo di valori consentiti che la funzione può assumere.

Il campo domain è un dizionario contenente le chiavi seguenti:

Campo o chiave Digita Richiesto? descrizione; Note
domain.constraints LIST

Facoltativo

Supporta un elenco di predicati per limitare l'intervallo di valori consentiti per la funzione.

È possibile immettere un modello di espressione di stringa specifico della lingua, che può essere valutato dall'interprete e dal compilatore della lingua. Con Python, il formato stringa dovrebbe seguire STRING.

I vincoli possono essere espressi utilizzando una lista di espressioni. Ad esempio, constraints=[Expression('$x > 5')].

È possibile applicare più di un vincolo.

Esempio di espressione:

  schema:
        - description: Id
          domain:
            constraints: []
            stats:
              25%: 365.75
              50%: 730.5
              75%: 1095.25
              count: 1460.0
              max: 1460.0
              mean: 730.5
              min: 1.0
              std: 421.6100093688479
            values: Discreet numbers
          name: Id
          required: false
          type: int64
        - description: MSSubClass
          domain:
            constraints: []
            stats:
              25%: 20.0
              50%: 50.0
              75%: 70.0
              count: 1460.0
              max: 190.0
              mean: 56.897260273972606
              min: 20.0
              std: 42.300570993810425
            values: Discreet numbers
          name: MSSubClass
          required: false
          type: int64
        - description: MSZoning
          domain:
            constraints:
            - expression: '$x in ["RL", "RM", "C (all)", "FV", "RH"]'
              - RL
              - RM
              - C (all)
              - FV
              - RH
            stats:
              count: 1460
              unique: 5
            values: Category
          name: MSZoning
          required: false
          type: category
domain.stats OBJECT

Facoltativo

Dizionario delle statistiche di riepilogo che descrive la funzione.

Per i tipi float64 e int64:

  • X% (dove X è un valore percentile compreso tra 1 e 99). È possibile acquisire più di un valore percentile)

  • count

  • max

  • mean

  • median

  • min

  • std

Per categoria:

  • count

  • unique

  • mode

In ADS, le statistiche vengono generate automaticamente in base al feature_stat nei tipi di funzione.

domain.values STRING

Facoltativo

Rappresenta il tipo di semantica della colonna. I valori supportati includono i seguenti:

  • numeri discreti

  • numeri

  • Categoria

  • testo libero

domain.name STRING

Facoltativo

Il nome dell'attributo.

domain.dtype STRING

Richiesto

Il tipo di dati Pandas dei dati. Ad esempio:

int64
float
category
datettime
domain.dtype STRING

Richiesto

Tipo di funzione dei dati. Ad esempio:

Category
Integer
LatLong, 

Esempio di schema di dati di input

schema:
- description: Description of the column
  domain:
    constraints:
    - expression: '($x > 10 and $x <100) or ($x < -1 and $x > -500)' # Here user can input language specific string expression template which can be evaluated by the language interpreter/compiler. In case of python the string format expected to follow string.Template recognized format.
      language: python
    stats:  # This section is flexible key value pair. The stats will depend on what user wants to save. By default, the stats will be automatically generated based on the `feature_stat` in feature types
      mean: 20
      median: 21
      min: 5
    values: numbers # The key idea is to communicate what should be the domain of values that are acceptable. Eg rational numbers, discreet numbers, list of values, etc
  name: MSZoing # Name of the attribute
  required: false # If it is a nullable column

Esempio di uno schema di dati di output

{
"predictionschema": [
    {
    "description": "Category of SR",
    "domain": {
    "constraints": [],
    "stats": [],
    "values": "Free text"
    },
    "name": "category",
    "required": true,
    "type": "category"
    }
    ]
}

Test di introspezione del modello

  1. Copiare artifact_introspection_test nell'artifact modello nella directory di livello superiore dell'artifact.
  2. Installare una versione di Python successiva alla 3.5.
  3. Installare le librerie Python pyyaml e requests. Questa installazione è necessaria una sola volta.
  4. Andare alla directory degli artifact e installare i test di introspezione degli artifact.
    python3 -m pip install --user -r artifact_introspection_test/requirements.txt
  5. Impostare il percorso dell'artifact ed eseguire il test di introspezione.
    python3 artifact_introspection_test/model_artifact_validate.py --artifact 

    I test di introspezione generano file test_json_output.json e test_json_output.html locali. Questo è un esempio dei risultati del test di introspezione in formato JSON:

    {
        "score_py": {
            "category": "Mandatory Files Check",
            "description": "Check that the file \"score.py\" exists and is in the top level directory of the artifact directory",
            "error_msg": "File score.py is not present.",
            "success": true
        },
        "runtime_yaml": {
            "category": "Mandatory Files Check",
            "description": "Check that the file \"runtime.yaml\" exists and is in the top level directory of the artifact directory",
            "error_msg": "File runtime.yaml is not present.",
            "success": true
        },
        "score_syntax": {
            "category": "score.py",
            "description": "Check for Python syntax errors",
            "error_msg": "Syntax error in score.py: ",
            "success": true
        },
        "score_load_model": {
            "category": "score.py",
            "description": "Check that load_model() is defined",
            "error_msg": "Function load_model is not present in score.py.",
            "success": true
        },
        "score_predict": {
            "category": "score.py",
            "description": "Check that predict() is defined",
            "error_msg": "Function predict is not present in score.py.",
            "success": true
        },
        "score_predict_data": {
            "category": "score.py",
            "description": "Check that the only required argument for predict() is named \"data\"",
            "error_msg": "Function predict in score.py should have argument named \"data\".",
            "success": true
        },
        "score_predict_arg": {
            "category": "score.py",
            "description": "Check that all other arguments in predict() are optional and have default values",
            "error_msg": "All other arguments in predict function in score.py should have default values.",
            "success": true
        },
        "runtime_version": {
            "category": "runtime.yaml",
            "description": "Check that field MODEL_ARTIFACT_VERSION is set to 3.0",
            "error_msg": "In runtime.yaml field MODEL_ARTIFACT_VERSION should be set to 3.0",
            "success": true
        },
        "runtime_env_type": {
            "category": "conda_env",
            "description": "Check that field MODEL_DEPLOYMENT.INFERENCE_ENV_TYPE is set to a value in (published, data_science)",
            "error_msg": "In runtime.yaml field MODEL_DEPLOYMENT.INFERENCE_ENV_TYPE should be set to a value in (published, data_science)",
            "success": true,
            "value": "published"
        },
        "runtime_env_slug": {
            "category": "conda_env",
            "description": "Check that field MODEL_DEPLOYMENT.INFERENCE_ENV_slug is set",
            "error_msg": "In runtime.yaml field MODEL_DEPLOYMENT.INFERENCE_ENV_slug should be set.",
            "success": true,
            "value": "mlgpuv1"
        },
        "runtime_env_path": {
            "category": "conda_env",
            "description": "Check that field MODEL_DEPLOYMENT.INFERENCE_ENV_PATH is set",
            "error_msg": "In runtime.yaml field MODEL_DEPLOYMENT.INFERENCE_ENV_PATH should be set.",
            "success": true,
            "value": "oci://service_conda_packs@ociodscdev/service_pack/gpu/General Machine Learning for GPUs/1.0/mlgpuv1"
        },
        "runtime_path_exist": {
            "category": "conda_env",
            "description": "If MODEL_DEPLOYMENT.INFERENCE_ENV_TYPE is data_science and MODEL_DEPLOYMENT.INFERENCE_ENV_slug is set, check that the file path in MODEL_DEPLOYMENT.INFERENCE_ENV_PATH is correct.",
            "error_msg": "In runtime.yaml field MODEL_DEPLOYMENT.INFERENCE_ENV_PATH doesn't exist.",
            "success": true
        },
        "runtime_slug_exist": {
            "category": "conda_env",
            "description": "If MODEL_DEPLOYMENT.INFERENCE_ENV_TYPE is data_science, check that the slug listed in MODEL_DEPLOYMENT.INFERENCE_ENV_slug exists.",
            "error_msg": "In runtime.yaml the value of the fileld INFERENCE_ENV_slug doesn't exist in the given bucket."
        }
    }
  6. Ripetere i passaggi 4 e 5 fino a quando non si verificano errori.

Uso di ADS per i test di introspezione

È possibile richiamare l'introspezione manualmente richiamando il metodo .introspect() nell'oggetto ModelArtifact.

rf_model_artifact.introspect()
rf_model_artifact.metadata_taxonomy['ArtifactTestResults']

Il risultato dell'introspezione del modello viene salvato automaticamente nei metadati della tassonomia e negli artifact del modello. L'introspezione del modello viene attivata automaticamente quando viene richiamato il metodo .prepare() per preparare l'artifact del modello.

Il metodo .save() non esegue un'introspezione del modello perché in genere viene eseguita durante la fase di preparazione dell'artifact del modello. Tuttavia, l'impostazione di ignore_introspection su False comporta l'esecuzione dell'introspezione del modello durante l'operazione di salvataggio.