1 回答

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 上分發我們的數據。
添加回答
舉報