亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

處理大量 parquet 文件時出現 CUDF 錯誤

處理大量 parquet 文件時出現 CUDF 錯誤

HUWWW 2022-06-07 17:57:48
我在一個目錄中有 2000 個鑲木地板文件。每個 parquet 文件大小約為 20MB。使用的壓縮是 SNAPPY。每個 parquet 文件都有如下所示的行:+------------+-----------+-----------------+| customerId | productId | randomAttribute |+------------+-----------+-----------------+| ID1        | PRODUCT1  | ATTRIBUTE1      || ID2        | PRODUCT2  | ATTRIBUTE2      || ID2        | PRODUCT3  | ATTRIBUTE3      |+------------+-----------+-----------------+每個列條目都是一個字符串。我正在使用具有以下配置的 p3.8xlarge EC2 實例:內存:244GBvCPU : 32GPU RAM:64GB(每個GPU核心有16GB RAM)GPU:4特斯拉V100我正在嘗試以下代碼:def read_all_views(parquet_file_lst):    df_lst = []        for file in parquet_file_lst:        df = cudf.read_parquet(file, columns=['customerId', 'productId'])        df_lst.append(df)    return cudf.concat(df_lst)這在處理前 180 個文件后崩潰,并出現以下運行時錯誤:Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 9, in read_all_viewsFile "/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_parquetFile "cudf/_lib/parquet.pyx", line 80, in cudf._lib.parquet.read_parquetRuntimeError: rmm_allocator::allocate(): RMM_ALLOC: unspecified launch failure在任何給定時間,只有 10% 的 GPU 和 CPU RAM 被使用。任何想法如何調試這個或相同的解決方法是什么?
查看完整描述

1 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

cuDF 是一個單一的 GPU 庫。2000 個 20 MB 的文件大約是 40 GB 的數據,這比單個 V100 GPU 的內存容量要多。


對于需要更多單個 GPU 的工作流程,cuDF 依賴于 Dask。以下示例說明了如何使用 cuDF + Dask 將數據讀入分布式 GPU 內存,單個節點中有多個 GPU。這不能回答您的調試問題,但應該有望解決您的問題。


首先,我使用幾行代碼來創建一個包含兩個 GPU 的 Dask 集群。


from dask.distributed import Client

from dask_cuda import LocalCUDACluster

import dask_cudf


cluster = LocalCUDACluster() # by default use all GPUs in the node. I have two.

client = Client(cluster)

client

# The print output of client:

# Client

# Scheduler: tcp://127.0.0.1:44764

# Dashboard: http://127.0.0.1:8787/status


# Cluster

# Workers: 2

# Cores: 2

# Memory: 404.27 GB


接下來,我將為此示例創建幾個 parquet 文件。


import os


import cudf

from cudf.datasets import randomdata


if not os.path.exists('example_output'):

    os.mkdir('example_output')


for x in range(2):

    df = randomdata(nrows=10000,

                dtypes={'a':int, 'b':str, 'c':str, 'd':int},

                seed=12)

    df.to_parquet('example_output/df')

讓我們看看我的每個 GPU 上的內存nvidia-smi。


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 的內存中已經有不相關的數據)?,F在讓我們使用 Dask cuDF 讀取兩個 parquet 文件的整個目錄,然后讀取persist它。堅持它會強制計算——Dask 執行是惰性的,因此僅調用read_parquet只會將任務添加到任務圖中。ddf是一個 Dask DataFrame。


ddf = dask_cudf.read_parquet('example_output/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 上分發我們的數據。


查看完整回答
反對 回復 2022-06-07
  • 1 回答
  • 0 關注
  • 260 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號