Implantar modelos MLflow em endpoints online

APLICA-SE A: Azure CLI ml extension v2 (atual)

Neste artigo, saiba como implantar seu modelo MLflow em um ponto de extremidade online para inferência em tempo real. Quando você implanta seu modelo MLflow em um ponto de extremidade online, não precisa especificar um script de pontuação ou um ambiente — essa funcionalidade é conhecida como implantação sem código.

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

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

Gorjeta

Espaços de trabalho sem acesso à rede pública: antes de implantar modelos MLflow em pontos de extremidade online sem conectividade de saída, você precisa empacotar os modelos (visualização). Usando o empacotamento de modelo, você pode evitar a necessidade de uma conexão com a Internet, que o Aprendizado de Máquina do Azure exigiria para instalar dinamicamente os pacotes Python necessários para os modelos MLflow.

Sobre o exemplo

O exemplo mostra como você pode implantar um modelo MLflow em um ponto de extremidade online para executar previsões. O exemplo usa um modelo MLflow baseado no conjunto de dados Diabetes. Este conjunto de dados contém 10 variáveis basais: idade, sexo, índice de massa corporal, pressão arterial média e seis medições séricas obtidas de 442 pacientes com diabetes. Contém também a resposta de interesse, uma medida quantitativa da progressão da doença um ano após o início do estudo.

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

As informações neste artigo são baseadas em exemplos de código contidos no repositório azureml-examples . Para executar os comandos localmente sem ter que copiar/colar YAML e outros arquivos, clone o repositório e 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

Acompanhe no Jupyter Notebook

Você pode seguir as etapas para usar o SDK Python do Azure Machine Learning abrindo o modelo Implantar MLflow no bloco de anotações de 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 subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar. Experimente a versão gratuita ou paga do Azure Machine Learning.

  • Os controlos de acesso baseado em funções (RBAC do Azure) são utilizados para conceder acesso às 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 espaço de trabalho do Azure Machine Learning ou uma função personalizada que permita Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Para obter mais informações sobre funções, consulte Gerenciar o acesso a um espaço de trabalho do Azure Machine Learning.

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

  • Além disso, você precisa:


Ligar à sua área de trabalho

Primeiro, conecte-se ao espaço de trabalho do Azure Machine Learning onde você trabalhará.

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

Registar o modelo

Você pode implantar apenas modelos registrados em endpoints online. Nesse caso, você já tem uma cópia local do modelo no repositório, portanto, só precisa publicar o modelo no registro no espaço de trabalho. Você pode pular esta 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 tiver sido registado dentro de uma corrida?

Se o seu modelo foi registrado dentro de uma corrida, você pode registrá-lo diretamente.

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

Se você estiver usando o log_model método 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 onde o modelo está armazenado será chamado classifier.

Use a CLI do Azure Machine Learning v2 para criar um modelo a partir 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 ID $RUN_ID. O caminho onde o modelo é armazenado é $MODEL_PATH.

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

Nota

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

Implantar um modelo MLflow em um ponto de extremidade online

  1. Configure o ponto de extremidade onde 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>"
    

    Configure o ponto de extremidade:

    create-endpoint.yaml

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

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configure a implantação. Uma implantação é um conjunto de recursos necessários para hospedar o modelo que faz 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: 2
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Nota

    Autogeração do e environment são suportados apenas para pyfunc o scoring_script sabor do modelo. Para usar um modelo diferente, consulte Personalizando implantações de modelo MLflow.

  4. Crie 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 seu ponto de extremidade não tiver conectividade de saída, use o empacotamento do modelo (visualização) 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 de seu tráfego é atribuído a ele.

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

  6. Atualize a configuração do ponto final:

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

Invoque o ponto de extremidade

Quando a implantação estiver pronta, você poderá usá-la para atender à solicitação. Uma maneira de testar a implantação é usando o recurso de invocação interno 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]
  }}

Nota

input_data é usado neste exemplo, em vez de inputs que é usado no serviço MLflow. Isso ocorre porque o Aprendizado de Máquina do Azure requer um formato de entrada diferente para poder gerar automaticamente os contratos swagger para os pontos de extremidade. Para obter mais informações sobre os formatos de entrada esperados, consulte Diferenças entre modelos implantados no Azure Machine Learning e no servidor interno 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 no-code-deployment, o teste por meio de endpoints locais não é suportado no momento.

Personalizar implantações de modelo MLflow

Não é necessário especificar um script de pontuação na definição de implantação de um modelo 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 sabor PyFunc .
  • Você precisa personalizar a maneira como o modelo é executado, por exemplo, para usar um sabor específico para carregar o modelo, usando mlflow.<flavor>.load_model().
  • Você precisa fazer pré/pós processamento na sua rotina de pontuação quando não é 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 MLflow, também terá que especificar o ambiente onde a implantação será executada.

Passos

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

  1. Identifique a pasta onde seu modelo 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 você está tentando implantar e vá para a guia Artefatos .

    d. Anote a pasta que é exibida. Esta pasta foi especificada quando o modelo foi registrado.

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

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

    Gorjeta

    O script de pontuação a seguir é fornecido como um exemplo sobre como executar inferência com um modelo 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

    Aviso do MLflow 2.0: O script de pontuação fornecido funcionará com o MLflow 1.X e o MLflow 2.X. No entanto, esteja ciente de 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ó é suportado no Python 3.8+.

  3. Crie um ambiente onde o script de pontuação possa ser executado. Como o modelo é um modelo MLflow, os requisitos de conda também são especificados no pacote do modelo. Para obter mais detalhes sobre os arquivos incluídos em um modelo MLflow, consulte O formato MLmodel. Em seguida, você criará o ambiente usando as dependências 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 de 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
    

    Nota

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

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

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

  4. Crie a implantação:

    Crie 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
    

    Crie a implantação:

    az ml online-deployment create -f deployment.yml
    
  5. Quando a implantação for concluída, ela estará pronta para atender às solicitações. Uma maneira de testar a implantação é usando um arquivo de solicitação de exemplo junto com o invoke método.

    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 predictions chave estará ausente.

Clean up resources (Limpar recursos)

Quando terminar de usar o ponto de extremidade, exclua os recursos associados:

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