Compartilhar via


Pontuação de modelo de machine learning com PREDICT no Microsoft Fabric

O Microsoft Fabric permite que os usuários operacionalizem modelos de machine learning com uma função escalonável chamada PREDICT, que dá suporte à pontuação em lote em qualquer mecanismo de computação. Os usuários podem gerar previsões em lote diretamente de um bloco de anotações do Microsoft Fabric ou da página de item de um determinado modelo de ML.

Neste artigo, você aprenderá a aplicar PREDICT de ambas as maneiras, seja você mais confortável escrevendo código por conta própria ou usando uma experiência de interface do usuário guiada para lidar com a pontuação em lote para você.

Pré-requisitos

Limitações

  • Atualmente, há suporte para a função PREDICT para um conjunto limitado de variantes do modelo de ML, incluindo:
    • PyTorch
    • Sklearn
    • Spark
    • TensorFlow
    • ONNX
    • XGBoost
    • LightGBM
    • CatBoost
    • Statsmodels
    • Prophet
    • Keras
  • PREDICT exige que os modelos de ML sejam salvos no formato MLflow com suas assinaturas preenchidas.
  • PREDICT não é compatível com modelos de ML com entradas ou saídas multi tensor.

Como chamar PREDICT de um notebook

PREDICT é compatível com modelos empacotados por MLflow no registro do Microsoft Fabric. Se já houver um modelo de ML treinado e registrado em seu workspace, pule para a etapa 2. Caso contrário, a etapa 1 fornece código de exemplo para orientá-lo no treinamento de um modelo de regressão logística de exemplo. Você pode usar esse modelo para gerar previsões em lote no final do procedimento.

  1. Treine um modelo de ML e registre-o no MLflow. O código de exemplo a seguir usa a API do MLflow para criar um experimento de machine learning e iniciar uma execução do MLflow para um modelo de regressão logística scikit-learn. A versão do modelo é armazenada e registrada no Registro do Microsoft Fabric. Consulte como treinar modelos de ML com scikit-learn para saber mais sobre modelos de treinamento e experimentos de rastreamento próprios.

    import mlflow
    import numpy as np 
    from sklearn.linear_model import LogisticRegression 
    from sklearn.datasets import load_diabetes
    from mlflow.models.signature import infer_signature 
    
    mlflow.set_experiment("diabetes-demo")
    with mlflow.start_run() as run:
        lr = LogisticRegression()
        data = load_diabetes(as_frame=True)
        lr.fit(data.data, data.target) 
        signature = infer_signature(data.data, data.target) 
    
        mlflow.sklearn.log_model(
            lr,
            "diabetes-model",
            signature=signature,
            registered_model_name="diabetes-model"
        ) 
    
  2. Carregue em dados de teste como um DataFrame do Spark. Para gerar previsões em lote usando o modelo de ML treinado na etapa anterior, você precisa de dados de teste na forma de um DataFrame do Spark. Você pode substituir o valor da variável test no código a seguir por seus próprios dados.

    # You can substitute "test" below with your own data
    test = spark.createDataFrame(data.frame.drop(['target'], axis=1))
    
  3. Crie um objeto MLFlowTransformer para carregar o modelo de ML para inferência. Para criar um objeto MLFlowTransformer para gerar previsões em lotes, você deve executar as seguintes ações:

    • especifique quais colunas do DataFrame test você precisa como entradas de modelo (nesse caso, todas elas),
    • escolha um nome para a nova coluna de saída (nesse caso, predictions), e
    • forneça o nome do modelo e a versão do modelo corretos para gerar essas previsões.

    Se você estiver usando seu próprio modelo de ML, substitua os valores para as colunas de entrada, o nome da coluna de saída, o nome do modelo e a versão do modelo.

    from synapse.ml.predict import MLFlowTransformer
    
    # You can substitute values below for your own input columns,
    # output column name, model name, and model version
    model = MLFlowTransformer(
        inputCols=test.columns,
        outputCol='predictions',
        modelName='diabetes-model',
        modelVersion=1
    )
    
  4. Gere previsões usando a função PREDICT. Para invocar a função PREDICT, você pode usar a API do Transformer, a API do SPARK SQL ou uma UDF (função definida pelo usuário) do PySpark. As seções a seguir mostram como gerar previsões em lote com os dados de teste e o modelo de ML definidos nas etapas anteriores, usando os diferentes métodos para invocar PREDICT.

PREDICT com a API do Transformador

O código a seguir invoca a função PREDICT com o Transformador de API. Se você estiver usando seu próprio modelo de ML, substitua os valores para o modelo e os dados de teste.

# You can substitute "model" and "test" below with values  
# for your own model and test data 
model.transform(test).show()

PREDICT com a API do SPARK SQL

O código a seguir invoca a função PREDICT com a API do SPARK SQL. Se você estiver usando seu próprio modelo de ML, substitua os valores por model_name, model_version e features pelo nome do modelo, versão do modelo e colunas de recursos.

Observação

Usar a API do Spark SQL para gerar previsões ainda exige que você crie um objeto MLFlowTransformer (como na etapa 3).

from pyspark.ml.feature import SQLTransformer 

# You can substitute "model_name," "model_version," and "features" 
# with values for your own model name, model version, and feature columns
model_name = 'diabetes-model'
model_version = 1
features = test.columns

sqlt = SQLTransformer().setStatement( 
    f"SELECT PREDICT('{model_name}/{model_version}', {','.join(features)}) as predictions FROM __THIS__")

# You can substitute "test" below with your own test data
sqlt.transform(test).show()

PREDICT com uma função definida pelo usuário

O código a seguir invoca a função PREDICT com uma UDF do PySpark. Se você estiver usando seu próprio modelo de ML, substitua os valores pelo modelo e pelos recursos.

from pyspark.sql.functions import col, pandas_udf, udf, lit

# You can substitute "model" and "features" below with your own values
my_udf = model.to_udf()
features = test.columns

test.withColumn("PREDICT", my_udf(*[col(f) for f in features])).show()

Gerar código PREDICT a partir da página de item de um modelo de ML

Na página de item de qualquer modelo de ML, você pode escolher uma das opções a seguir para começar a gerar previsões em lote para uma versão de modelo específica com PREDICT.

  • Usar uma experiência de interface do usuário guiada para gerar o código PREDICT
  • Copie um modelo de código em um notebook e personalize os parâmetros por conta própria

Usar uma experiência de interface do usuário guiada

A experiência de interface do usuário guiada orienta você pelas etapas para:

  • Selecionar dados de origem para pontuação
  • Mapear os dados corretamente para as entradas do modelo de ML
  • Especificar o destino das saídas do modelo
  • Criar um notebook que usa PREDICT para gerar e armazenar resultados de previsão

Para usar a experiência guiada,

  1. Vá para a página de item para uma determinada versão do modelo de ML.

  2. Selecione Aplicar este modelo no assistente na lista suspensa Aplicar esta versão.

    Screenshot of the prompt to apply an ML model from its item page.

    A seleção abre a janela "Aplicar previsões de modelo de ML" na etapa "Selecionar tabela de entrada".

  3. Selecione uma tabela de entrada em um dos lakehouses em seu workspace atual.

    Screenshot of the step to select an input table for ML model predictions.

  4. Selecione Avançar para ir para a etapa "Mapear colunas de entrada".

  5. Mapeie nomes de coluna da tabela de origem para os campos de entrada do modelo de ML, que foram extraídos da assinatura do modelo. Você deve fornecer uma coluna de entrada para todos os campos necessários do modelo. Além disso, os tipos de dados para as colunas de origem devem corresponder aos tipos de dados esperados do modelo.

    Dica

    O assistente preencherá esse mapeamento previamente se os nomes das colunas da tabela de entrada corresponderem aos nomes de coluna registrados na assinatura do modelo de ML.

    Screenshot of the step to map input columns for ML model predictions.

  6. Selecione Avançar para ir para a etapa "Criar tabela de saída".

  7. Forneça um nome para uma nova tabela no lakehouse selecionado do workspace atual. Essa tabela de saída armazena os valores de entrada do modelo de ML com os valores de previsão acrescentados. Por padrão, a tabela de saída é criada no mesmo lakehouse que a tabela de entrada, mas a opção de alterar o lakehouse de destino também está disponível.

    Screenshot of the step to create an output table for ML model predictions.

  8. Selecione Avançar para ir para a etapa "Mapear colunas de entrada".

  9. Use os campos de texto fornecidos para nomear as colunas na tabela de saída que armazena as previsões do modelo de ML.

    Screenshot of the step to map output columns for ML model predictions.

  10. Selecione Avançar para ir para a etapa "Configurar notebook".

  11. Forneça um nome para um novo notebook que executará o código PREDICT gerado. O assistente exibe uma visualização do código gerado nesta etapa. Você pode copiar o código para sua área de transferência e colá-lo em um bloco de anotações existente, se preferir.

    Screenshot of the step to configure a notebook for ML model predictions.

  12. Selecione Avançar para ir para a etapa "Examinar e concluir".

  13. Examine os detalhes na página de resumo e selecione Criar notebook para adicionar o novo bloco de anotações com o código gerado ao seu workspace. Você é levado diretamente para esse notebook, onde poderá executar o código para gerar e armazenar previsões.

    Screenshot of the review-and-finish step for ML model predictions.

Usar um modelo de código personalizável

Para usar um modelo de código para gerar previsões em lote:

  1. Vá para a página de item para uma determinada versão do modelo de ML.
  2. Selecione Copiar código a ser aplicado na lista suspensa Aplicar esta versão. A seleção permite copiar um modelo de código personalizável.

Você pode colar esse modelo de código em um notebook para gerar previsões em lote com seu modelo de ML. Para executar o modelo de código com êxito, você precisa substituir manualmente os seguintes valores:

  • <INPUT_TABLE>: o caminho do arquivo para a tabela que fornece entradas para o modelo de ML
  • <INPUT_COLS>: uma matriz de nomes de coluna da tabela de entrada para alimentar o modelo de ML
  • <OUTPUT_COLS>: um nome para uma nova coluna na tabela de saída que armazena previsões
  • <MODEL_NAME>: o nome do modelo de ML a ser usado para gerar previsões
  • <MODEL_VERSION>: o nome do modelo de ML a ser usado para gerar previsões
  • <OUTPUT_TABLE>: o caminho do arquivo para a tabela que armazena as previsões

Screenshot of the copy-code template for ML model predictions.

import mlflow 
from synapse.ml.predict import MLFlowTransformer 
 
df = spark.read.format("delta").load( 
    <INPUT_TABLE> # Your input table filepath here
) 
 
model = MLFlowTransformer( 
    inputCols=<INPUT_COLS>, # Your input columns here
    outputCol=<OUTPUT_COLS>, # Your new column name here
    modelName=<MODEL_NAME>, # Your ML model name here
    modelVersion=<MODEL_VERSION> # Your ML model version here
) 
df = model.transform(df) 
 
df.write.format('delta').mode("overwrite").save( 
    <OUTPUT_TABLE> # Your output table filepath here
)