Guide till prestandajustering för modellinferens för djupinlärning
Det här avsnittet innehåller några tips för felsökning och prestandajustering för modellinferens på Azure Databricks. En översikt finns i arbetsflödet för slutsatsdragning för djupinlärning.
Vanligtvis finns det två huvuddelar i modellinferens: pipeline för dataindata och modellinferens. Datainmatningspipelinen är tung på data-I/O-indata och modellinferensen är tung på beräkningen. 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 måtten för GPU-användning. Om GPU-användningen inte är kontinuerligt hög kan dataindatapipelinen vara flaskhalsen.
Optimera pipeline för dataindata
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örbearbeta dem när du förbearbetar indata i Pandas UDF.
För TensorFlow rekommenderar Azure Databricks att du använder API:et tf.data. Du kan parsa kartan parallellt genom att ange
num_parallel_calls
i enmap
funktion och anropaprefetch
ochbatch
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 ochnum_workers
för parallell datainläsning.torch.utils.data.DataLoader(images, batch_size=batch_size, num_workers=num_process)