Ошибка CUDF при обработке большого количества файлов паркета - PullRequest
1 голос
/ 26 сентября 2019

У меня есть 2000 паркетных файлов в каталоге.Размер каждого файла паркета составляет около 20 МБ.Используется сжатие SNAPPY.Каждый файл паркета имеет строки, которые выглядят следующим образом:

+------------+-----------+-----------------+
| customerId | productId | randomAttribute |
+------------+-----------+-----------------+
| ID1        | PRODUCT1  | ATTRIBUTE1      |
| ID2        | PRODUCT2  | ATTRIBUTE2      |
| ID2        | PRODUCT3  | ATTRIBUTE3      |
+------------+-----------+-----------------+

Каждая запись столбца является строкой.Я использую p3.8xlarge EC2 экземпляр со следующими конфигурациями:

  • RAM : 244 ГБ
  • vCPU : 32
  • Оперативная память графического процессора : 64 ГБ (каждое ядро ​​имеет 16 ГБ оперативной памяти)
  • Графические процессоры : 4 Tesla 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_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

Только 10% как графического процессора, так и оперативной памяти ЦП используется в любомданное время.Любые идеи, как отладить это или какие обходные пути для того же?

1 Ответ

1 голос
/ 26 сентября 2019

cuDF - это библиотека с одним графическим процессором.2000 файлов размером 20 МБ - это около 40 ГБ данных, что больше, чем вы можете уместить в памяти в одном графическом процессоре V100.

Для рабочих процессов, требующих более одного графического процессора, cuDF использует Dask.В следующем примере показано, как можно использовать cuDF + Dask для чтения данных в распределенную память графического процессора с несколькими графическими процессорами в одном узле.Это не отвечает на ваш вопрос об отладке, но, надеюсь, решит вашу проблему.

Сначала я использую несколько строк кода для создания кластера 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

ДалееДля этого примера я создам несколько паркетных файлов.

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')

Давайте рассмотрим память на каждом из моих графических процессоров с помощью 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      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Обратите внимание на два значения,6836 МБ на GPU 0 и 5750 МБ на GPU 1 (у меня на этих графических процессорах уже есть несвязанные данные).Теперь давайте прочитаем весь наш каталог из двух паркетных файлов с Dask cuDF и затем persist it.Сохранение этого приводит к вычислениям - выполнение 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 обрабатывает распределение данных по обоим графическим процессорам для нас.

...