Guide du réglage des performances de l’inférence de modèle de Deep Learning

Cette section fournit des conseils pour le débogage et le réglage des performances pour l’inférence de modèle sur Azure Databricks. Pour une vue d’ensemble, consultez le flux de travail d’inférence d’apprentissage profond.

L'inférence de modèle comporte généralement deux parties principales : le pipeline d'entrée des données et l'inférence de modèle. Le pipeline d’entrée de données est lourd en entrée d’E/S de données et l’inférence de modèle fait l’objet de calculs intensifs. Déterminer le goulot d'étranglement du flux de travail est simple. Voici quelques approches :

  • Réduisez le modèle à un modèle trivial et mesurez les exemples par seconde. Si la différence entre l’heure de fin et l’heure de fin entre le modèle complet et le modèle trivial est minime, le pipeline d’entrée de données est probablement un goulot d’étranglement, sinon l’inférence de modèle est le goulet d’étranglement.
  • Si vous exécutez l’inférence de modèle avec GPU, vérifiez les métriques d’utilisation du GPU. Si l’utilisation du GPU n’est pas constamment élevée, le pipeline d’entrée de données peut correspondre au goulot d’étranglement.

Optimiser un pipeline d’entrée des données

L’utilisation de GPU peut optimiser efficacement la vitesse d’exécution de l’inférence de modèle. Comme les GPU et les autres accélérateurs sont plus rapides, il est important que le pipeline d’entrée de données remonte à la demande. Le pipeline d'entrée des données lit les données dans les Dataframes Spark, les transforme et les charge comme entrée pour l'inférence du modèle. Si l’entrée de données est le goulet d’étranglement, voici quelques conseils pour augmenter le débit d’e/s :

  • Définissez le nombre maximal d’enregistrements par lot. Un nombre plus élevé d’enregistrements maximaux peut réduire la surcharge d’e/s pour appeler la fonction UDF tant que les enregistrements peuvent tenir dans la mémoire. Pour définir la taille du lot, définissez la configuration suivante :

    spark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch", "5000")
    
  • Chargez les données par lots et prérécupérez-les lors du prétraitement des données d’entrée dans la FDU de pandas.

    Pour TensorFlow, Azure Databricks recommande l’utilisation de l' tf.data API. Vous pouvez analyser le mappage en parallèle en définissant num_parallel_calls dans une fonction et en appelant map et prefetch pour la batch prérécupération et le traitement par lot.

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

    Pour PyTorch, Azure Databricks recommande l’utilisation de la classe DataLoader. Vous pouvez définir batch_size pour le traitement par lot et num_workers pour le chargement de données en parallèle.

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