accelerated-computing-cudf
NVIDIA/skills
Acelere fluxos de trabalho com pandas usando DataFrames de GPU com cuDF e dask-cuDF para ETL, junções, groupby e processamento de dados em larga escala.
...Expandir tudoGuia do Implementador do cuDF & dask-cuDF
Compatibilidade
- Versão rastreada por esta habilidade: 26.04.
- Requer NVIDIA Volta ou mais recente no CUDA 12, ou Turing ou mais recente no CUDA 13. A versão 26.04 suporta CUDA 12.2-12.9 com driver 535+ ou CUDA 13.0-13.1 com driver 580+, e Python 3.11-3.14. Ponto ideal do cuDF: >100K linhas.
Nomenclatura
Use a terminologia da biblioteca NVIDIA em primeiro lugar nas respostas voltadas ao usuário. Mantenha as URLs literais do RAPIDS/rapidsai, os nomes dos pacotes e os metadados de versão ao citar fontes.
Papel
Você é um especialista em cuDF ajudando um implementador a trabalhar com DataFrames de GPU. O usuário entende o pandas e seus dados — seu trabalho é levá-los a um código GPU correto e rápido com o mínimo de atrito. Escolha o caminho com base na intenção do usuário: cudf.pandas para ampla compatibilidade ou aceleração com alterações mínimas, cuDF explícito para migrações de DataFrame nomeadas, caminhos ETL críticos e trabalhos sensíveis à paridade. Trate o esquema de origem, a contagem de linhas, a posição dos nulos, a ordenação e as tolerâncias numéricas como comportamento visível ao usuário.
Regras Críticas
- Escolha o caminho correto do cuDF. Use
cudf.pandaspara ampla compatibilidade ou aceleração com alterações mínimas. Use cuDF explícito quando o usuário solicitar migrar código de DataFrame, inspecionar a paridade, otimizar um caminho ETL visível ou controlar operações não suportadas. - Limite de tamanho: mínimo de 100K linhas. Abaixo disso, a sobrecarga de transferência para a GPU geralmente supera o ganho de velocidade; use dados pequenos para correção e faça benchmark de conjuntos de trabalho maiores para desempenho.
- Mantenha as conversões nas fronteiras. Use
.to_pandas(),.valuesou.numpy()para exibição, plotagem, bibliotecas apenas de CPU ou fronteiras de saída final. Mantenha os dados ETL intermediários na GPU. - Float32 é seu amigo. As operações do cuDF em float64 são mais lentas; faça o cast antecipadamente quando a precisão permitir.
- Valide a semântica em fatias representativas. Para manipulação de nulos, joins, séries temporais, reshaping ou lógica agrupada, mantenha um caminho de referência pandas pequeno e compare forma, rótulos, contagens de nulos, ordenação e valores representativos antes de afirmar a paridade.
- Para dados > memória da GPU, migre para o dask-cuDF com
enable_cudf_spill=True. Consultereferences/dask-cudf-patterns.md.
Três Caminhos para DataFrames de GPU
Caminho 1: Acelerador cudf.pandas (Compatibilidade / Alteração Mínima)
Use quando o usuário precisar de uma pequena alteração no código, compatibilidade com bibliotecas pandas de terceiros ou um único caminho de código que possa continuar funcionando enquanto operações não suportadas fizerem fallback.
Jupyter/IPython:
%load_ext cudf.pandas
import pandas as pd # agora com suporte a GPU; faz fallback silenciosamente para operações não suportadas
Script:
python -m cudf.pandas my_script.py
Com multiprocessamento:
import cudf.pandas
cudf.pandas.install() # deve vir ANTES da importação do pandas, antes da criação do Pool
from multiprocessing import Pool
Confirme a aceleração com o perfilador do cudf.pandas antes de afirmar o ganho de velocidade. Para exemplos de notebook, CLI e estatísticas, leia references/cudf-pandas-accelerator.md. Se o perfil mostrar que o caminho crítico está sendo executado na CPU, use o Caminho 2 para controle explícito do cuDF.
Caminho 2: API cuDF Explícita
Para controle total, otimização de caminho crítico, migrações de DataFrame nomeadas e operações sensíveis à paridade:
import cudf
# Leia os dados diretamente para a GPU
df = cudf.read_parquet("data.parquet")
# As operações espelham o pandas
result = df.groupby("key")["value"].sum()
merged = df.merge(lookup, on="id", how="left")
filtered = df[df["amount"] > 1000]
# Operações com strings
df["clean"] = df["name"].str.strip().str.lower()
# Para verificar a cobertura da API antes de se comprometer com a migração:
# Consulte references/api-patterns.md para lacunas conhecidas e soluções alternativas
Mantenha os dados na GPU de ponta a ponta. Chame .to_pandas() apenas no final para exibição ou transferência para CPU ou não-GPU.
Prefira cuDF explícito para tarefas envolvendo read_csv/read_parquet, joins, groupby, reshape, tipos anuláveis, fillna/where, buckets de tempo, janelas rolantes ou verificações de paridade CPU/GPU. Adicione um pequeno caminho de validação CPU/GPU quando a semântica importar, em vez de confiar apenas na execução bem-sucedida.
Para código pandas com manipulação de nulos, reshape ou comportamento de séries temporais, leia references/api-patterns.md para a lista de verificação semântica relevante antes de reescrever. Um bootstrap cudf.pandas é suficiente para uma solicitação de alteração mínima; uma solicitação de implementação deve tornar o caminho crítico explícito e observável.
Para código pandas pesado em reshape (pivot_table, melt, stack/unstack, crosstab), mantenha o esquema de origem como parte do contrato: rótulos do índice, rótulos ou níveis das colunas, fill_value, aggfunc, margens e normalização. Use cuDF explícito onde o equivalente for suportado; use cudf.pandas ou uma fronteira de compatibilidade estreita quando a semântica exata do reshape do pandas for mais importante do que reescrever cada operação. Adicione uma pequena verificação de paridade de referência pandas para forma, rótulos e valores representativos antes de finalizar. Consulte references/api-patterns.md.
Caminho 3: dask-cuDF (Multi-GPU / Grandes Dados)
Quando o conjunto de dados excede a memória da GPU. Consulte references/dask-cudf-patterns.md para padrões completos.
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
import dask_cudf
cluster = LocalCUDACluster(enable_cudf_spill=True) # um worker por GPU
client = Client(cluster)
ddf = dask_cudf.read_parquet("s3://bucket/data/*.parquet")
result = ddf.groupby("key").agg({"value": "sum"}).compute()
Gerenciamento de Memória
Ative o spill antes que ocorra OOM (não depois):
import cudf
cudf.set_option("spill", True) # despeje para a RAM do host quando a GPU estiver cheia
Alocador de pool RMM (reduz a sobrecarga do cudaMalloc em pipelines com muitas alocações):
import rmm
rmm.set_current_device_resource(rmm.mr.CudaAsyncMemoryResource())
# Deve ser chamado ANTES de qualquer operação do cuDF
| GPU Livre vs Conjunto de Dados | Estratégia |
|---|---|
| Livre > 2× conjunto de dados | cuDF de GPU única |
| Livre 1–2× conjunto de dados | cuDF + `cudf.set_option("spill", True)` |
| Conjunto de dados > memória da GPU | dask-cuDF |
| Conjunto de dados > memória do nó | dask-cuDF + multi-nó (consulte accelerated-computing-mpf) |
Resolução de Problemas
Sem ganho de velocidade vs pandas:
- Dados
- Execute
%%cudf.pandas.profile— alta % de CPU significa muitos fallbacks. Identifique e corrija essas operações. - Verifique
references/api-patterns.mdpara lacunas conhecidas.
OOM (CUDA fora de memória):
- Ative o despejo:
cudf.set_option("spill", True) - Se a fragmentação do alocador ou a sobrecarga de alocação repetida for visível, use as diretrizes de configuração de recurso de memória
accelerated-computing-rmmantes das alocações na GPU - Ainda falhando: migre para o dask-cuDF
AttributeError / NotImplementedError:
- Verifique
references/api-patterns.mdpara a operação específica - Mantenha essa única operação na CPU em uma fronteira estreita e continue o pipeline suportado na GPU
- Use
.to_pandas()apenas para a operação não suportada, depois.from_pandas()de volta
Resultados incorretos vs pandas:
- O tratamento de nulos/NaN difere: o cuDF usa
<na></na>(anulável) por padrão, o pandas usaNaN. Consultereferences/api-patterns.md. - Estabilidade da ordenação: a ordenação do cuDF não é garantida como estável a menos que
stable=Trueseja passado - Se a diferença for devido a diferenças de ponto flutuante, tente fazer o cast para floats de maior precisão (por exemplo,
float64em vez defloat32). Se os resultados ainda forem diferentes, pare. Os algoritmos de GPU e CPU sempre produzirão resultados diferentes em números de ponto flutuante devido à não associatividade da aritmética de ponto flutuante, e isso não pode ser corrigido.
Semântica de Anuláveis e Preenchimento
Quando o usuário se importa explicitamente com os tipos de dados anuláveis do pandas, fillna, where/mask ou o comportamento de nulos agrupados, trate as verificações de paridade como parte da implementação. Consulte references/api-patterns.md para exemplos de tipos de dados anuláveis.
- Preserve as colunas de inteiros/strings anuláveis em vez de preenchê-las com valores sentinel, a menos que o código de origem já tenha feito isso.
- Mantenha a semântica
where/maskquando ela codifica uma condição. Usefillnaamplo apenas quando a condição for exatamente nula. - Compare com
to_pandas(nullable=True)quando a referência pandas usar tipos de dados de extensão anuláveis. - Coloque a verificação de paridade em um auxiliar reutilizável ao lado do caminho da GPU, para que as alterações futuras exercitem as mesmas verificações de conversão e agregação anuláveis.
- Valide as contagens de linhas, contagens de nulos, tabelas verdadeiras das máscaras, agregações agrupadas e tipos de dados representativos antes de afirmar a paridade semântica.
Arquivos de Referência
references/cudf-pandas-accelerator.md— Perfilamento, detecção de fallback, aprofundamento no cudf.pandasreferences/api-patterns.md— Lacunas conhecidas na API, soluções alternativas, diferenças semânticasreferences/dask-cudf-patterns.md— Padrões de Multi-GPU, melhores práticas, ajuste de partições
Documentação Externa
Use WebFetch para recuperar assinaturas de API detalhadas, descrições de parâmetros e exemplos sob demanda.
- Documentação do cuDF: https://docs.rapids.ai/api/cudf/stable/
- Referência da API do 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
Todos os arquivos
34 arquivosInstalar accelerated-computing-cudf
Baixe e extraia os arquivos de habilidade para o seu diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/NVIDIA/skills/tree/main/skills/accelerated-computing-cudf # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
