最近,我在最近的项目中一直试图解决dask_cudf中的内存管理问题,但我似乎遗漏了一些东西,需要您的帮助。我正在工作的特斯拉T4 GPU与15 GiB内存。我有几个ETL步骤,但是GPU最近似乎在其中的大多数上失败了(其中大多数只是过滤或转换步骤,但很少有旋转移动)。我的数据包括大约20,500 My的拼花文件。对于这个特定的问题,我将提供一段用于过滤的代码,这将使GPU由于内存不足而失败。
我首先建立一个数据自动化系统集群:
CUDA_VISIBLE_DEVICES = os.environ.get("CUDA_VISIBLE_DEVICES", "0")
cluster = LocalCUDACluster(
# rmm_pool_size=get_rmm_size(0.6 * device_mem_size()),
CUDA_VISIBLE_DEVICES=CUDA_VISIBLE_DEVICES,
local_directory=os.path.join(WORKING_DIR, "dask-space"),
device_memory_limit=parse_bytes("12GB")
)
client = Client(cluster)
client
根据是否提供rmm_pool_size
参数,错误是不同的。当参数被提供时,我得到了最大池限制,否则我会得到以下错误:MemoryError: std::bad_alloc: CUDA error at: ../include/rmm/mr/device/cuda_memory_resource.hpp:70: cudaErrorMemoryAllocation out of memory
接下来,我将创建一个对数据执行的筛选操作(该操作主要检查列中的值是否出现在包含大约80000个值的集合中):
def remove_invalid_values_filter_factory(valid_value_set_or_series):
def f(df):
mask = df['col'].isin(valid_value_set_or_series)
return df.loc[mask]
return f
# Load valid values from another file
valid_values_info_df = pd.read_csv(...)
# The series is around 1 MiB in size
keep_known_values_only = remove_invalid_values_filter_factory(valid_values_info_df['values'])
# Tried both and both cause the error
# keep_known_values_only = remove_invalid_values_filter_factory(set(valid_values_info_df['values']))
最后,我对数据应用这个过滤器操作,并得到错误:
%%time
# Error occures during this processing step
keep_known_values_only(
dask_cudf.read_parquet(...)
).to_parquet(...)
我感到完全迷失了,我遇到的大多数来源都有这个错误,因为我使用cuDF而没有Dask,或者没有设置CUDA集群,但我两者都有。此外,根据直觉,过滤操作不应该是内存昂贵的,所以我不知道该做什么。我认为我设置集群的方式有问题,修复它将使更多内存昂贵的操作也能正常工作。
我很感谢你的帮助,谢谢!
发布于 2022-07-01 23:36:28
为此,我将使用dask来利用它在核心之外进行处理的能力。
至于dask_cudf功能失败,请在cudf回购中提出一个问题,最低限度的可重现性!我们会很感激的!)
你可能不想在一起做dask_cudf和RMM,除非你真的必须并且知道你在做什么(这就像急流超级使用模式,当你真的需要最大化GPU的大小时,使用一个algo)。如果您的使用需要这样做(而且您在这里使用的是拼花文件,这就是为什么我没有深入研究它的原因),它确实会有帮助。
https://stackoverflow.com/questions/72746034
复制相似问题