You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dask DataFrame多GPU并行处理异常:GPU利用率为0求助

问题描述

我希望在Jupyter Notebook中使用Dask对Dask CuDF进行多GPU并行数据处理,以下是我的代码:

import cudf
from dask.distributed import Client, wait, get_worker, get_client 
from dask_cuda import LocalCUDACluster 
import dask.dataframe as dd 
import pandas as pd 
import random 

cluster = LocalCUDACluster(CUDA_VISIBLE_DEVICES="0,1", n_workers=2, threads_per_worker=4, memory_limit="12GB",  device_memory_limit="20GB", rmm_pool_size="2GB", rmm_maximum_pool_size="10GB") 

client = Client(cluster) 

client.run(cudf.set_allocator, "managed") 

worker_info = client.scheduler_info()["workers"] 

for worker, info in worker_info.items(): 
    print(worker) 

# tcp://127.x.x.x:xxxxxx 
# tcp://127.x.x.x:xxxxxx 

df = pd.DataFrame({'col_1':random.sample(range(10**3), 10**3), 'col_2': random.sample(range(10**3), 10**3) }) 

ddf = dd.from_pandas(df, npartitions=8) 

def test_f(df, col_1, col_2):
     return df.assign(result=df[col_1]*df[col_2])

ddf_out = ddf.map_partitions(test_f, 'col_1', 'col_2',  meta={'col_1':'int64', 'col_2':'int64', 'result':'int64'}) 

代码可正常运行,但GPU利用率始终为0。我期望8个数据分区能分配到2个GPU上并行处理以提升效率,请问我遗漏了哪些关键步骤?


关键遗漏步骤及修复方案

1. 未使用CuDF/Dask-CuDF数据格式

当前代码基于Pandas创建Dask DataFrame,所有计算都在CPU上执行,完全没用到GPU。需要切换为CuDF格式:

# 替换原df和ddf创建代码
df = cudf.DataFrame({'col_1':random.sample(range(10**3), 10**3), 'col_2': random.sample(range(10**3), 10**3) }) 
ddf = dd.from_cudf(df, npartitions=8)

2. 未触发Dask惰性计算

Dask默认是惰性执行,map_partitions仅定义计算流程,不会实际运行。必须调用触发方法才能让任务分发到GPU worker:

# 在代码末尾添加,触发计算并获取结果
result = ddf_out.compute()
# 或者持久化到GPU内存,方便后续操作
# ddf_out = ddf_out.persist()
# wait(ddf_out)

3. 未确保Worker绑定GPU设备

虽然设置了内存分配器,但需明确让每个Worker绑定对应GPU。修改LocalCUDACluster初始化参数,添加内存管理配置:

cluster = LocalCUDACluster(
    CUDA_VISIBLE_DEVICES="0,1", 
    n_workers=2, 
    threads_per_worker=4, 
    memory_limit="12GB",  
    device_memory_limit="20GB", 
    rmm_pool_size="2GB", 
    rmm_maximum_pool_size="10GB",
    rmm_managed_memory=True  # 确保使用RMM管理GPU内存
)

也可在计算函数中显式指定GPU设备:

def test_f(df, col_1, col_2):
    worker = get_worker()
    with cudf.get_default_session().device_context(worker.device):
        return df.assign(result=df[col_1]*df[col_2])

4. 数据量过小无法触发GPU有效计算

当前仅1000行数据,计算量远小于GPU调度开销,自然看不到利用率。建议增大数据量:

df = cudf.DataFrame({
    'col_1': random.sample(range(10**7), 10**7), 
    'col_2': random.sample(range(10**7), 10**7) 
}) 

内容的提问来源于stack exchange,提问作者mtnt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:15:17