Diretrizes para implantar modelos do MLflow

APLICA-SE A:Extensão do ML da CLI do Azure v2 (atual)

Neste artigo, saiba mais sobre a implantação de modelos do MLflow no Azure Machine Learning para inferência em tempo real e em lote. Saiba também sobre as diferentes ferramentas que podem ser usadas para gerenciar a implantação.

Implantação de modelos do MLflow versus modelos personalizados

Ao contrário da implantação de modelo personalizado no Azure Machine Learning, ao implantar modelos do MLflow no Azure Machine Learning, não é necessário fornecer um script de pontuação ou um ambiente para implantação. Em vez disso, o Azure Machine Learning gera automaticamente o script de pontuação e o ambiente para você. Essa funcionalidade é chamada de implantação sem código.

Para a implantação sem código, o Azure Machine Learning:

  • Garante que todas as dependências de pacote indicadas no modelo do MLflow sejam atendidas.
  • Fornece uma imagem base do MLflow ou do ambiente coletado que contém os seguintes itens:
    • Pacotes necessários para que o Azure Machine Learning execute inferência, incluindo mlflow-skinny.
    • Um script de pontuação para executar a inferência.

Dica

Workspaces sem acesso à rede pública: antes de implantar modelos do MLflow em pontos de extremidade online sem conectividade de saída, você precisa empacotar os modelos (versão prévia). Usando o empacotamento de modelo, você pode evitar a necessidade de uma conexão com a Internet, o que, de outro modo, o Azure Machine Learning exigirá para instalar dinamicamente os pacotes do Python necessários para os modelos do MLflow.

Pacotes e dependências de Python

O Azure Machine Learning gera automaticamente ambientes para executar a inferência de modelos no MLflow. Para criar os ambientes, o Azure Machine Learning faz a leitura das dependências do Conda especificadas no modelo do MLflow e adiciona todos os pacotes necessários para executar o servidor de inferência. Esses pacotes extras variam, dependendo do tipo de implantação.

O arquivo conda.yaml a seguir mostra um exemplo de dependências do Conda especificadas em um modelo de MLflow.

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

Aviso

O MLflow detecta automaticamente pacotes ao registrar um modelo e fixa as versões do pacote nas dependências do Conda do modelo. No entanto, essa detecção automática de pacotes pode nem sempre refletir suas intenções ou requisitos. Nesses casos, considere registrar modelos com uma definição personalizada de dependências do Conda.

Implicações do uso de modelos com assinaturas

Os modelos do MLflow podem incluir uma assinatura que indica as entradas esperadas e seus tipos. Quando esses modelos são implantados em pontos de extremidade online ou em lotes, o Azure Machine Learning impõe que o número e os tipos de entradas de dados estejam em conformidade com a assinatura. Se os dados de entrada não puderem ser analisados conforme esperado, a invocação do modelo falhará.

Inspecione a assinatura de um modelo do MLflow abrindo o arquivo MLmodel associado ao modelo. Para obter mais detalhes sobre como as assinaturas funcionam no MLflow, consulte Assinaturas no MLflow.

O arquivo a seguir mostra o arquivo MLmodel associado a um modelo do MLflow.

MLmodel

artifact_path: model
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.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

Dica

As assinaturas em modelos MLflow são opcionais, mas altamente recomendadas, pois fornecem uma maneira conveniente de detectar antecipadamente problemas de compatibilidade de dados. Para obter mais informações sobre como registrar modelos com assinaturas, consulte Como registrar modelos com uma assinatura, ambiente ou amostras personalizados.

Modelos implantados no Azure Machine Learning versus modelos implantados no servidor interno do MLflow

O MLflow inclui ferramentas de implantação internas que desenvolvedores de modelo podem usar para testar modelos localmente. Por exemplo, execute uma instância local de um modelo registrado no registro do servidor do MLflow usando o mlflow models serve -m my_model ou usando a mlflow models predict CLI do MLflow.

Inferência em lote versus pontos de extremidade online

O Azure Machine Learning dá suporte à implantação de modelos em pontos de extremidade online e de lote. Esses pontos de extremidade executam diferentes tecnologias de inferência que podem ter recursos distintos.

Os pontos de extremidade online são semelhantes ao servidor integrado do MLflow, pois fornecem uma maneira escalonável, síncrona e leve de executar modelos para inferência.

Por outro lado, os pontos de extremidade em lote podem executar inferência assíncrona em processos de inferência de execução prolongada, que podem escalar para grandes quantidades de dados. Atualmente, o servidor MLflow não tem essa funcionalidade, embora uma funcionalidade semelhante possa ser obtida usando trabalhos do Spark. Para saber mais sobre pontos de extremidade em lote e modelos do MLflow, consulte Usar modelos do MLflow em implantações em lote.

As seções que seguem se concentram mais nos modelos do MLflow implantados nos pontos de extremidade online do Azure Machine Learning.

Formatos de entrada

Tipo de entrada Servidor interno do MLflow Pontos de extremidade online do Azure Machine Learning
DataFrames de pandas serializados por JSON na orientação dividida
DataFrames de pandas serializados por JSON na orientação de registros Preterido
DataFrames de pandas serializados em CSV Usar o lote1
Formato de entrada tensor como listas serializadas por JSON (tensores) e dicionário de listas (tensores nomeados)
Entrada de tensor formatada como na API do TF Serving

1 Considere usar a inferência em lote para processar arquivos. Para obter mais informações, confira Implantar modelos do MLflow em pontos de extremidade em lote.

Estrutura de entrada

Independentemente do tipo de entrada usado, o Azure Machine Learning requer que você forneça entradas em um conteúdo JSON, dentro da chave do dicionário input_data. Como essa chave não é necessária ao usar o comando mlflow models serve para atender modelos, os conteúdos não podem ser usados de forma intercambiável para pontos de extremidade online do Azure Machine Learning e para o servidor interno do MLflow.

Importante

Aviso do MLflow 2.0: observe que a estrutura do conteúdo mudou no MLflow 2.0.

Esta seção mostra exemplos de conteúdo diferentes e as diferenças para um modelo implantado no servidor interno do MLflow em comparação com o servidor de inferência do Azure Machine Learning.

Exemplo de conteúdo para um DataFrame de pandas serializados por JSON na orientação dividida

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

Exemplo de conteúdo para uma entrada de tensor

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

Exemplo de conteúdo para uma entrada nomeada de tensor

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

Para obter mais informações sobre as ferramentas de implantação internas do MLflow, consulte as Ferramentas de implantação internas na documentação do MLflow.

Personalizar a inferência ao implantar modelos do MLflow

Você talvez esteja acostumado a criar scripts de criação para personalizar como a inferência é executada para seus modelos personalizados. No entanto, ao implantar modelos do MLflow no Azure Machine Learning, a decisão sobre como a inferência deve ser executada é feita pelo construtor do modelo (a pessoa que criou o modelo) e não pelo engenheiro de DevOps (a pessoa que está tentando implantá-lo). Cada estrutura de modelo pode aplicar automaticamente rotinas de inferência específicas.

A qualquer momento, caso precise alterar a forma como a inferência de um modelo do MLflow é executada, faça uma dessas duas coisas:

  • Altere a forma como seu modelo está sendo registrado na rotina de treinamento.
  • Personalize a inferência com um script de pontuação no momento da implantação.

Alterar como o modelo é registrado durante o treinamento

Ao registrar um modelo usando mlflow.autolog ou mlflow.<flavor>.log_model, a variante usada para o modelo decide como a inferência deve ser executada e o que é retornado pelo modelo. O MLflow não impõe um comportamento específico para a forma como a função predict() gera resultados.

Em alguns casos, no entanto, talvez você queira fazer algum pré-processamento ou pós-processamento antes e depois de seu modelo ser executado. Em outras ocasiões, talvez você queira alterar o que é retornado (por exemplo, probabilidades versus classes). Uma solução é implementar pipelines de aprendizado de máquina que passam de entradas para saídas diretamente. Por exemplo, sklearn.pipeline.Pipeline ou pyspark.ml.Pipeline são maneiras populares de implementar pipelines e, às vezes, são recomendadas para considerações de desempenho. Outra alternativa é personalizar como seu modelo faz a inferência, usando uma variante de modelo personalizada.

Personalizar a inferência com um script de pontuação

Embora os modelos do MLflow não exijam um script de pontuação, você ainda pode fornecer um, se necessário. Use o script de pontuação para personalizar como a inferência é executada para modelos do MLflow. Para obter mais informações sobre como personalizar a inferência, consulte Personalizar as implantações de modelo do MLflow (pontos de extremidade online) e Personalizar as implantações de modelo do MLflow (pontos de extremidade em lote).

Importante

Se optar por especificar um script de pontuação para uma implantação de modelo do MLflow, você também precisará fornecer um ambiente para a implantação.

Ferramentas de implantação

O Azure Machine Learning oferece várias maneiras de implantar modelos do MLflow em pontos de extremidade online e de lote. É possível implantar modelos usando as seguintes ferramentas:

  • MLflow SDK
  • CLI do Azure Machine Learning
  • SDK do Azure Machine Learning para Python
  • Azure Machine Learning Studio

Cada fluxo de trabalho tem funcionalidades diferentes, especialmente com relação a qual tipo de computação elas podem direcionar. A tabela a seguir mostra os diferentes recursos.

Cenário MLflow SDK CLI/SDK do Azure Machine Learning Azure Machine Learning Studio
Implantar em pontos de extremidade gerenciados Confira o exemplo1 Confira o exemplo1 Confira o exemplo1
Implantar em pontos de extremidade online gerenciados (com um script de pontuação) Sem suporte3 Confira o exemplo Confira o exemplo
Implantar em pontos de extremidade de lote Sem suporte3 Confira o exemplo Confira o exemplo
Implantar em pontos de extremidade de lote (com um script de pontuação) Sem suporte3 Confira o exemplo Confira o exemplo
Implantar em serviços Web (ACI/AKS) Suporte herdado2 Sem suporte2 Sem suporte2
Implantar em serviços Web (ACI/AKS – com um script de pontuação) Sem suporte3 Suporte herdado2 Suporte herdado2

1 A implantação em pontos de extremidade online que estão em workspaces com link privado habilitado requer que você empacote modelos antes da implantação (versão prévia).

2 Em vez disso, recomendamos mudar para nossos pontos de extremidade online gerenciados.

3 O MLflow (OSS) não tem o conceito de um script de pontuação e não tem suporte para execução em lote no momento.

Qual ferramenta de implantação usar?

  • Use o SDK do MLflow se ambas as condições se aplicarem:

    • Você está familiarizado com o MLflow ou está usando uma plataforma que dá suporte ao MLflow nativamente (como o Azure Databricks).
    • Você deseja continuar usando o mesmo conjunto de métodos do MLflow.
  • Use a CLI do Azure Machine Learning v2, se qualquer uma dessas condições se aplicar:

    • Você está mais familiarizado com a CLI do Azure Machine Learning v2.
    • Você deseja automatizar implantações usando pipelines de automação.
    • Você deseja manter a configuração de implantação em um repositório do Git.
  • Use a implementação da interface do usuário do Estúdio do Azure Machine Learning, se quiser implementar e testar rapidamente modelos treinados com o MLflow.