无法将 dask_cudf 数据帧加载和计算到 blazing 表中,并看到一些与内存相关的错误 cudaErrorMemoryAllocation 内存不足

问题描述

问题:

尝试使用 dask CUDF 加载文件(CSV 和 Parquet)并看到一些与内存相关的错误。数据集可以轻松放入内存和文件中 可以使用 Blazingsql 的 read_parquet 方法正确读取。然而 dask_cudf.read_parquet() 方法无法做到这一点。 两种文件格式都出现相同的错误

其他观察结果是,当从 cudf 数据帧创建 blazingsql 表时,该表被创建但记录为零。

如果有人可以提供任何指示来解决这个问题,将会很有帮助。

数据集信息:

行数 - 1.26 亿 列数 - 209 文件格式 – 镶木地板 分区数 - 8 文件大小镶木地板 - 400 MB 文件大小 csv - 62 GB

系统信息:

GPU - 6 (V100 特斯拉) 内存 - 16GB GPU 核心 - 32 核心

客户信息: 调度程序:tcp://127.0.0.1:36617 仪表板:http://127.0.0.1:8787/status 簇 工人:4 核心数:4 内存:239.89 GiB

代码

from blazingsql import BlazingContext
from dask.distributed import Client,wait
from dask_cuda import LocalCUDACluster
import dask
import dask_cudf
cluster = LocalCUDACluster()
client = Client(cluster)
bc = BlazingContext(dask_client=client)


ddf = dask_cudf.read_parquet('/home/ubuntu/126M_dataset/')
bc.create_table('table',ddf.compute())

错误信息:

super(NumericalColumn,col).fillna(fill_value,method)
    501 
    502     def find_first_value(

~/miniconda3/lib/python3.7/site-packages/cudf/core/column/column.py in fillna(self,value,method,dtype)
    733         """
    734         return libcudf.replace.replace_nulls(
--> 735             input_col=self,replacement=value,method=method,dtype=dtype
    736         )
    737 

cudf/_lib/replace.pyx in cudf._lib.replace.replace_nulls()

cudf/_lib/scalar.pyx in cudf._lib.scalar.as_device_scalar()

~/miniconda3/lib/python3.7/site-packages/cudf/core/scalar.py in device_value(self)
     75         if self._device_value is None:
     76             self._device_value = DeviceScalar(
---> 77                 self._host_value,self._host_dtype
     78             )
     79         return self._device_value

cudf/_lib/scalar.pyx in cudf._lib.scalar.DeviceScalar.__init__()

cudf/_lib/scalar.pyx in cudf._lib.scalar.DeviceScalar._set_value()

cudf/_lib/scalar.pyx in cudf._lib.scalar._set_numeric_from_np_scalar()

MemoryError: std::bad_alloc: CUDA error at: /home/ubuntu/miniconda3/include/rmm/mr/device/cuda_memory_resource.hpp:69: cudaErrorMemoryAllocation out of memory

系统信息:

nvidia-smi 信息:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 465.19.01    Driver Version: 465.19.01    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA Tesla V1...  On   | 00000000:00:1B.0 Off |                    0 |
| N/A   49C    P0    55W / 300W |  16147MiB / 16160MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA Tesla V1...  On   | 00000000:00:1C.0 Off |                    0 |
| N/A   48C    P0    56W / 300W |  16106MiB / 16160MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA Tesla V1...  On   | 00000000:00:1D.0 Off |                    0 |
| N/A   46C    P0    61W / 300W |  16106MiB / 16160MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  NVIDIA Tesla V1...  On   | 00000000:00:1E.0 Off |                    0 |
| N/A   48C    P0    60W / 300W |  16106MiB / 16160MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A    113949      C   ...ntu/miniconda3/bin/python      823MiB |
|    0   N/A  N/A    114055      C   ...ntu/miniconda3/bin/python    15319MiB |
|    1   N/A  N/A    114059      C   ...ntu/miniconda3/bin/python    16101MiB |
|    2   N/A  N/A    114062      C   ...ntu/miniconda3/bin/python    16101MiB |
|    3   N/A  N/A    114053      C   ...ntu/miniconda3/bin/python    16101MiB |
+-----------------------------------------------------------------------------+

解决方法

文件大小镶木地板 - 400 MB 文件大小 csv - 62 GB GPU - 6 (V100 TESLA) 内存 - 16GB GPU 核心 - 32 核心

当您在 Dask 集合上调用 compute 时,它会完全计算结果并将其作为单 GPU 对象带入客户端进程。您的数据可能会压倒其中一个 GPU 上的 16GB 内存。您可能正在寻找 persist,它会完全计算结果并将其存储在 worker 的内存中(请注意,执行将在后台进行,persist 将快速返回)。

此外,在从 Dask 对象创建 BlazingSQL 表之前,您也不应该需要保留数据。

您可能会发现 this answerthis blog postthis documentation 很有用。