Preparación de metadatos de modelo

Los metadatos del modelo son opcionales, aunque se recomiendan.

Metadatos de procedencia del modelo

Puede documentar la procedencia del modelo. Este paso es opcional. En la siguiente tabla se muestran los metadatos de procedencia del modelo soportados:

Metadatos Descripción
git_branch Rama del repositorio de Git.
git_commit Identificador de confirmación.
repository_url URL del repositorio de Git remoto.
script_dir Ruta local al directorio de artefactos.
training_id

OCID del recurso utilizado para entrenar el modelo, la sesión de bloc de notas o la ejecución del trabajo.

Puede utilizar las siguientes variables de entorno al guardar un modelo con el SDK de OCI:

  • NB_SESSION_OCID

Ejemplo

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

Metadatos de taxonomía del modelo

Puede documentar la taxonomía del modelo. Este paso es opcional.

Los campos de metadatos asociados a la taxonomía del modelo permiten describir el caso de uso y el marco de aprendizaje automático que hay detrás del modelo. Las etiquetas de metadatos definidas son la lista de valores permitidos para el marco y el tipo de caso de uso de los metadatos definidos y los valores de categoría de los metadatos personalizados.

Taxonomía de modelo predefinida

En la siguiente tabla se muestran los metadatos de taxonomía de modelo soportados:

Metadatos Descripción
UseCaseType

Describe el caso de uso de Machine Learning asociado al modelo mediante uno de los valores de la lista, como:

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

Marco de Machine Learning asociado al modelo mediante uno de los valores de la lista, como:

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 Versión del marco de Machine Learning. Este es un valor de texto libre. Por ejemplo, PyTorch 1.9.
Algorithm Algoritmo o clase de instancia de modelo. Este es un valor de texto libre. Por ejemplo, CART algorithm.
Hyperparameters Hiperparámetros del objeto de modelo. Este es un formato JSON.
ArtifactTestResults Salida JSON de las pruebas de artefacto ejecutadas en el cliente.

Ejemplo

En este ejemplo se muestra cómo documentar la taxonomía de modelo capturando cada par clave-valor que crea una lista de objetos 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\"}")
]

Taxonomía de modelo personalizada

Puede agregar sus propios metadatos personalizados para documentar el modelo. El tamaño máximo de archivo permitido para los metadatos combinados definidos y personalizados es de 32 000 bytes.

Cada metadato personalizado tiene estos cuatro atributos:

Campo o clave ¿Necesario? Descripción
key

Necesario

Clave y etiqueta de los metadatos personalizados.
value

Necesario

Valor asociado a la clave.
category

Opcional

Categoría de los metadatos. Seleccione uno de estos cinco valores:

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

El atributo de categoría es útil para filtrar metadatos personalizados. Esto resulta útil cuando hay un gran número de metadatos personalizados para un modelo determinado.

description

Opcional

Descripción de los metadatos personalizados.

Ejemplo

En este ejemplo se muestra cómo puede agregar metadatos personalizados para capturar la precisión del modelo, el entorno y el origen de los datos de entrenamiento:

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

Definición de esquemas de datos de modelo

Puede documentar los esquemas de datos de entrada y salida del modelo. La definición del esquema de datos de entrada proporciona el plan detallado del parámetro data de la función predict() del archivo score.py. Puede pensar en el esquema de datos de entrada como la definición del vector de función de entrada que su modelo necesita para realizar predicciones correctas. La definición de esquema de salida documenta lo que devuelve la función predict().

Importante

El tamaño máximo de archivo permitido para los esquemas de entrada y salida combinados es de 32 000 bytes.

La definición de esquema tanto para el vector de función de entrada como para las predicciones de modelo se utilizan para fines de documentación. Esta directriz se aplica únicamente a juegos de datos tabulares.

El esquema del vector de función de entrada de modelo y las predicciones de salida es un objeto JSON. El objeto tiene una lista de nivel superior con una clave denominada schema. La definición de esquema de cada columna es una entrada diferente en la lista.

Consejo

Puede utilizar ADS para extraer automáticamente la definición de esquema de un juego de datos de entrenamiento específico.

Para cada columna, el esquema se puede definir completamente asignando valores a todos estos atributos:

Campo o clave Tipo ¿Necesario? Descripción
name STRING

Necesario

Nombre de la columna.
description STRING

Opcional

Descripción de la columna.
required BOOL

Necesario

Si la columna es una función de entrada necesaria para realizar una predicción de modelo.
dtype STRING

Necesario

Tipo de dato de la columna.
domain OBJECT

Opcional

Rango de valores permitidos que puede tomar la función.

El campo domain es un diccionario que contiene las siguientes claves:

Campo o clave Tipo ¿Necesario? Descripción Notas
domain.constraints LIST

Opcional

Soporta una lista de predicados para restringir el rango de valores permitidos para la función.

Puede introducir una plantilla de expresión de cadena específica del idioma, la cual puede evaluar el intérprete de idioma y el compilador. Con Python, se espera que el formato de cadena siga a STRING.

Las restricciones se pueden expresar mediante una lista de expresiones. Por ejemplo, constraints=[Expression('$x > 5')].

Puede aplicar más de una restricción.

Ejemplo de una expresión:

  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

Opcional

Diccionario de estadísticas de resumen que describen la función.

Para los tipos float64 y int64:

  • X% (donde X es un valor de percentil entre 1 y 99; se puede capturar más de un valor de percentil)

  • count

  • max

  • mean

  • median

  • min

  • std

Para la categoría:

  • count

  • unique

  • mode

En ADS, las estadísticas se generan automáticamente según feature_stat en los tipos de función.

domain.values STRING

Opcional

Representan el tipo semántico de la columna. Los valores soportados son:

  • discrete numbers

  • numbers

  • Category

  • free text

domain.name STRING

Opcional

Nombre del atributo.

domain.dtype STRING

Necesario

Tipo de datos de Pandas. Por ejemplo:

int64
float
category
datettime
domain.dtype STRING

Necesario

Tipo de función de los datos. Por ejemplo:

Category
Integer
LatLong, 

Ejemplo de un esquema de datos de entrada

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

Ejemplo de un esquema de datos de salida

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

Prueba de introspección de modelo

  1. Copie artifact_introspection_test en el artefacto de modelo en el directorio de nivel superior del artefacto.
  2. Instale una versión de Python superior a 3.5.
  3. Instale las bibliotecas Python pyyaml y requests. Esta instalación solo es necesaria una vez.
  4. Vaya al directorio de artefactos e instale las pruebas de introspección de artefactos.
    python3 -m pip install --user -r artifact_introspection_test/requirements.txt
  5. Defina la ruta de artefacto y ejecute la prueba de introspección.
    python3 artifact_introspection_test/model_artifact_validate.py --artifact 

    Las pruebas de introspección generan archivos test_json_output.json y test_json_output.html locales. Este es un ejemplo de los resultados de la prueba de introspección en 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. Repita los pasos 4 y 5 hasta que no se produzca ningún error.

Uso de ADS para Pruebas de Introspección

Puede llamar a la introspección manualmente llamando al método .introspect() en el objeto ModelArtifact.

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

El resultado de la introspección del modelo se guarda automáticamente en los artefactos de modelo y metadatos de taxonomía. La introspección de modelo se dispara automáticamente cuando se llama al método .prepare() para preparar el artefacto de modelo.

El método .save() no realiza una introspección de modelo porque normalmente se realiza durante la etapa de preparación del artefacto de modelo. Sin embargo, si se define ignore_introspection en False, se realizará la introspección del modelo durante la operación de guardado.