Skip to content
Comment détecter et corriger 5 goulets d'étranglement pandas avec cudf.pandas
Source: developer.nvidia.com

Comment détecter et corriger 5 goulets d'étranglement pandas avec cudf.pandas

Sources: https://developer.nvidia.com/blog/how-to-spot-and-fix-5-common-performance-bottlenecks-in-pandas-workflows, https://developer.nvidia.com/blog/how-to-spot-and-fix-5-common-performance-bottlenecks-in-pandas-workflows/, NVIDIA Dev Blog

Aperçu

Lentis au chargement des données, jointures gourmandes en mémoire et opérations de longue durée sont des points problématiques récurrents dans les flux pandas. Ce guide traite cinq goulets d’étranglement fréquents, comment les repérer et des solutions pratiques pour le CPU avec quelques ajustements de code. Il présente également un accélérateur GPU en mode drop-in, cudf.pandas, qui offre des gains d’ordre de grandeur sans modification du code. Si vous n’avez pas de GPU, vous pouvez utiliser cudf.pandas gratuitement dans Google Colab, où les GPU sont disponibles et la bibliothèque est préinstallée.

Caractéristiques clés

  • Accélération GPU en mode drop-in pour les flux pandas via cudf.pandas, permettant le parallélisme sur des milliers de threads GPU sans nécessiter de changements de code pour de nombreuses opérations.
  • E/S rapide et traitement des données : des solutions côté CPU incluent l’utilisation d’un parseur plus rapide comme PyArrow et des stratégies telles que charger uniquement les colonnes nécessaires ou lire par morceaux ; côté GPU, le cuDF accélère les lectures/écritures CSV/Parquet.
  • Grandes jointures : réduction des mouvements de données côté CPU par le préfiltrage et les colonnes; accélération GPU des jointures lorsque cudf.pandas est activé.
  • Efficacité mémoire : réduction du type numérique (downcasting) et conversion des chaînes à faible cardinalité en category pour économiser la RAM; mémoire unifiée pour les jeux de données plus grands que la mémoire GPU.
  • Accélération des chaînes et des colonnes à haute cardinalité : kernels GPU optimisés pour les chaînes, len(), contains(), et jointures sur des clés chaînes.
  • Exemples et notebooks de référence : démonstrations concrètes sur des charges de travail représentatives pour illustrer l’impact des accélérateurs.

Cas d’usage courants

  • Chargement et parsing des données : remplacer ou compléter le parsing CSV de pandas par des moteurs plus rapides et envisager les formats Parquet/Feather pour un I/O plus rapide.
  • Grandes jointures et regroupements : réduire le déplacement des données en évitant les colonnes inutiles avant les merges et utiliser les jointures indexées lorsque possible.
  • Colonnes objets/chaînes larges : transformer les chaînes à faible cardinalité en category pour économiser la mémoire ; conserver les colonnes à haute cardinalité sous forme de chaînes.
  • Groupby et agrégations sur de grands jeux de données : pré-filtrer les données et supprimer les colonnes inutiles pour réduire l’échantillon regroupé; utiliser observed=True pour les clés catégoriques afin d’éviter les combinaisons non utilisées.
  • Fluids mémoire : lorsque les données dépassent la RAM CPU, cudf.pandas avec Unified Virtual Memory (UVM) permet de combiner VRAM et RAM et paginer automatiquement.

Setup et installation

L’approche est conçue pour être non intrusive : activez l’extension cudf.pandas et continuez à utiliser le code pandas habituel lorsque c’est possible.

%load_ext cudf.pandas

Note : dans Colab, vous pouvez accéder gratuitement au GPU et utiliser cudf.pandas sans réécrire votre code.

Démarrage rapide

Le même code pandas peut être utilisé après activation de cudf.pandas. Vous pouvez exécuter des opérations DataFrame typiques et un simple groupby, avec l’accélération GPU appliquée en coulisse.

import pandas as pd
# Après activation de l’extension cudf.pandas, on peut utiliser le code pandas habituel
df = pd.DataFrame({"ville": ["New York", "San Francisco", "New York"],
"valeur": [1, 2, 3]})
# Même API pandas, maintenant accélérée sur GPU lorsque cudf.pandas est actif
resultat = df.groupby("ville").sum()
print(resultat)

Pour des charges de travail réelles et plus lourdes, l’approche peut scale à des millions de lignes et des agrégations complexes sans changer le code.

Pour/Contre

  • Pour
  • Pas besoin de modifier le code pour de nombreuses opérations lorsque vous utilisez cudf.pandas.
  • Gains substantiels pour les grandes jointures, les groupby et les opérations sur chaînes lorsque exécuté sur GPU.
  • Mémoire unifiée permet de traiter des données plus grandes que la mémoire GPU avec pagination automatique.
  • Accès GPU gratuit dans Colab facilite l’expérimentation.
  • Contre
  • Nécessite un GPU ou l’accès à Colab pour bénéficier des avantages GPU.
  • Certains cas limites ou opérations exotiques peuvent nécessiter des ajustements ou vérifications.
  • L’installation dépend de l’extension cudf.pandas et n’est pas nécessairement préinstallée dans tous les environnements.

Alternatives (brève comparaison)

Le article présente plusieurs approches en complément du cudf.pandas :

  • PyArrow pour le parsing CSV sur CPU : parsing plus rapide que le parser pandas par défaut.
  • Parquet/Feather : lectures plus rapides pour les données en colonne.
  • Polars avec moteur GPU alimenté par cuDF : accélération équivalente pour les jointures, groupbys, agrégations et E/S sans modifier les requêtes Polars. | Approche | Avantages typiques | Quand l’utiliser |---|---|---| | cudf.pandas (GPU) | Substantiels gains sur les lectures, jointures, groupbys et chaînes | GPU disponible et préférence pour la continuité du code |PyArrow CSV | Parsing CSV rapide sur CPU | Lecture intensive de CSV sur CPU |Parquet/Feather | I/O rapide | Données stockées en format colonne |Polars avec moteur cuDF | Avantages similaires pour les flux Polars | Utilisation de Polars et besoin de gains GPU |

Prix ou Licence

Non spécifié dans cet article.

Références

More resources