Entender o formato do modelo do MLflow

Concluído

O MLflow usa o formato MLModel para armazenar todos os ativos de modelo relevantes em uma pasta ou diretório. Um arquivo essencial no diretório é o arquivo MLmodel. O arquivo MLmodel é a única fonte de verdade sobre como um modelo deve ser carregado e usado.

Explorar o formato de arquivo MLmodel

O arquivo MLmodel pode incluir:

  • artifact_path: durante o trabalho de treinamento, o modelo é registrado nesse caminho.
  • flavor: biblioteca de machine learning com a qual o modelo foi criado.
  • model_uuid: identificador exclusivo do modelo registrado.
  • run_id: identificador exclusivo da execução de trabalho durante a qual o modelo foi criado.
  • signature: Especifica o esquema das entradas e saídas do modelo:
    • inputs: entrada válida para o modelo. Por exemplo, um subconjunto do conjunto de dados de treinamento.
    • outputs: saída válida do modelo. Por exemplo, previsões de modelo para o conjunto de dados de entrada.

Um exemplo do arquivo MLmodel criado para um modelo de pesquisa visual computacional treinado com fastai pode ser semelhante a:

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

As coisas mais importantes a serem definidas são a variante e a assinatura.

Escolher a variante

Uma variante é a biblioteca de machine learning com a qual o modelo foi criado.

Por exemplo, para criar um modelo de classificação de imagem capaz de detectar o câncer de mama você está usando fastai. O Fastai é uma variante do MLflow que informa como um modelo deve ser persistente e carregado. Como cada variante de modelo indica como deseja persistir e carregar modelos, o formato MLModel não impõe um só mecanismo de serialização a que todos os modelos precisam dar suporte. Essa decisão permite que cada variante use os métodos que proporcionam o melhor desempenho ou o melhor suporte de acordo com as respectivas melhores práticas, sem comprometer a compatibilidade com o padrão MLModel.

A variante Python function é a interface de modelo padrão para modelos criados com base em uma execução do MLflow. Qualquer modelo Python do MLflow pode ser carregado como um modelo python_function, o que permite que fluxos de trabalho como a implantação funcionem com qualquer modelo do Python, independentemente de qual estrutura foi usada para produzir o modelo. Essa interoperabilidade é imensamente poderosa, pois reduz o tempo de operacionalização em vários ambientes.

Um exemplo da variante da função Python pode ser semelhante a:


artifact_path: pipeline
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.8.5
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.2.0
mlflow_version: 2.1.0
model_uuid: b8f9fe56972e48f2b8c958a3afb9c85d
run_id: 596d2e7a-c7ed-4596-a4d2-a30755c0bfa5
signature:
  inputs: '[{"name": "age", "type": "long"}, {"name": "sex", "type": "long"}, {"name":
    "cp", "type": "long"}, {"name": "trestbps", "type": "long"}, {"name": "chol",
    "type": "long"}, {"name": "fbs", "type": "long"}, {"name": "restecg", "type":
    "long"}, {"name": "thalach", "type": "long"}, {"name": "exang", "type": "long"},
    {"name": "oldpeak", "type": "double"}, {"name": "slope", "type": "long"}, {"name":
    "ca", "type": "long"}, {"name": "thal", "type": "string"}]'
  outputs: '[{"name": "target", "type": "long"}]'

Configurar a assinatura

Além das variantes, o arquivo MLmodel também contém assinaturas que servem como contratos de dados entre o modelo e o servidor que executa seu modelo.

Há dois tipos de assinaturas:

  • Baseado em coluna: usado para dados tabulares tendo pandas.Dataframe como entradas.
  • Baseado em Tensor: usado para matrizes ou tensores multidimensionais (geralmente usados para dados não estruturados, como textos ou imagens), tendo numpy.ndarray como entradas.

Como o arquivo MLmodel é criado quando você registra o modelo, a assinatura também é criada quando você registra o modelo. Quando você habilita o registro automático em log do MLflow, a assinatura é inferida da melhor maneira possível. Se você quiser que a assinatura seja diferente, será necessário registrar manualmente o modelo.

As entradas e saídas da assinatura são importantes ao implantar seu modelo. Quando você usa a implantação sem código do Azure Machine Learning para modelos do MLflow, as entradas e saídas definidas na assinatura serão impostas. Em outras palavras, quando você envia dados para um modelo MLflow implantado, as entradas e saídas esperadas precisam corresponder ao esquema, conforme definido na assinatura.

Dica

Saiba mais sobre assinaturas de modelo no MLflow.