Preparando Metadados de Modelo

Os metadados de modelo são opcionais, embora recomendados.

Metadados de Proveniência de Modelo

Você pode documentar a proveniência do modelo. Isso é opcional. A tabela a seguir lista os metadados de proveniência de modelo suportados:

Metadados Descrição
git_branch Ramificação do repositório Git.
git_commit Id de confirmação.
repository_url URL do repositório Git remoto.
script_dir Caminho local para o diretório de artefatos.
training_id

OCID do recurso usado para treinar o modelo, a sessão de notebook ou a execução de job.

Você pode usar essas variáveis de ambiente ao salvar um modelo com o SDK do OCI:

  • NB_SESSION_OCID

Exemplo

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

Metadados de Taxonomia de Modelo

Você pode documentar a taxonomia de modelo. Isso é opcional.

Os campos de metadados associados à taxonomia de modelo permitem descrever o caso de uso e a estrutura de aprendizado de máquina por trás do modelo. As tags de metadados definidas são a lista de valores permitidos para o tipo de caso de uso e o framework para valores definidos de metadados e categoria para metadados personalizados.

Taxonomia de Modelo Predefinida

A tabela a seguir lista os metadados de taxonomia de modelo suportados:

Metadados Descrição
UseCaseType

Descreve o caso de uso de aprendizado de máquina associado ao modelo usando um dos valores listados, 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

O framework de aprendizado de máquina associada ao modelo usando um dos valores listados, 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 A versão do framework de aprendizado de máquina. Esse é um valor de texto livre. Por exemplo, PyTorch 1.9.
Algorithm A classe de instância de algoritmo ou de modelo. Esse é um valor de texto livre. Por exemplo, CART algorithm.
Hyperparameters Os hiperparâmetros do objeto de modelo. Esse é um formato JSON.
ArtifactTestResults A saída JSON dos testes de artefato é executada no cliente.

Exemplo

Esse exemplo mostra como documentar a taxonomia do modelo, capturando cada par de chave/valor que cria uma 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\"}")
]

Taxonomia de Modelo Personalizado

Você pode adicionar seus próprios metadados personalizados para documentar seu modelo. O tamanho máximo de arquivo permitido para os metadados definidos e personalizados combinados é de 32.000 bytes.

Cada metadado personalizado tem estes quatro atributos:

Campo ou Chave 0brigatório? Descrição
key

Obrigatório

A chave e o label dos metadados personalizados.
value

Obrigatório

O valor anexado à chave.
category

Opcional

A categoria dos metadados. Selecione um destes cinco valores:

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

O atributo de categoria é útil para filtrar metadados personalizados. Isso é útil quando há um grande número de metadados personalizados para um determinado modelo.

description

Opcional

Uma descrição dos metadados personalizados.

Exemplo

Este exemplo mostra como você pode adicionar metadados personalizados para capturar a precisão, o ambiente e a origem dos dados de treinamento do modelo:

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

Definição de Esquemas de Dados de Modelo

Você pode documentar os esquemas de dados de entrada e saída do modelo. A definição do esquema de dados de entrada fornece o projeto do parâmetro data da função predict() do arquivo score.py. Você pode considerar o esquema de dados de entrada como a definição do vetor de recurso de entrada que seu modelo exige para fazer previsões bem-sucedidas. A definição do esquema de saída documenta o que a função predict() retorna.

Importante

O tamanho máximo permitido do arquivo para os esquemas de entrada e saída combinados é de 32.000 bytes.

A definição de esquema para previsões de modelo e vetor de recurso de entrada é usada para fins de documentação. Essa diretriz só se aplica a conjuntos de dados tabulares.

O esquema das previsões de saída e vetor de recurso de entrada do modelo é um objeto JSON. O objeto tem uma lista de nível superior com uma chave chamada schema. A definição de esquema de cada coluna é outra entrada na lista.

Dica

Você pode usar o ADS para extrair automaticamente a definição de esquema de um conjunto de dados de treinamento específico.

Para cada coluna, o esquema pode ser totalmente definido pela designação de valores a todos estes atributos:

Campo ou Chave Tipo 0brigatório? Descrição
name STRING

Obrigatório

O nome da coluna.
description STRING

Opcional

A descrição da coluna.
required BOOL

Obrigatório

Se a coluna é um recurso de entrada obrigatório para fazer uma previsão de modelo.
dtype STRING

Obrigatório

O tipo de dados da coluna.
domain OBJECT

Opcional

O intervalo de valores permitidos que o recurso pode aceitar.

O campo domain é um dicionário que contém as seguintes chaves:

Campo ou Chave Tipo 0brigatório? Descrição Observações
domain.constraints LIST

Opcional

Suporta uma lista de predicados para restrições à faixa de valores permitidos para o recurso.

Você pode inserir um modelo de expressão de string específico do idioma, que pode ser avaliado pelo interpretador de idioma e pelo compilador. Com o Python, espera-se que o formato de string siga STRING.

As restrições podem ser expressas usando uma lista de expressões. Por exemplo, constraints=[Expression('$x > 5')].

Você pode aplicar mais de uma restrição.

Exemplo de uma expressão:

  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

Um dicionário de estatísticas resumidas que descreve o recurso.

Para os tipos float64 e int64:

  • X% (em que X é um valor de percentil entre 1 e 99. Mais de um valor de percentil pode ser capturado)

  • count

  • max

  • mean

  • median

  • min

  • std

Para a categoria:

  • count

  • unique

  • mode

No ADS, as estatísticas são geradas automaticamente com base no feature_stat nos tipos de recursos.

domain.values STRING

Opcional

Representam o tipo semântico da coluna. Os valores suportados incluem:

  • números discretos

  • números

  • Categoria

  • texto livre

domain.name STRING

Opcional

Nome do atributo.

domain.dtype STRING

Obrigatório

O tipo de dados Pandas dos dados. Por exemplo:

int64
float
category
datettime
domain.dtype STRING

Obrigatório

O tipo de recurso dos dados. Por exemplo:

Category
Integer
LatLong, 

Exemplo de um Esquema de Dados 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

Exemplo de Esquema de Dados de Saída

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

Teste de Introsão de Modelo

  1. Copie o artifact_introspection_test no artefato de modelo para o diretório de nível superior do artefato.
  2. Instale uma versão do Python maior que 3.5.
  3. Instale as bibliotecas Python pyyaml e requests. Esta instalação é necessária apenas uma vez.
  4. Vá para o diretório de artefatos e instale os testes de introspecção do artefato.
    python3 -m pip install --user -r artifact_introspection_test/requirements.txt
  5. Defina o caminho do artefato e execute o teste de introspecção.
    python3 artifact_introspection_test/model_artifact_validate.py --artifact 

    Os testes de introspecção geram arquivos test_json_output.json e test_json_output.html locais. Este é um exemplo dos resultados do teste de introspecção no 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 as etapas 4 e 5 até que nenhum erro ocorra.

Usando o ADS para Teste de Introspecção

Você pode chamar a introspecção manualmente chamando o método .introspect() no objeto ModelArtifact.

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

O resultado da introspecção do modelo é salvo automaticamente nos metadados de taxonomia e nos artefatos de modelo. A introspecção de modelo é acionada automaticamente quando o método .prepare() é chamado para preparar o artefato de modelo.

O método .save() não executa uma introspecção de modelo porque isso normalmente é feito durante o estágio de preparação do artefato de modelo. No entanto, a definição de ignore_introspection como False faz com que a introspecção do modelo seja executada durante a operação de salvamento.