guia de ajuste de desempenho de inferência de modelo de aprendizagem profunda
Esta seção fornece algumas dicas para depuração e ajuste de desempenho para inferência de modelo em Databricks. Para obter uma visão geral, consulte o fluxo de trabalho de inferência de aprendizagem profunda.
Normalmente, há duas partes principais na inferência de modelo: pipeline de entrada de dados e inferência de modelo. O pipeline de entrada de dados é pesado na entrada de E/S de dados e a inferência do modelo é pesada na computação. Determinar o gargalo do fluxo de trabalho é simples. Aqui estão algumas abordagens:
Reduza o modelo a 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, 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 de modelo com 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.
Otimize o pipeline de entrada de dados
O uso de GPUs pode otimizar com eficiência a velocidade de execução para inferência de modelo. À 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 em Spark Dataframes, os transforma e os carrega como entrada para inferência de modelo. Se a entrada de dados for o gargalo, seguem algumas dicas para aumentar a Taxa de transferência de I/O:
Defina os recordes máximos por lotes. 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 dos lotes, defina a seguinte configuração:
spark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch", "5000")
Carregue os dados em lotes e pré-busque-os ao pré-processar os dados de entrada no pandas UDF.
Para o TensorFlow, o Databricks recomenda o uso da API tf.data. Você pode analisar o mapa em paralelo definindo
num_parallel_calls
em uma funçãomap
e chamandoprefetch
ebatch
para pré-busca e lotes.dataset.map(parse_example, num_parallel_calls=num_process).prefetch(prefetch_size).batch(batch_size)
Para PyTorch, Databricks recomenda usar a classe DataLoader. Você pode definir
batch_size
para lotes enum_workers
para carregamento paralelo de dados.torch.utils.data.DataLoader(images, batch_size=batch_size, num_workers=num_process)