问题描述
问题:
尝试使用 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 answer、this blog post 和 this documentation 很有用。