Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CUDF处理大量拼花文件时出错_Python_Nvidia_Dask_Parquet_Cudf - Fatal编程技术网

Python CUDF处理大量拼花文件时出错

Python CUDF处理大量拼花文件时出错,python,nvidia,dask,parquet,cudf,Python,Nvidia,Dask,Parquet,Cudf,我在一个目录中有2000个拼花文件。每个拼花地板文件的大小约为20MB。使用的压缩是快速的。每个拼花地板文件都有如下所示的行: +------------+-----------+-----------------+ | customerId | productId | randomAttribute | +------------+-----------+-----------------+ | ID1 | PRODUCT1 | ATTRIBUTE1 | | ID2

我在一个目录中有2000个拼花文件。每个拼花地板文件的大小约为20MB。使用的压缩是快速的。每个拼花地板文件都有如下所示的行:

+------------+-----------+-----------------+
| customerId | productId | randomAttribute |
+------------+-----------+-----------------+
| ID1        | PRODUCT1  | ATTRIBUTE1      |
| ID2        | PRODUCT2  | ATTRIBUTE2      |
| ID2        | PRODUCT3  | ATTRIBUTE3      |
+------------+-----------+-----------------+
每个列条目都是一个字符串。 我使用的p3.8XL大型EC2实例具有以下配置:

  • 内存:244GB
  • vCPU:32
  • GPU RAM:64GB(每个GPU内核有16GB的RAM)
  • GPU:4特斯拉V100
我正在尝试以下代码:

def读取所有视图(拼花地板文件):
df_lst=[]
对于拼花地板中的锉刀:
df=cudf.read_拼花地板(文件,列=['customerId','productId'])
附加(df)
返回cudf.concat(df_lst)
这在处理前180个文件后崩溃,出现以下运行时错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in read_all_views
File "/home/ubuntu/miniconda3/lib/python3.7/site-packages/cudf/io/parquet.py", line 54, in read_parquet
    use_pandas_metadata,
File "cudf/_lib/parquet.pyx", line 25, in 
cudf._lib.parquet.read_parquet
File "cudf/_lib/parquet.pyx", line 80, in cudf._lib.parquet.read_parquet
RuntimeError: rmm_allocator::allocate(): RMM_ALLOC: unspecified launch failure
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第9行,在“全部读取”视图中
文件“/home/ubuntu/miniconda3/lib/python3.7/site packages/cudf/io/parquet.py”,第54行,以read_parquet格式
使用\u熊猫\u元数据,
文件“cudf/_lib/parquet.pyx”,第25行,在
cudf._lib.parquet.read_parquet
文件“cudf/_lib/parquet.pyx”,第80行,在cudf._lib.parquet.read_parquet中
运行时错误:rmm_分配器::allocate():rmm_ALLOC:未指定的启动失败
在任何给定的时间,只有10%的GPU和CPU RAM被利用。
有没有关于如何调试的想法,或者有哪些解决方法

cuDF是一个单一的GPU库。2000个20MB的文件大约是40GB的数据,这超出了单个V100GPU的内存容量

对于需要更多单个GPU的工作流,cuDF依赖Dask。下面的示例说明了如何使用cuDF+Dask在单个节点中使用多个GPU将数据读取到分布式GPU内存中。这并不能回答您的调试问题,但有望解决您的问题

首先,我使用几行代码创建一个由两个GPU组成的Dask集群

来自dask.distributed import客户端
从dask_cuda导入本地CudCluster
进口达斯库
cluster=LocalCUDACluster()#默认情况下使用节点中的所有GPU。我有两个。
客户端=客户端(群集)
客户
#客户端的打印输出:
# 
#客户
#调度程序:tcp://127.0.0.1:44764
#仪表板:http://127.0.0.1:8787/status
#簇
#工人:2名
#核心:2
#内存:404.27 GB
接下来,我将为这个示例创建几个拼花地板文件

导入操作系统
导入cudf
从cudf.dataset导入随机数据
如果不存在os.path.exists('example_output'):
os.mkdir('example_output')
对于范围(2)内的x:
df=随机数据(nrows=10000,
数据类型={a':int,'b':str,'c':str,'d':int},
种子=12)
df.至拼花地板(“示例输出/df”)
让我们用
nvidia smi
查看每个GPU上的内存

nvidia-smi
Thu Sep 26 19:13:46 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:AF:00.0 Off |                    0 |
| N/A   51C    P0    29W /  70W |   6836MiB / 15079MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            On   | 00000000:D8:00.0 Off |                    0 |
| N/A   47C    P0    28W /  70W |   5750MiB / 15079MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
请注意这两个值。GPU 0上有6836 MB,GPU 1上有5750 MB(我碰巧在这些GPU的内存中已经有不相关的数据)。现在,让我们用Dask cuDF读取两个拼花地板文件的整个目录,然后
persist
it。持久化它会强制计算——Dask执行是惰性的,因此只需调用
read\u parquet
即可将任务添加到任务图中
ddf
是一个Dask数据帧

ddf=dask\u cudf.read\u拼花地板(“示例输出/df”)
ddf=ddf.persist()
现在让我们再看一次nvidia smi

Thu Sep 26 19:13:52 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:AF:00.0 Off |                    0 |
| N/A   51C    P0    29W /  70W |   6938MiB / 15079MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            On   | 00000000:D8:00.0 Off |                    0 |
| N/A   47C    P0    28W /  70W |   5852MiB / 15079MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Dask负责在两个GPU之间为我们分发数据。

cuDF是一个单一的GPU库。2000个20MB的文件大约是40GB的数据,这超出了单个V100GPU的内存容量

对于需要更多单个GPU的工作流,cuDF依赖Dask。下面的示例说明了如何使用cuDF+Dask在单个节点中使用多个GPU将数据读取到分布式GPU内存中。这并不能回答您的调试问题,但有望解决您的问题

首先,我使用几行代码创建一个由两个GPU组成的Dask集群

来自dask.distributed import客户端
从dask_cuda导入本地CudCluster
进口达斯库
cluster=LocalCUDACluster()#默认情况下使用节点中的所有GPU。我有两个。
客户端=客户端(群集)
客户
#客户端的打印输出:
# 
#客户
#调度程序:tcp://127.0.0.1:44764
#仪表板:http://127.0.0.1:8787/status
#簇
#工人:2名
#核心:2
#内存:404.27 GB
接下来,我将为这个示例创建几个拼花地板文件

导入操作系统
导入cudf
从cudf.dataset导入随机数据
如果不存在os.path.exists('example_output'):
os.mkdir('example_output')
对于范围(2)内的x:
df=随机数据(nrows=10000,
数据类型={a':int,'b':str,'c':str,'d':int},
种子=12)
df.至拼花地板(“示例输出/df”)
让我们用
nvidia smi
查看每个GPU上的内存

nvidia-smi
Thu Sep 26 19:13:46 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:AF:00.0 Off |                    0 |
| N/A   51C    P0    29W /  70W |   6836MiB / 15079MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            On   | 00000000:D8:00.0 Off |                    0 |
| N/A   47C    P0    28W /  70W |   5750MiB / 15079MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
请注意这两个值。GPU 0上有6836 MB,GPU 1上有5750 MB(我碰巧在这些GPU的内存中已经有不相关的数据)。现在,让我们用Dask cuDF读取两个拼花地板文件的整个目录,然后
persist
it。持久化它会强制计算——Dask执行是惰性的,因此只需调用
read\u parquet
即可将任务添加到任务图中
ddf
是一个Dask数据帧

ddf=dask\u cudf.read\u拼花地板(“示例输出/df”)
ddf=ddf.persist()
现在让我们再看一次nvidia smi

Thu Sep 26 19:13:52 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:AF:00.0 Off |                    0 |
| N/A   51C    P0    29W /  70W |   6938MiB / 15079MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            On   | 00000000:D8:00.0 Off |                    0 |
| N/A   47C    P0    28W /  70W |   5852MiB / 15079MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Dask负责在两个GPU之间为我们分发数据。

您是否尝试使用
Dask
读取所有文件?看,我现在有了。谢谢。您是否尝试使用
dask
读取所有文件?看,我现在有了。谢谢