Utföra batchinferens med hjälp av en Spark DataFrame

Viktigt!

Avsnitten på den här sidan är endast relevanta för batchinferensscenarier som inte använder Databricks-hostade fundamentmodeller optimerade för batchinferensscenarier. Se Tillämpa AI på data med hjälp av Azure Databricks AI Functions.

Den här sidan beskriver hur du utför batchinferens på en Spark DataFrame med hjälp av en registrerad modell i Databricks. Arbetsflödet gäller för olika maskininlärnings- och djupinlärningsmodeller, inklusive TensorFlow, PyTorch och scikit-learn. Den innehåller metodtips för datainläsning, modellinferens och prestandajustering.

För modellinferens för djupinlärningsprogram rekommenderar Azure Databricks följande arbetsflöde. Exempel på notebooks som använder TensorFlow och PyTorch finns i Batch-inferensexempel.

Arbetsflöde för modellinferens

Databricks rekommenderar följande arbetsflöde för att utföra batchinferens med Spark DataFrames.

Steg 1: Miljökonfiguration

Se till att klustret kör en kompatibel Databricks ML Runtime-version som matchar träningsmiljön. Modellen, som loggas med MLflow, innehåller de krav som kan installeras för att säkerställa att tränings- och slutsatsdragningsmiljöerna matchar.

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

Steg 2: Ladda in data i Spark DataFrames

Beroende på datatyp använder du lämplig metod för att läsa in data till en Spark DataFrame:

Datatyp Metod
Tabell från Unity-katalogen (rekommenderas) table = spark.table(input_table_name)
Bildfiler (JPG, PNG) files_df = spark.createDataFrame(map(lambda path: (path,), file_paths), ["path"])
TFRecords df = spark.read.format("tfrecords").load(image_path)
Andra format (Parquet, CSV, JSON, JDBC) Läs in genom Spark-datakällor.

Steg 3: Läsa in modellen från modellregistret

I det här exemplet används en modell från Databricks-modellregistret för slutsatsdragning.

predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri)

Steg 4: Utföra modellinferens med hjälp av Pandas UDF:er

Pandas UDF:er använder Apache Arrow för effektiv dataöverföring och Pandas för bearbetning. De typiska stegen för slutsatsdragning med Pandas UDF:er är:

  1. Läs in den tränade modellen: Använd MLflow för att skapa en Spark UDF för slutsatsdragning.
  2. Förbearbeta indata: Kontrollera att indataschemat matchar modellkraven.
  3. Kör modellprediktion: Använd modellens UDF-funktion på DataFrame.
df_result = df_spark.withColumn("prediction", predict_udf(*df_spark.columns))
  1. (Rekommenderas) Spara förutsägelser i Unity Catalog.

I följande exempel sparas förutsägelser i Unity Catalog.

df_result.write.mode("overwrite").saveAsTable(output_table)

Prestandajustering för modellinferens

Det här avsnittet innehåller några tips för felsökning och prestandajustering för modellinferens på Azure Databricks. För en översikt, se Utför batchinferens med en Spark DataFrame.

Vanligtvis finns det två huvuddelar i modellinferens: pipeline för dataindata och modellinferens. Datainmatningspipelinen är intensiv på dataindata/-utdata och modellinferens kräver mycket beräkningskraft. Det är enkelt att fastställa flaskhalsen i arbetsflödet. Här följer några metoder:

  • Minska modellen till en trivial modell och mät exemplen per sekund. Om skillnaden mellan slutpunkt och sluttid mellan den fullständiga modellen och den triviala modellen är minimal är dataindatapipelinen sannolikt en flaskhals, annars är modellinferens flaskhalsen.
  • Om du kör modellinferens med GPU kontrollerar du GPU-användningen mått. Om GPU-användningen inte är kontinuerligt hög kan dataindatapipelinen vara flaskhalsen.

Optimera datainmatningspipeline

Användning av GPU:er kan effektivt optimera körningshastigheten för modellinferens. När GPU:er och andra acceleratorer blir snabbare är det viktigt att pipelinen för dataindata håller jämna steg med efterfrågan. Dataindatapipelinen läser in data i Spark DataFrames, transformerar dem och läser in dem som indata för modellinferens. Om dataindata är flaskhalsen finns här några tips för att öka I/O-dataflödet:

  • Ange maximalt antal poster per batch. Ett större antal maximala poster kan minska I/O-omkostnaderna för att anropa UDF-funktionen så länge posterna får plats i minnet. Ange batchstorleken genom att ange följande konfiguration:

    spark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch", "5000")
    
  • Läs in data i batchar och förhämta den medan du förbearbetar indata i Pandas UDF.

    För TensorFlow rekommenderar Azure Databricks att du använder tf.data API. Du kan parsa kartan parallellt genom att ställa in num_parallel_calls i en map-funktion och anropa prefetch och batch för prefetching och batchbearbetning.

    dataset.map(parse_example, num_parallel_calls=num_process).prefetch(prefetch_size).batch(batch_size)
    

    För PyTorch rekommenderar Azure Databricks att du använder klassen DataLoader. Du kan ange batch_size för batchbearbetning och num_workers för parallell datainläsning.

    torch.utils.data.DataLoader(images, batch_size=batch_size, num_workers=num_process)
    

Exempel på Batch-slutsatsdragning

Exemplen i det här avsnittet följer det rekommenderade arbetsflödet för slutsatsdragning för djupinlärning. De här exemplen visar hur du utför modellinferens med hjälp av en förtränad djup restnätsmodell (ResNets) för neurala nätverk.

Strukturerad dataextrahering och batchinferens med Spark UDF

Följande notebook-exempel visar utveckling, loggning och utvärdering av en enkel agent för strukturerad dataextrahering för att omvandla rådata, ostrukturerade data till organiserad och användbar information via automatiserade extraheringstekniker. Den här metoden visar hur du implementerar anpassade agenter för batchinferens med MLflows PythonModel-klass och använder den loggade agentmodellen som en Spark User-Defined Function (UDF). Den här anteckningsboken visar också hur du kan utnyttja Mosaic AI Agent Evaluation för att bedöma noggrannheten med hjälp av grundsanningsdata.

Strukturerad dataextrahering och batchinferens med Spark UDF

Hämta anteckningsbok