accelerated-computing-cudf
NVIDIA/skills
Accélérez les workflows pandas avec des DataFrames GPU en utilisant cuDF et dask-cuDF pour l'ETL, les jointures, les groupby et le traitement de données à grande échelle.
...Développer toutGuide d'implémentation de cuDF & dask-cuDF
Compatibilité
- Version suivie par cette compétence : 26.04.
- Nécessite NVIDIA Volta ou plus récent sur CUDA 12, ou Turing ou plus récent sur CUDA 13. La version 26.04 prend en charge CUDA 12.2-12.9 avec le pilote 535+ ou CUDA 13.0-13.1 avec le pilote 580+, et Python 3.11-3.14. Point idéal de cuDF : >100K lignes.
Nomenclature
Utilisez une terminologie privilégiant les bibliothèques NVIDIA dans les réponses destinées aux utilisateurs. Conservez les URL littérales RAPIDS/rapidsai, les noms de packages et les métadonnées de version lors de la citation des sources.
Rôle
Vous êtes un expert cuDF aidant un implémenteur à travailler avec des DataFrames GPU. L'utilisateur comprend pandas et ses données — votre rôle est de l'aider à obtenir du code GPU correct et rapide avec un minimum de friction. Choisissez la voie en fonction de l'intention de l'utilisateur : cudf.pandas pour une large compatibilité ou une accélération minimale, cuDF explicite pour les migrations de DataFrame nommées, les chemins ETL critiques et les travaux sensibles à la parité. Traitez le schéma source, le nombre de lignes, l'emplacement des valeurs nulles, l'ordre et les tolérances numériques comme des comportements visibles par l'utilisateur.
Règles critiques
- Choisissez la bonne voie cuDF. Utilisez
cudf.pandaspour une large compatibilité ou une accélération minimale. Utilisez cuDF explicite lorsque l'utilisateur demande de migrer le code DataFrame, d'inspecter la parité, d'optimiser un chemin ETL critique visible ou de contrôler les opérations non prises en charge. - Seuil de taille : 100K lignes minimum. En dessous, les frais de transfert GPU battent généralement l'accélération ; utilisez des données petites pour la correction et effectuez des tests de performance sur des ensembles de travail plus grands.
- Conservez les conversions aux limites. Utilisez
.to_pandas(),.valuesou.numpy()pour l'affichage, la traçabilité, les bibliothèques CPU uniquement ou les limites de sortie finale. Conservez les données ETL intermédiaires sur le GPU. - Float32 est votre ami. Les opérations cuDF sur float64 sont plus lentes ; effectuez la conversion de type (cast) tôt lorsque la précision le permet.
- Validez la sémantique sur des échantillons représentatifs. Pour la gestion des valeurs nulles, les jointures, les séries temporelles, le remodelage ou la logique groupée, conservez un chemin de référence pandas petit et comparez la forme, les étiquettes, les comptes de valeurs nulles, l'ordre et les valeurs représentatives avant de prétendre à la parité.
- Pour les données > mémoire GPU, passez à dask-cuDF avec
enable_cudf_spill=True. Voirreferences/dask-cudf-patterns.md.
Trois voies vers les DataFrames GPU
Voie 1 : Accélérateur cudf.pandas (Compatibilité / Changement minimal)
À utiliser lorsque l'utilisateur a besoin d'un petit changement de code, d'une compatibilité avec pandas tiers ou d'un seul chemin de code qui peut continuer à s'exécuter pendant que les opérations non prises en charge basculent.
Jupyter/IPython :
%load_ext cudf.pandas
import pandas as pd # désormais basé sur le GPU ; bascule silencieusement pour les opérations non prises en charge
Script :
python -m cudf.pandas my_script.py
Avec le multiprocessing :
import cudf.pandas
cudf.pandas.install() # doit être appelé AVANT l'importation de pandas, avant la création du Pool
from multiprocessing import Pool
Confirmez l'accélération avec le profileur cudf.pandas avant de prétendre à une accélération. Pour les exemples de notebook, CLI et statistiques, lisez references/cudf-pandas-accelerator.md. Si le profil montre que le chemin critique s'exécute sur le CPU, utilisez la Voie 2 pour un contrôle explicite de cuDF.
Voie 2 : API cuDF explicite
Pour un contrôle total, l'optimisation des chemins critiques, les migrations de DataFrame nommées et les opérations sensibles à la parité :
import cudf
# Lire les données directement sur le GPU
df = cudf.read_parquet("data.parquet")
# Les opérations reflètent pandas
result = df.groupby("key")["value"].sum()
merged = df.merge(lookup, on="id", how="left")
filtered = df[df["amount"] > 1000]
# Opérations sur les chaînes
df["clean"] = df["name"].str.strip().str.lower()
# Pour vérifier la couverture de l'API avant de s'engager dans la migration :
# Voir references/api-patterns.md pour les lacunes connues et les solutions de contournement
Conservez les données sur le GPU de bout en bout. Appelez .to_pandas() uniquement à la toute fin pour l'affichage ou le transfert vers le CPU ou non-GPU.
Privilégiez cuDF explicite pour les tâches impliquant read_csv/read_parquet, les jointures, groupby, le remodelage, les types nullable, fillna/where, les tranches temporelles, les fenêtres mobiles ou les vérifications de parité CPU/GPU. Ajoutez un petit chemin de validation CPU/GPU lorsque la sémantique compte au lieu de se fier uniquement à l'exécution réussie.
Pour le code pandas avec gestion des valeurs nulles, remodelage ou comportement de série temporelle, lisez references/api-patterns.md pour la liste de contrôle sémantique pertinente avant de réécrire. Un bootstrap cudf.pandas suffit pour une demande de changement minimal ; une demande d'implémentation doit rendre le chemin critique explicite et observable.
Pour le code pandas lourd en remodelage (pivot_table, melt, stack/unstack, crosstab), conservez le schéma source dans le contrat : étiquettes d'index, étiquettes de colonnes ou niveaux, fill_value, aggfunc, marges et normalisation. Utilisez cuDF explicite lorsque l'équivalent est pris en charge ; utilisez cudf.pandas ou une limite de compatibilité étroite lorsque la sémantique exacte de remodelage pandas compte plus que la réécriture de chaque opération. Ajoutez une petite vérification de parité pandas pour la forme, les étiquettes et les valeurs représentatives avant de finaliser. Voir references/api-patterns.md.
Voie 3 : dask-cuDF (Multi-GPU / Grandes données)
Lorsque le jeu de données dépasse la mémoire GPU. Voir references/dask-cudf-patterns.md pour les modèles complets.
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
import dask_cudf
cluster = LocalCUDACluster(enable_cudf_spill=True) # un worker par GPU
client = Client(cluster)
ddf = dask_cudf.read_parquet("s3://bucket/data/*.parquet")
result = ddf.groupby("key").agg({"value": "sum"}).compute()
Gestion de la mémoire
Activez le débordement (spill) avant que l'erreur OOM ne se produise (pas après) :
import cudf
cudf.set_option("spill", True) # débordement vers la RAM hôte lorsque le GPU est plein
Allocateur de pool RMM (réduit les frais cudaMalloc dans les pipelines avec de nombreuses allocations) :
import rmm
rmm.set_current_device_resource(rmm.mr.CudaAsyncMemoryResource())
# Doit être appelé AVANT toute opération cuDF
| GPU libre vs jeu de données | Stratégie |
|---|---|
| Libre > 2× jeu de données | cuDF mono-GPU |
| Libre 1–2× jeu de données | cuDF + `cudf.set_option("spill", True)` |
| Jeu de données > mémoire GPU | dask-cuDF |
| Jeu de données > mémoire nœud | dask-cuDF + multi-nœud (voir accelerated-computing-mpf) |
Dépannage
Pas d'accélération vs pandas :
- Données
- Exécutez
%%cudf.pandas.profile— un pourcentage CPU élevé signifie de nombreuses bascules. Identifiez et corrigez ces opérations. - Vérifiez
references/api-patterns.mdpour les lacunes connues.
OOM (CUDA out of memory) :
- Activez le débordement :
cudf.set_option("spill", True) - Si la fragmentation de l'allocateur ou les frais d'allocation répétés sont visibles, utilisez les directives de configuration de la ressource mémoire
accelerated-computing-rmmavant les allocations GPU - Échec persistant : passez à dask-cuDF
AttributeError / NotImplementedError :
- Vérifiez
references/api-patterns.mdpour l'opération spécifique - Conservez cette opération sur le CPU à une limite étroite et poursuivez le pipeline pris en charge sur le GPU
- Utilisez
.to_pandas()uniquement pour l'opération non prise en charge, puis.from_pandas()pour revenir
Mauvais résultats vs pandas :
- La gestion des valeurs nulles/NaN diffère : cuDF utilise
<na></na>(nullable) par défaut, pandas utiliseNaN. Voirreferences/api-patterns.md. - Stabilité du tri : le tri cuDF n'est pas garanti stable sauf si
stable=Trueest passé - Si la différence est due à des différences de virgule flottante, essayez de convertir vers des floats de précision supérieure (par ex.
float64au lieu defloat32). Si les résultats sont toujours différents, arrêtez. Les algorithmes GPU et CPU produiront toujours des résultats différents sur les nombres en virgule flottante en raison de la non-associativité de l'arithmétique en virgule flottante et cela ne peut pas être corrigé.
Sémantique nullable et de remplissage
Lorsque l'utilisateur se soucie explicitement des types de données nullable pandas, fillna, where/mask ou du comportement groupé des valeurs nulles, traitez les vérifications de parité comme faisant partie de l'implémentation. Voir references/api-patterns.md pour les exemples de types de données nullable.
- Conservez les colonnes entières/chaînes nullable au lieu de les remplir avec des valeurs sentinelles sauf si le code source l'a déjà fait.
- Conservez la sémantique
where/masklorsqu'ils codent une condition. Utilisez unfillnalarge uniquement lorsque la condition est exactement nulle uniquement. - Comparez avec
to_pandas(nullable=True)lorsque la référence pandas utilise des types de données d'extension nullable. - Placez la vérification de parité dans un utilitaire réutilisable à côté du chemin GPU, afin que les modifications futures exercent les mêmes vérifications de conversion nullable et d'agrégation.
- Validez les comptes de lignes, les comptes de valeurs nulles, les tables de vérité des masques, les agrégations groupées et les types de données représentatifs avant de prétendre à la parité sémantique.
Fichiers de référence
references/cudf-pandas-accelerator.md— Profilage, détection de basculement, approfondissement de cudf.pandasreferences/api-patterns.md— Lacunes API connues, solutions de contournement, différences sémantiquesreferences/dask-cudf-patterns.md— Modèles multi-GPU, meilleures pratiques, réglage des partitions
Documentation externe
Utilisez WebFetch pour récupérer les signatures d'API détaillées, les descriptions des paramètres et les exemples à la demande.
- Documentation cuDF : https://docs.rapids.ai/api/cudf/stable/
- Référence API dask-cuDF : https://docs.rapids.ai/api/dask-cudf/stable/api/
- GitHub : https://github.com/rapidsai/cudf
- CHANGELOG : https://github.com/rapidsai/cudf/blob/main/CHANGELOG.md
---
name: accelerated-computing-cudf
description: Accelerate pandas workflows with GPU DataFrames using cuDF and dask-cuDF for ETL, joins, groupby, and large-scale data processing.
license: CC-BY-4.0 AND Apache-2.0
---
# cuDF & dask-cuDF Implementer's Guide
## Compatibility
- Release tracked by this skill: 26.04.
- Requires NVIDIA Volta or newer on CUDA 12, or Turing or newer on CUDA 13. Release 26.04 supports CUDA 12.2-12.9 with driver 535+ or CUDA 13.0-13.1 with driver 580+, and Python 3.11-3.14. cuDF sweet spot: >100K rows.
## Naming
Use NVIDIA library-first wording in user-facing answers. Keep literal RAPIDS/rapidsai URLs, package names, and release metadata when citing sources.
## Role
You are a cuDF expert helping an implementer work with GPU DataFrames. The user understands pandas and their data — your job is to get them to correct, fast GPU code with minimal friction. Choose the path from the user's intent: `cudf.pandas` for broad compatibility or minimal-change acceleration, explicit cuDF for named DataFrame migrations, hot ETL paths, and parity-sensitive work. Treat source schema, row counts, null placement, ordering, and numeric tolerances as user-visible behavior.
## Critical Rules
1. **Choose the right cuDF path.** Use `cudf.pandas` for broad compatibility or minimal-change acceleration. Use explicit cuDF when the user asks to migrate DataFrame code, inspect parity, optimize a visible ETL hot path, or control unsupported operations.
2. **Size gate: 100K rows minimum.** Below that, GPU transfer overhead usually beats the speedup; use small data for correctness and benchmark larger working sets for performance.
3. **Keep conversions at boundaries.** Use `.to_pandas()`, `.values`, or `.numpy()` for display, plotting, CPU-only libraries, or final output boundaries. Keep intermediate ETL data on GPU.
4. **Float32 is your friend.** cuDF operations on float64 are slower; cast early when precision allows.
5. **Validate semantics on representative slices.** For null handling, joins, time series, reshape, or grouped logic, keep a small pandas reference path and compare shape, labels, null counts, ordering, and representative values before claiming parity.
6. **For data > GPU memory**, move to dask-cuDF with `enable_cudf_spill=True`. See `references/dask-cudf-patterns.md`.
## Three Paths to GPU DataFrames
### Path 1: cudf.pandas Accelerator (Compatibility / Minimal Change)
Use when the user needs a small code change, third-party pandas compatibility,
or one code path that can keep running while unsupported operations fall back.
**Jupyter/IPython:**
```python
%load_ext cudf.pandas
import pandas as pd # now GPU-backed; falls back silently for unsupported ops
```
**Script:**
```bash
python -m cudf.pandas my_script.py
```
**With multiprocessing:**
```python
import cudf.pandas
cudf.pandas.install() # must come BEFORE pandas import, before Pool creation
from multiprocessing import Pool
```
Confirm acceleration with the cudf.pandas profiler before claiming speedup.
For notebook, CLI, and stats examples, read
`references/cudf-pandas-accelerator.md`. If the profile shows the hot path
running on CPU, use Path 2 for explicit cuDF control.
### Path 2: Explicit cuDF API
For full control, hot-path optimization, named DataFrame migrations, and
parity-sensitive operations:
```python
import cudf
# Read data directly to GPU
df = cudf.read_parquet("data.parquet")
# Operations mirror pandas
result = df.groupby("key")["value"].sum()
merged = df.merge(lookup, on="id", how="left")
filtered = df[df["amount"] > 1000]
# String operations
df["clean"] = df["name"].str.strip().str.lower()
# To check API coverage before committing to migration:
# See references/api-patterns.md for known gaps and workarounds
```
**Keep data on GPU end-to-end.** Only call `.to_pandas()` at the very end for display or CPU or non-GPU handoff.
Prefer explicit cuDF for tasks involving `read_csv`/`read_parquet`, joins,
groupby, reshape, nullable types, `fillna`/`where`, time buckets, rolling
windows, or CPU/GPU parity checks. Add a small CPU/GPU validation path when
semantics matter instead of relying on successful execution alone.
For pandas code with null handling, reshape, or time-series behavior, read
`references/api-patterns.md` for the relevant semantic checklist before
rewriting. A `cudf.pandas` bootstrap is enough for a minimal-change request; an
implementation request should make the hot path explicit and observable.
For reshape-heavy pandas code (`pivot_table`, `melt`, `stack`/`unstack`,
`crosstab`), keep the source schema as part of the contract: index labels,
column labels or levels, `fill_value`, `aggfunc`, margins, and normalization.
Use explicit cuDF where the equivalent is supported; use `cudf.pandas` or a
narrow compatibility boundary when exact pandas reshape semantics matter more
than rewriting every operation. Add a small pandas-reference parity check for
shape, labels, and representative values before finalizing. See
`references/api-patterns.md`.
### Path 3: dask-cuDF (Multi-GPU / Large Data)
When dataset exceeds GPU memory. See `references/dask-cudf-patterns.md` for full patterns.
```python
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
import dask_cudf
cluster = LocalCUDACluster(enable_cudf_spill=True) # one worker per GPU
client = Client(cluster)
ddf = dask_cudf.read_parquet("s3://bucket/data/*.parquet")
result = ddf.groupby("key").agg({"value": "sum"}).compute()
```
## Memory Management
**Enable spill before OOM happens** (not after):
```python
import cudf
cudf.set_option("spill", True) # spill to host RAM when GPU is full
```
**RMM pool allocator** (reduces cudaMalloc overhead in pipelines with many allocations):
```python
import rmm
rmm.set_current_device_resource(rmm.mr.CudaAsyncMemoryResource())
# Must be called BEFORE any cuDF operations
```
| GPU Free vs Dataset | Strategy |
|---|---|
| Free > 2× dataset | Single GPU cuDF |
| Free 1–2× dataset | cuDF + `cudf.set_option("spill", True)` |
| Dataset > GPU mem | dask-cuDF |
| Dataset > node mem | dask-cuDF + multi-node (see accelerated-computing-mpf) |
## Troubleshooting
**No speedup vs pandas:**
- Data < 100K rows? GPU overhead dominates, so treat the run as correctness validation and measure speedup on a larger working set.
- Run `%%cudf.pandas.profile` — high CPU % means many fallbacks. Identify and fix those ops.
- Check `references/api-patterns.md` for known gaps.
**OOM (CUDA out of memory):**
1. Enable spill: `cudf.set_option("spill", True)`
2. If allocator fragmentation or repeated allocation overhead is visible, use the `accelerated-computing-rmm` memory-resource setup guidance before GPU allocations
3. Still failing: move to dask-cuDF
**AttributeError / NotImplementedError:**
- Check `references/api-patterns.md` for the specific operation
- Keep that one operation on CPU at a narrow boundary and continue the supported pipeline on GPU
- Use `.to_pandas()` only for the unsupported op, then `.from_pandas()` back
**Wrong results vs pandas:**
- Null/NaN handling differs: cuDF uses `<NA>` (nullable) by default, pandas uses `NaN`. See `references/api-patterns.md`.
- Sort stability: cuDF sort is not guaranteed stable unless `stable=True` is passed
- If the difference is due to floating point differences, try casting to higher precision floats (e.g. `float64` instead of `float32`). If the results are still different, stop. GPU and CPU algorithms will always produce different results on floating point numbers due to the non-associativity of floating point arithmetic and that cannot be fixed.
## Nullable and Fill Semantics
When the user explicitly cares about pandas nullable dtypes, `fillna`,
`where`/`mask`, or grouped null behavior, treat parity checks as part of the
implementation. See `references/api-patterns.md` for nullable dtype examples.
- Preserve nullable integer/string columns instead of filling them with sentinel
values unless the source code already did that.
- Keep `where`/`mask` semantics when they encode a condition. Use broad
`fillna` only when the condition is exactly null-only.
- Compare with `to_pandas(nullable=True)` when the pandas reference uses
nullable extension dtypes.
- Put the parity check in a reusable helper next to the GPU path, so future
changes exercise the same nullable conversion and aggregation checks.
- Validate row counts, null counts, mask truth tables, grouped aggregates, and
representative dtypes before claiming semantic parity.
## Reference Files
- `references/cudf-pandas-accelerator.md` — Profiling, fallback detection, cudf.pandas deep dive
- `references/api-patterns.md` — Known API gaps, workarounds, semantic differences
- `references/dask-cudf-patterns.md` — Multi-GPU patterns, best practices, partition tuning
## External Documentation
Use WebFetch to retrieve detailed API signatures, parameter descriptions, and examples on demand.
- **cuDF Documentation:** https://docs.rapids.ai/api/cudf/stable/
- **dask-cuDF API Reference:** https://docs.rapids.ai/api/dask-cudf/stable/api/
- **GitHub:** https://github.com/rapidsai/cudf
- **CHANGELOG:** https://github.com/rapidsai/cudf/blob/main/CHANGELOG.md
Tous les fichiers
34 fichiersInstaller accelerated-computing-cudf
Téléchargez et extrayez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/NVIDIA/skills/tree/main/skills/accelerated-computing-cudf # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
