Partilhar via


Implantar modelos MLflow em implantações em lote no Azure Machine Learning

APLICA-SE A:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

Este artigo descreve como implantar modelos MLflow no Azure Machine Learning para inferência em lote usando pontos de extremidade em lote. Quando você implanta modelos MLflow em pontos de extremidade em lote, o Aprendizado de Máquina do Azure conclui as seguintes tarefas:

  • Fornece uma imagem base MLflow ou um ambiente curado que contém as dependências necessárias para executar um trabalho em lote de Aprendizado de Máquina.
  • Cria um pipeline de trabalho em lote com um script de pontuação para você que pode ser usado para processar dados usando paralelização.

Para obter mais informações sobre os tipos de arquivo de entrada suportados e detalhes sobre como o modelo MLflow funciona, consulte Considerações para implantação na inferência em lote.

Pré-requisitos

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

  • Uma área de trabalho do Azure Machine Learning. Para criar um espaço de trabalho, consulte Gerenciar espaços de trabalho do Azure Machine Learning.

  • As seguintes permissões no espaço de trabalho do Azure Machine Learning:

    • Para criar ou gerenciar pontos de extremidade e implantações em lote: use um Proprietário, Colaborador ou função personalizada que tenha recebido as Microsoft.MachineLearningServices/workspaces/batchEndpoints/* permissões.
    • Para criar implantações do Azure Resource Manager no grupo de recursos do espaço de trabalho: use um Proprietário, Colaborador ou função personalizada à qual tenha sido atribuída a Microsoft.Resources/deployments/write permissão no grupo de recursos em que o espaço de trabalho está implantado.
  • A CLI do Azure Machine Learning ou o SDK do Azure Machine Learning para Python:

    Execute o seguinte comando para instalar a CLI do Azure e a extensão para o ml Azure Machine Learning:

    az extension add -n ml
    

    As implantações de componentes de pipeline para pontos de extremidade em lote são introduzidas na versão 2.7 da ml extensão para a CLI do Azure. Use o az extension update --name ml comando para obter a versão mais recente.


Ligar à sua área de trabalho

O espaço de trabalho é o recurso de nível superior para o Azure Machine Learning. Ele fornece um local centralizado para trabalhar com todos os artefatos que você cria quando usa o Azure Machine Learning. Nesta seção, você se conecta ao espaço de trabalho onde executa suas tarefas de implantação.

No comando a seguir, insira sua ID de assinatura, nome do espaço de trabalho, nome do grupo de recursos e local:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Explore o exemplo

O exemplo neste artigo mostra como implantar um modelo MLflow em um ponto de extremidade de lote para executar previsões em lote. O modelo MLflow é baseado no UCI Heart Disease Data set. O banco de dados contém 76 atributos, mas o exemplo usa apenas um subconjunto de 14. O modelo tenta prever a presença de doença cardíaca em um paciente com um valor inteiro de 0 (sem presença) a 1 (presença).

O modelo é treinado usando um XGBBoost classificador. Todo o pré-processamento necessário é empacotado como um scikit-learn pipeline, o que torna o modelo um pipeline de ponta a ponta que vai de dados brutos a previsões.

O exemplo neste artigo é baseado em exemplos de código contidos no repositório azureml-examples . Para executar os comandos localmente sem ter que copiar ou colar YAML e outros arquivos, use os seguintes comandos para clonar o repositório e vá para a pasta para sua linguagem de codificação:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Os arquivos para este exemplo estão localizados na seguinte pasta:

cd endpoints/batch/deploy-models/heart-classifier-mlflow

Acompanhe em Jupyter Notebooks

Você pode acompanhar este exemplo usando um Jupyter Notebook público. No repositório clonado, abra o bloco de anotações mlflow-for-batch-tabular.ipynb .

Implantar o modelo MLflow

Nesta seção, você implanta um modelo MLflow em um ponto de extremidade em lote para que possa executar a inferência em lote sobre novos dados. Antes de avançar com a implantação, você precisa garantir que seu modelo esteja registrado e que haja um cluster de computação disponível no espaço de trabalho.

Registar o modelo

Os pontos de extremidade em lote só podem implantar modelos registrados. Neste artigo, você usa uma cópia local do modelo no repositório. Como resultado, você só precisa publicar o modelo no registro no espaço de trabalho.

Nota

Se o modelo que você está implantando já estiver registrado, você poderá continuar para a seção Criar cluster de computação.

Registre o modelo executando o seguinte comando:

MODEL_NAME='heart-classifier-mlflow'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

Criar cluster de computação

Você precisa garantir que as implantações em lote possam ser executadas em alguma infraestrutura disponível (computação). As implantações em lote podem ser executadas em qualquer computação de Aprendizado de Máquina que já exista no espaço de trabalho. Várias implantações em lote podem compartilhar a mesma infraestrutura de computação.

Neste artigo, você trabalha em um cluster de computação de Aprendizado de Máquina chamado cpu-cluster. O exemplo a seguir verifica se existe uma computação no espaço de trabalho ou cria uma nova computação.

Crie um cluster de computação:

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Criar ponto de extremidade em lote

Para criar um ponto de extremidade, você precisa de um nome e uma descrição. O nome do ponto de extremidade aparece no URI associado ao seu ponto de extremidade, portanto, ele precisa ser exclusivo dentro de uma região do Azure. Por exemplo, pode haver apenas um ponto de extremidade de lote com o nome mybatchendpoint na região WestUS2.

  1. Coloque o nome do ponto de extremidade em uma variável para fácil referência mais tarde:

    Execute o seguinte comando:

    ENDPOINT_NAME="heart-classifier"
    
  2. Crie o ponto de extremidade:

    1. Para criar um novo ponto de extremidade, crie uma YAML configuração como o código a seguir:

      endpoint.yml

      $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
      name: heart-classifier-batch
      description: A heart condition classifier for batch inference
      auth_mode: aad_token
      
    2. Crie o ponto de extremidade com o seguinte comando:

      az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
      

Criar implantação em lote

Os modelos MLflow não exigem que você indique um ambiente ou script de pontuação ao criar a implantação. O ambiente ou script de pontuação é criado para você automaticamente. No entanto, você pode especificar o ambiente ou o script de pontuação se quiser personalizar como a implantação faz inferência.

  1. Para criar uma nova implantação sob o ponto de extremidade criado, crie uma YAML configuração conforme mostrado no código a seguir. Você pode verificar o esquema YAML do ponto de extremidade de lote completo para obter propriedades extras.

    implantação-simples/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-mlflow
    description: A heart condition classifier based on XGBoost
    type: model
    model: azureml:heart-classifier-mlflow@latest
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    
  2. Crie a implantação com o seguinte comando:

    az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    

Importante

Configure o timeout valor em sua implantação com base em quanto tempo leva para seu modelo executar a inferência em um único lote. Quanto maior o tamanho do lote, maior o timeout valor. Lembre-se de que o mini_batch_size valor indica o número de arquivos em um lote e não o número de amostras. Quando você trabalha com dados tabulares, cada arquivo pode conter várias linhas, o que aumenta o tempo necessário para o ponto de extremidade em lote processar cada arquivo. Nesses casos, use valores altos timeout para evitar erros de tempo limite.

Invoque o ponto de extremidade

Embora você possa invocar uma implantação específica dentro de um ponto de extremidade, é comum invocar o próprio ponto de extremidade e permitir que o ponto de extremidade decida qual implantação usar. Esse tipo de implantação é chamado de implantação "padrão". Essa abordagem permite alterar a implantação padrão, o que permite alterar o modelo que serve a implantação sem alterar o contrato com o usuário que invoca o ponto de extremidade.

Use as seguintes instruções para atualizar a implantação padrão:

DEPLOYMENT_NAME="classifier-xgboost-mlflow"
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

O ponto de extremidade em lote agora está pronto para uso.

Testar a implementação

Para testar seu ponto de extremidade, use uma amostra de dados não rotulados localizados neste repositório que podem ser usados com o modelo. Os pontos de extremidade em lote só podem processar dados localizados na nuvem e acessíveis a partir do espaço de trabalho do Aprendizado de Máquina. Neste exemplo, você carrega o exemplo em um armazenamento de dados do Machine Learning. Você cria um ativo de dados que pode ser usado para invocar o ponto de extremidade para pontuação. Lembre-se de que os pontos de extremidade em lote aceitam dados que podem ser colocados em vários locais.

  1. Primeiro, crie o ativo de dados. O ativo de dados consiste em uma pasta com vários arquivos CSV que queremos processar em paralelo usando pontos de extremidade em lote. Você pode pular esta etapa se seus dados já estiverem registrados como um ativo de dados ou se você quiser usar um tipo de entrada diferente.

    1. Crie uma definição de ativo de dados no YAML:

      heart-dataset-unlabeled.yml

      $schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
      name: heart-dataset-unlabeled
      description: An unlabeled dataset for heart classification.
      type: uri_folder
      path: data
      
    2. Crie o ativo de dados:

      az ml data create -f heart-dataset-unlabeled.yml
      
  2. Depois de carregar os dados, invoque o ponto de extremidade.

    Gorjeta

    Nos comandos a seguir, observe que o nome da implantação não é indicado na invoke operação. O ponto de extremidade roteia automaticamente o trabalho para a implantação padrão porque o ponto de extremidade tem apenas uma implantação. Você pode direcionar uma implantação específica indicando o argumento/parâmetro deployment_name.

    Execute o seguinte comando:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
    

    Nota

    O utilitário jq pode não estar instalado em todas as instalações. Para obter instruções de instalação, consulte Download jq.

  3. Um trabalho em lote é iniciado assim que o comando retorna. Você pode monitorar o status do trabalho até que ele termine:

    Execute o seguinte comando:

    az ml job show -n $JOB_NAME --web
    

Analise saídas

As previsões de saída são geradas no arquivo predictions.csv , conforme indicado na configuração de implantação. O trabalho gera uma saída chamada score, onde esse arquivo é colocado. Apenas um arquivo é gerado por trabalho em lote.

O ficheiro está estruturado da seguinte forma:

  • Uma linha por cada ponto de dados enviado para o modelo. Para dados tabulares, o predictions.csv de arquivo contém uma linha para cada linha presente em cada arquivo processado. Para outros tipos de dados (imagens, áudio, texto), há uma linha por cada arquivo processado.

  • As seguintes colunas estão no arquivo (na ordem especificada):

    • row (opcional): O índice de linha correspondente no arquivo de dados de entrada. Esta coluna aplica-se apenas se os dados de entrada forem tabulares. As previsões são retornadas na mesma ordem em que aparecem no arquivo de entrada. Você pode confiar no número da linha para corresponder à previsão correspondente.

    • prediction: A previsão associada aos dados de entrada. Esse valor é retornado "no estado em que se encontra", pois foi fornecido pela função do predict(). modelo.

    • file_name: O nome do arquivo onde os dados são lidos. Em dados tabulares, use este campo para determinar qual previsão pertence a cada dado de entrada.

Você pode baixar os resultados do trabalho usando o nome do trabalho.

Para baixar as previsões, use o seguinte comando:

az ml job download --name $JOB_NAME --output-name score --download-path ./

Depois de baixar o arquivo, você pode abri-lo com sua ferramenta de edição preferida. O exemplo a seguir carrega as previsões usando um Pandas dataframe.

import pandas as pd

score = pd.read_csv(
    "named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)

A saída exibe uma tabela:

Linha Previsão Ficheiro
0 0 heart-unlabeled-0.csv
1 1 heart-unlabeled-0.csv
2 0 heart-unlabeled-0.csv
... ... ...
307 0 heart-unlabeled-3.csv

Gorjeta

Observe que, neste exemplo, os dados de entrada contêm dados tabulares no formato CSV. Há quatro arquivos de entrada diferentes: heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv e heart-unlabeled-3.csv.

Revisar considerações para inferência em lote

O Machine Learning suporta a implantação de modelos MLflow em pontos de extremidade em lote sem indicar um script de pontuação. Essa abordagem é uma maneira conveniente de implantar modelos que exigem o processamento de grandes quantidades de dados, semelhante ao processamento em lote. O Machine Learning usa informações na especificação do modelo MLflow para orquestrar o processo de inferência.

Explorar a distribuição do trabalho sobre os trabalhadores

Os pontos de extremidade em lote distribuem o trabalho no nível do arquivo, para dados estruturados e não estruturados. Como consequência, apenas arquivos URI e pastas URI são suportados para esse recurso. Cada trabalhador processa lotes de Mini batch size arquivos de cada vez. Para dados tabulares, os pontos de extremidade em lote não levam em conta o número de linhas dentro de cada arquivo ao distribuir o trabalho.

Aviso

As estruturas de pastas aninhadas não são exploradas durante a inferência. Se você particionar seus dados usando pastas, certifique-se de nivelar a estrutura antes de prosseguir.

As implantações em lote chamam a predict função do modelo MLflow uma vez por arquivo. Para arquivos CSV com várias linhas, essa ação pode impor uma pressão de memória na computação subjacente. O comportamento pode aumentar o tempo que o modelo leva para marcar um único arquivo, especialmente para modelos caros, como modelos de linguagem grande. Se você encontrar várias exceções de falta de memória ou entradas de tempo limite em logs, considere dividir os dados em arquivos menores com menos linhas ou implementar o processamento em lote no nível da linha dentro do script de pontuação do modelo.

Revisar o suporte para tipos de arquivo

Os seguintes tipos de dados são suportados para inferência em lote ao implantar modelos MLflow sem um ambiente ou script de pontuação. Para processar um tipo de arquivo diferente ou executar a inferência de forma diferente, você pode criar a implantação personalizando a implantação do modelo MLflow com um script de pontuação.

Extensão de nome de ficheiro Tipo retornado como entrada de modelo Requisito de assinatura
.csv, .parquet, .pqt pd.DataFrame ColSpec. Se não for fornecida, a digitação de colunas não será imposta.
.png, .jpg, .jpeg, .tiff, .bmp, .gif np.ndarray TensorSpec. A entrada é remodelada para corresponder à forma dos tensores, se disponível. Se nenhuma assinatura estiver disponível, tensores do tipo np.uint8 são inferidos. Para obter mais informações, consulte Considerações sobre modelos MLflow que processam imagens.

Aviso

Qualquer arquivo sem suporte que possa estar presente nos dados de entrada faz com que o trabalho falhe. Nesses casos, você verá um erro semelhante a ERROR:azureml:Error processando o arquivo de entrada: '/mnt/batch/tasks/.../a-given-file.avro'. O tipo de ficheiro 'avro' não é suportado.

Compreender a imposição de assinatura para modelos MLflow

Os trabalhos de implantação em lote impõem os tipos de dados de entrada enquanto lêem os dados usando a assinatura de modelo MLflow disponível. Como resultado, sua entrada de dados está em conformidade com os tipos indicados na assinatura do modelo. Se os dados não puderem ser analisados conforme o esperado, o trabalho falhará com um erro semelhante a ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv'. Exceção: literal inválido para int() com base 10: 'value'.

Gorjeta

As assinaturas em modelos MLflow são opcionais, mas são altamente incentivadas. Eles fornecem uma maneira conveniente para a deteção precoce de problemas de compatibilidade de dados. Para obter mais informações sobre como registrar modelos com assinaturas, consulte Registrando modelos com uma assinatura, ambiente ou exemplos personalizados.

Você pode inspecionar a assinatura do modelo abrindo o arquivo associado ao MLmodel modelo MLflow. Para obter mais informações sobre como as assinaturas funcionam no MLflow, consulte Assinaturas no MLflow.

Examinar o suporte de sabor

As implantações em lote suportam a implantação de modelos MLflow apenas com um pyfunc sabor. Para implantar um sabor diferente, consulte Personalizar a implantação do modelo com script de pontuação.

Personalize a implantação do modelo com script de pontuação

Os modelos MLflow podem ser implantados em pontos de extremidade em lote sem indicar um script de pontuação na definição de implantação. No entanto, você pode optar por indicar esse arquivo (comumente chamado de driver em lote) para personalizar a execução de inferência.

Normalmente, você seleciona esse fluxo de trabalho para os seguintes cenários:

  • Tipos de arquivo de processo não suportados por implantações em lote de implantações MLflow.
  • Personalize como o modelo é executado, como usar um sabor específico para carregá-lo com a mlflow.<flavor>.load() função.
  • Conclua o pré ou pós-processamento em sua rotina de pontuação, quando não concluído pelo próprio modelo.
  • Ajuste a apresentação do modelo que não se apresenta bem com dados tabulares, como um gráfico tensor que representa uma imagem.
  • Permita que o modelo leia dados em partes porque não pode processar cada arquivo de uma só vez devido a restrições de memória.

Importante

Para indicar um script de pontuação para uma implantação de modelo MLflow, você precisa especificar o ambiente onde a implantação é executada.

Use o script de pontuação

Use as seguintes etapas para implantar um modelo MLflow com um script de pontuação personalizado:

  1. Identifique a pasta onde seu modelo MLflow está colocado.

    1. No portal do Azure Machine Learning, navegue até Modelos.

    2. Selecione o modelo a ser implantado e, em seguida, selecione a guia Artefatos .

    3. Anote a pasta exibida. Esta pasta foi indicada quando o modelo foi registado.

      Captura de tela que mostra a pasta onde os artefatos de modelo são colocados.

  2. Crie um script de pontuação. Observe como o nome model da pasta anterior é incluído na init() função.

    deployment-custom/código/batch_driver.py

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license.
    
    import os
    import glob
    import mlflow
    import pandas as pd
    import logging
    
    
    def init():
        global model
        global model_input_types
        global model_output_names
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        # Please provide your model's folder name if there's one
        model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0]
    
        # Load the model, it's input types and output names
        model = mlflow.pyfunc.load(model_path)
        if model.metadata and model.metadata.signature:
            if model.metadata.signature.inputs:
                model_input_types = dict(
                    zip(
                        model.metadata.signature.inputs.input_names(),
                        model.metadata.signature.inputs.pandas_types(),
                    )
                )
            if model.metadata.signature.outputs:
                if model.metadata.signature.outputs.has_input_names():
                    model_output_names = model.metadata.signature.outputs.input_names()
                elif len(model.metadata.signature.outputs.input_names()) == 1:
                    model_output_names = ["prediction"]
        else:
            logging.warning(
                "Model doesn't contain a signature. Input data types won't be enforced."
            )
    
    
    def run(mini_batch):
        print(f"run method start: {__file__}, run({len(mini_batch)} files)")
    
        data = pd.concat(
            map(
                lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch
            )
        )
    
        if model_input_types:
            data = data.astype(model_input_types)
    
        # Predict over the input data, minus the column filename which is not part of the model.
        pred = model.predict(data.drop("filename", axis=1))
    
        if pred is not pd.DataFrame:
            if not model_output_names:
                model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])]
            pred = pd.DataFrame(pred, columns=model_output_names)
    
        return pd.concat([data, pred], axis=1)
    
  3. Crie um ambiente onde o script de pontuação possa ser executado. Como o modelo neste exemplo é MLflow, os requisitos de conda também são especificados no pacote do modelo. Para obter mais informações sobre modelos MLflow e os arquivos incluídos, consulte O formato MLmodel.

    Nesta etapa, você cria o ambiente usando as dependências conda do arquivo. Você também precisa incluir o azureml-core pacote, que é necessário para implantações em lote.

    Gorjeta

    Se o seu modelo já estiver registado no registo do modelo, pode transferir e copiar o ficheiro associado ao conda.yml seu modelo. O arquivo está disponível no estúdio do Azure Machine Learning em Modelos>Selecione seu modelo na lista>Artefatos. Na pasta raiz, selecione o conda.yml arquivo e, em seguida, selecione Baixar ou copiar seu conteúdo.

    Importante

    Este exemplo usa um ambiente conda especificado em /heart-classifier-mlflow/environment/conda.yaml. Este arquivo foi criado combinando o arquivo de dependências conda MLflow original e adicionando o azureml-core pacote. Não é possível usar o conda.yml arquivo diretamente do modelo.

    A definição de ambiente é incluída na própria definição de implantação como um ambiente anônimo. Você verá as seguintes linhas na implantação:

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  4. Configure a implantação:

    Para criar uma nova implantação sob o ponto de extremidade criado, crie uma YAML configuração conforme mostrado no trecho de código a seguir. Você pode verificar o esquema YAML do ponto de extremidade de lote completo para obter propriedades extras.

    Implantação-Custom/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-custom
    description: A heart condition classifier based on XGBoost
    type: model
    model: azureml:heart-classifier-mlflow@latest
    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    
  5. Crie a implantação:

    Execute o seguinte código:

    az ml batch-deployment create --file deployment-custom/deployment.yml --endpoint-name $ENDPOINT_NAME
    

O ponto de extremidade em lote agora está pronto para uso.

Clean up resources (Limpar recursos)

Depois de concluir o exercício, exclua os recursos que não são mais necessários.

Execute o seguinte código para excluir o ponto de extremidade em lote e todas as implantações subjacentes:

az ml batch-endpoint delete --name $ENDPOINT_NAME --yes

Este comando não exclui trabalhos de pontuação em lote.