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ção map e chamando prefetch e batch 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 e num_workers para carregamento paralelo de dados.

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