Realize a inferência de lotes usando o site Spark DataFrame
Os tópicos nesta página são relevantes apenas para cenários de inferência de lotes que não usam modelos de base hospedados pelo Databricksotimizados para cenários de inferência de lotes. Consulte Aplicar AI no uso de dados Databricks AI Functions.
Esta página descreve como executar inferência de lotes em um Spark DataFrame usando um modelo registrado no Databricks. O fluxo de trabalho se aplica a vários modelos machine learning e aprendizagem profunda, incluindo TensorFlow, PyTorch e scikit-learn. Inclui práticas recomendadas para carregamento de dados, inferência de modelos e ajuste de desempenho.
Para inferência de modelo para aplicativos de aprendizagem profunda, a Databricks recomenda o seguinte fluxo de trabalho. Para obter exemplos de Notebook que usam TensorFlow e PyTorch, consulte exemplos de inferência de lotes.
Inferência de modelos fluxo de trabalho
Databricks recomenda o seguinte fluxo de trabalho para realizar a inferência de lotes usando Spark DataFrames.
Etapa 1: Configuração do ambiente
Certifique-se de que a execução do cluster seja compatível com a versão Databricks ML Runtime para corresponder ao ambiente de treinamento. O modelo, registrado em MLflow, contém os requisitos que podem ser instalados para garantir a correspondência entre os ambientes de treinamento e de inferência.
requirements_path = os.path.join(local_path, "requirements.txt")
if not os.path.exists(requirements_path):
dbutils.fs.put("file:" + requirements_path, "", True)
%pip install -r $requirements_path
%restart_python
Etapa 2: Carregar dados no Spark DataFrames
Dependendo do tipo de dados, use o método apropriado para carregar dados em um Spark DataFrame:
Tipo de dados | Método |
---|---|
Tabela do site Unity Catalog (recomendado) |
|
Arquivos de imagem (JPG, PNG) |
|
Registros TF |
|
Outros formatos (Parquet, CSV, JSON, JDBC) | Carregar usando Spark fonte de dados. |
Etapa 3: Carregar modelo do registro de modelo
Este exemplo usa um modelo do Databricks Model Registry para inferência.
predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri)
Etapa 4: Realizar a inferência do modelo usando UDFs do Pandas
Pandas Os UDFs utilizam o Apache Arrow para transferência eficiente de dados e o Pandas para processamento. As etapas típicas da inferência com os UDFs do site Pandas são:
- Carregue o modelo treinado: Use o MLflow para criar um Spark UDF para inferência.
- Pré-processar dados de entrada: certifique-se de que o esquema de entrada corresponda aos requisitos do modelo.
- execução do modelo de previsão: Use a função UDF do modelo no site DataFrame.
df_result = df_spark.withColumn("prediction", predict_udf(*df_spark.columns))
- (Recomendado) Salve as previsões no Unity Catalog.
O exemplo a seguir salva as previsões no Unity Catalog.
df_result.write.mode("overwrite").saveAsTable(output_table)
Ajuste de desempenho para inferência de modelos
Esta seção fornece algumas dicas para depuração e ajuste de desempenho para inferência de modelos em Databricks. Para obter uma visão geral, consulte a seção Realizar inferência de lotes usando o site Spark DataFrame .
Normalmente, há duas partes principais na inferência de modelos: pipeline de entrada de dados e inferência de modelos. O pipeline de entrada de dados é pesado em termos de entrada de E/S de dados e a inferência de modelos é pesada em termos de computação. Determinar o gargalo do fluxo de trabalho é simples. Aqui estão algumas abordagens:
- Reduza o modelo para um modelo trivial e meça os exemplos por segundo. Se a diferença do tempo de ponta a ponta entre o modelo completo e o modelo trivial for mínima, então o pipeline de entrada de dados provavelmente é um gargalo; caso contrário, a inferência do modelo é o gargalo.
- Se estiver executando a inferência do modelo com a GPU, verifique as métricas de utilização da GPU. Se a utilização da GPU não for continuamente alta, o pipeline de entrada de dados poderá ser o gargalo.
Otimizar o pipeline de entrada de dados
O uso de GPUs pode otimizar com eficiência a velocidade de execução para inferência de modelos. À medida que as GPUs e outros aceleradores se tornam mais rápidos, é importante que o pipeline de entrada de dados acompanhe a demanda. O pipeline de entrada de dados lê os dados no Spark DataFrames, transforma-os e carrega-os como a entrada para a inferência do modelo. Se a entrada de dados for o gargalo, aqui estão algumas dicas para aumentar a taxa de transferência de E/S:
-
Defina o máximo de registros por lote. Um número maior de registros máximos pode reduzir a sobrecarga de E/S para chamar a função UDF, desde que os registros caibam na memória. Para definir o tamanho do lote, defina a seguinte configuração:
Pythonspark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch", "5000")
-
Carregar os dados em lotes e buscá-los previamente ao pré-processar os dados de entrada no site Pandas UDF.
Para o TensorFlow, a Databricks recomenda o uso da API tf.data. O senhor pode analisar o mapa em paralelo definindo
num_parallel_calls
em uma funçãomap
e chamandoprefetch
ebatch
para pré-busca e lotes.Pythondataset.map(parse_example, num_parallel_calls=num_process).prefetch(prefetch_size).batch(batch_size)
Para o PyTorch, a Databricks recomenda o uso da classe DataLoader. O senhor pode definir
batch_size
para lotes enum_workers
para carregamento paralelo de dados.Pythontorch.utils.data.DataLoader(images, batch_size=batch_size, num_workers=num_process)
exemplos de inferência de lotes
Os exemplos desta seção seguem o fluxo de trabalho de inferência de aprendizagem profunda recomendado. Esses exemplos ilustram como realizar a inferência do modelo usando um modelo de rede neural de redes residuais profundas (ResNets) pré-treinado.
Extração de dados estruturados e inferência de lotes usando Spark UDF
O exemplo de Notebook a seguir demonstra o desenvolvimento, o registro e a avaliação de um agente simples para extração de dados estruturados para transformar dados brutos e não estruturados em informações organizadas e úteis por meio de técnicas de extração automatizadas. Essa abordagem demonstra como implementar agentes personalizados para inferência de lotes usando a classe PythonModel
do MLflow e empregar o modelo de agente de logs como uma função definida pelo usuário do Spark (UDF). Este Notebook também mostra como aproveitar o Mosaic AI Agent Evaluation para avaliar a precisão usando dados de verdade terrestre.