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
相关产品推荐
相关产品推荐

