Implantar modelos de MLflow em pontos de extremidade online

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

Neste artigo, aprenda a implantar o modelo de MLflow e um ponto de extremidade online para inferência em tempo real. Ao implantar o modelo do MLflow em um ponto de extremidade online, não é necessário especificar um script de pontuação ou um ambiente; essa funcionalidade é conhecida como implantação sem código.

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

  • Instala dinamicamente os pacotes do Python fornecidos no arquivo conda.yaml. Portanto, as dependências são instaladas durante o runtime do contêiner.
  • Fornece uma imagem base/ambiente coletado do MLflow que contém os seguintes itens:

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.

Sobre o exemplo

O exemplo mostra como você pode implantar um modelo do MLflow em um ponto de extremidade online para executar previsões. O exemplo usa um modelo do MLflow baseado no conjunto de dados Diabetes. Esse conjunto de dados contém dez variáveis de linha de base: idade, sexo, índice de massa corporal, pressão arterial média e seis medidas de soro sanguíneo obtidas de 442 pacientes com diabetes. Também contém a resposta de interesse, uma medida quantitativa da progressão da doença um ano após a linha de base.

O modelo foi treinado usando um regressor scikit-learn, e todo o pré-processamento necessário foi empacotado como um pipeline, tornando esse modelo um pipeline de ponta a ponta que vai de dados brutos a previsões.

As informações deste artigo se baseiam em exemplos de código contidos no repositório azureml-examples. Para executar os comandos localmente sem precisar copiar/colar YAML e outros arquivos, clone o repositório e, em seguida, altere os diretórios para cli, se estiver usando a CLI do Azure. Se você estiver usando o SDK do Azure Machine Learning para Python, altere os diretórios para sdk/python/endpoints/online/mlflow.

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

Acompanhar no Jupyter Notebook

Siga as etapas para usar o SDK do Python do Azure Machine Learning abrindo o notebook Implantar modelo do MLflow em pontos de extremidade online no repositório clonado.

Pré-requisitos

Antes de seguir as etapas neste artigo, verifique se você tem os seguintes pré-requisitos:

  • Uma assinatura do Azure. Caso não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar. Experimente a versão gratuita ou paga do Azure Machine Learning.

  • O RBAC do Azure (controle de acesso baseado em função) do Azure é usado para permitir acesso a operações no Azure Machine Learning. Para executar as etapas neste artigo, sua conta de usuário deve receber a função de proprietário ou colaborador para o workspace do Azure Machine Learning ou uma função personalizada que permita Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Para obter mais informações, confira Gerenciar acesso a um workspace do Azure Machine Learning.

  • Você deve ter um modelo do MLflow registrado em seu workspace. Este artigo registra um modelo treinado para o conjunto de dados Diabetes no workspace.

  • Além disso, você precisa:


Conectar-se ao workspace

Primeiro, conecte-se ao workspace do Azure Machine Learning no qual você trabalhará.

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

Registre o modelo

Você pode implantar apenas modelos registrados em pontos de extremidade online. Nesse caso, você já tem uma cópia local do modelo no repositório, portanto, só precisa publicar o modelo no registro do workspace. Você poderá pular essa etapa se o modelo que está tentando implantar já estiver registrado.

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

E se o seu modelo foi registrado dentro de uma execução?

Se o seu modelo foi registrado dentro de uma execução, você poderá registrá-lo diretamente.

Para registrar o modelo, você precisa saber o local onde ele está armazenado. Se você estiver usando o recurso autolog do MLflow, o caminho para o modelo dependerá do tipo de modelo e da estrutura. Você deve verificar a saída dos trabalhos para identificar o nome da pasta do modelo. A pasta contém um arquivo chamado MLModel.

Se você estiver usando o método log_model para registrar manualmente seus modelos, passe o caminho para o modelo como o argumento para o método. Por exemplo, se você registrar o modelo usando mlflow.sklearn.log_model(my_model, "classifier"), o caminho em que o modelo está armazenado será chamado de classifier.

Use a CLI do Azure Machine Learning v2 para criar um modelo de uma saída de trabalho de treinamento. No exemplo a seguir, um modelo nomeado $MODEL_NAME é registrado usando os artefatos de um trabalho com a ID $RUN_ID. O caminho em que o modelo é armazenado é $MODEL_PATH.

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

Observação

O caminho $MODEL_PATH é o local em que o modelo foi armazenado na execução.

Implantar um modelo do MLflow em um ponto de extremidade online

  1. Configure o ponto de extremidade em que o modelo será implantado. O exemplo a seguir configura o nome e o modo de autenticação do ponto de extremidade:

    Defina um nome de ponto de extremidade executando o seguinte comando (substitua YOUR_ENDPOINT_NAME por um nome exclusivo):

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Configurar o ponto de extremidade:

    create-endpoint.yaml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Criar o ponto de extremidade:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configurar a implantação. Uma implantação é um conjunto de recursos necessários para hospedar o modelo que executa a inferência real.

    sklearn-deployment.yaml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-deployment
    endpoint_name: my-endpoint
    model:
      name: mir-sample-sklearn-ncd-model
      version: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Observação

    A geração automática de scoring_script e environment só tem suporte para a variante do modelo pyfunc. Para usar uma variante diferente, confira Personalização das implantações de modelo do MLflow.

  4. Criar a implantação:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    

    Se o ponto de extremidade não tiver conectividade de saída, use o empacotamento de modelo (versão prévia) incluindo o sinalizador --with-package:

    az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. Atribua todo o tráfego à implantação. Até agora, o ponto de extremidade tem uma implantação, mas nenhum tráfego é atribuído a ele.

    Essa etapa não é necessária na CLI do Azure, pois você usou o sinalizador --all-traffic durante a criação. Se você precisar alterar o tráfego, poderá usar o comando az ml online-endpoint update --traffic. Para obter mais informações sobre como atualizar o tráfego, confira Atualizar progressivamente o tráfego.

  6. Atualizar a configuração do ponto de extremidade:

    Essa etapa não é necessária na CLI do Azure, pois você usou o sinalizador --all-traffic durante a criação. Se você precisar alterar o tráfego, poderá usar o comando az ml online-endpoint update --traffic. Para obter mais informações sobre como atualizar o tráfego, confira Atualizar progressivamente o tráfego.

Invocar o ponto de extremidade

Depois que a implantação estiver pronta, você poderá usá-la para atender à solicitação. Uma maneira de testar a implantação é usar o recurso de invocação integrado no cliente de implantação que você está usando. O JSON a seguir é uma solicitação de exemplo para a implantação.

sample-request-sklearn.json

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Observação

input_data é usado nesse exemplo, em vez do inputs usado no serviço do MLflow. Isso ocorre porque o Azure Machine Learning exige um formato de entrada diferente para poder gerar automaticamente os contratos do Swagger para os pontos de extremidade. Para obter mais informações sobre os formatos de entrada esperados, confira Diferenças entre os modelos implantados no Azure Machine Learning e no servidor interno do MLflow.

Envie uma solicitação para o ponto de extremidade da seguinte maneira:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

A resposta será semelhante ao seguinte texto:

[ 
  11633.100167144921,
  8522.117402884991
]

Importante

Para MLflow sem código-implantação, não há suporte para o teste por meio de pontos de extremidade locais .

Personalizar implantações de modelo do MLflow

Você não precisa especificar um script de pontuação na definição de implantação de um modelo do MLflow para um ponto de extremidade online. No entanto, você pode optar por fazer isso e personalizar como a inferência é executada.

Normalmente, você desejará personalizar a implantação do modelo MLflow quando:

  • O modelo não tem um sabor PyFunc.
  • Você precisa personalizar a forma como o modelo é executado, por exemplo, para usar uma variante específica para carregar o modelo, usando mlflow.<flavor>.load_model().
  • Você precisa fazer o pré/pós-processamento em sua rotina de pontuação quando isso não for feito pelo próprio modelo.
  • A saída do modelo não pode ser bem representada em dados tabulares. Por exemplo, é um tensor que representa uma imagem.

Importante

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

Etapas

Para implantar um modelo do MLflow com um script de pontuação personalizado:

  1. Identifique a pasta em que seu modelo do MLflow está localizado.

    a. Vá para o estúdio do Azure Machine Learning.

    b. Vá para a seção Modelos.

    c. Selecione o modelo que está tentando implantar e vá para a guia Artefatos.

    d. Anote a pasta exibida. Essa pasta foi especificada quando o modelo foi registrado.

    Captura de tela mostrando a pasta em que os artefatos do modelo são colocados.

  2. Crie um script de pontuação. Observe como o nome da pasta model que você identificou anteriormente está incluído na função init().

    Dica

    O script de pontuação a seguir é fornecido como um exemplo de como executar a inferência com um modelo do MLflow. Você pode adaptar esse script às suas necessidades ou alterar qualquer uma de suas partes para refletir seu cenário.

    score.py

    import logging
    import os
    import json
    import mlflow
    from io import StringIO
    from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json
    
    
    def init():
        global model
        global input_schema
        # "model" is the path of the mlflow artifacts when the model was registered. For automl
        # models, this is generally "mlflow-model".
        model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
        model = mlflow.pyfunc.load_model(model_path)
        input_schema = model.metadata.get_input_schema()
    
    
    def run(raw_data):
        json_data = json.loads(raw_data)
        if "input_data" not in json_data.keys():
            raise Exception("Request must contain a top level key named 'input_data'")
    
        serving_input = json.dumps(json_data["input_data"])
        data = infer_and_parse_json_input(serving_input, input_schema)
        predictions = model.predict(data)
    
        result = StringIO()
        predictions_to_json(predictions, result)
        return result.getvalue()
    

    Aviso

    Consultoria do MLflow 2.0: o script de pontuação fornecido funcionará com o MLflow 1.X e o MLflow 2.X. No entanto, saiba que os formatos de entrada/saída esperados nessas versões podem variar. Verifique a definição de ambiente usada para garantir que você esteja usando a versão esperada do MLflow. Observe que o MLflow 2.0 só tem suporte no Python 3.8+.

  3. Crie um ambiente em que o script de pontuação possa ser executado. Como o modelo é um modelo do MLflow, os requisitos do conda também são especificados no pacote do modelo. Para obter mais detalhes sobre os arquivos incluídos em um modelo do MLflow, confira O formato do MLmodel. Em seguida, você criará o ambiente usando as dependências do conda do arquivo. No entanto, você também precisa incluir o pacote azureml-inference-server-http, que é necessário para implantações online no Azure Machine Learning.

    O arquivo de definição do conda é o seguinte:

    conda.yml

    channels:
    - conda-forge
    dependencies:
    - python=3.9
    - pip
    - pip:
      - mlflow
      - scikit-learn==1.2.2
      - cloudpickle==2.2.1
      - psutil==5.9.4
      - pandas==2.0.0
      - azureml-inference-server-http
    name: mlflow-env
    

    Observação

    O pacote azureml-inference-server-http foi adicionado ao arquivo original de dependências do conda.

    Você usará esse arquivo de dependências do conda para criar o ambiente:

    O ambiente será criado embutido na configuração de implantação.

  4. Criar a implantação:

    Criar um arquivo de configuração de implantação deployment.yml:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-diabetes-custom
    endpoint_name: my-endpoint
    model: azureml:sklearn-diabetes@latest
    environment: 
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
      conda_file: sklearn-diabetes/environment/conda.yml
    code_configuration:
      code: sklearn-diabetes/src
      scoring_script: score.py
    instance_type: Standard_F2s_v2
    instance_count: 1
    

    Criar a implantação:

    az ml online-deployment create -f deployment.yml
    
  5. Após a conclusão da implantação, ela estará pronta para atender às solicitações. Uma maneira de testar a implantação é usar um arquivo de solicitação de amostra junto com o método invoke.

    sample-request-sklearn.json

    {"input_data": {
        "columns": [
          "age",
          "sex",
          "bmi",
          "bp",
          "s1",
          "s2",
          "s3",
          "s4",
          "s5",
          "s6"
        ],
        "data": [
          [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
          [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
        ],
        "index": [0,1]
      }}
    

    Envie uma solicitação para o ponto de extremidade da seguinte maneira:

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
    

    A resposta será semelhante ao seguinte texto:

    {
      "predictions": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    Aviso

    Aviso do MLflow 2.0: no MLflow 1.X, a chave predictions estará ausente.

Limpar os recursos

Depois de terminar de usar o ponto de extremidade, exclua seus recursos associados:

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