Рекомендованный cudf Dataframe Construction

Я заинтересован в рекомендуемых и быстрых способах создания cudf DataFrames из плотных numpy объектов. Я видел много примеров разбиения столбцов двумерной матрицы на кортежи с последующим вызовом cudf.DataFrame в списке кортежей - это довольно дорого. С помощью numba.cuda.to_device довольно быстро Можно ли использовать numba.cuda.to_device или есть более эффективный способ построения DataFrame?

In [1]: import cudf

In [2]: import numba.cuda

In [3]: import numpy as np

In [4]: data = np.random.random((300,100))

In [5]: data.nbytes
Out[5]: 240000

In [6]: %time numba.cuda.to_device(data)
CPU times: user 8 ms, sys: 0 ns, total: 8 ms
Wall time: 4.45 ms
Out[6]: <numba.cuda.cudadrv.devicearray.DeviceNDArray at 0x7f8954f84550>

In [7]: record_data = (('fea%d'%i, data[:,i]) for i in range(data.shape[1]))

In [8]: %time cudf.DataFrame(record_data)
CPU times: user 960 ms, sys: 508 ms, total: 1.47 s
Wall time: 1.61 s
Out[8]: <cudf.DataFrame ncols=100 nrows=300 >

Выше показывает cudf.DataFrame ~ В 360 раз медленнее, чем прямой вызов numba.cuda.to_device

2 ответа

cudf.DataFrame- это специальный столбчатый формат, который лучше всего работает с очень высокими данными, а не с широкими. Однако у нас есть некоторые важные функции нулевого копирования, которые позволяют перемещать данные междуnumba/cupy/cudfнедорого. На данный момент, насколько мне известно, лучший способ получить необработанныйnumpy матрица в cudf использует to_device метод, как вы определили, а затем from_gpu_matrix в cudf.

import cudf
import numba.cuda
import numpy as np
data = np.random.random((300, 100))
%time gpu = numba.cuda.to_device(data)
%time df = cudf.DataFrame.from_gpu_matrix(gpu, columns = ['fea%d'%i for i in range(data.shape[1])])

Вне:

CPU times: user 4 ms, sys: 0 ns, total: 4 ms
Wall time: 872 µs
CPU times: user 180 ms, sys: 0 ns, total: 180 ms
Wall time: 186 ms

186 мс на создание cudf.DataFrame - это минимальное время создания, и это накладные расходы, в первую очередь, для управления столбчатой ​​памятью и метаданными на стороне хоста.

Пожалуйста, позвольте мне упомянуть, что cudf.DataFrame.from_gpu_matrix()метод устарел, начиная с RAPIDS 0.17.

В настоящее время, cudf.DataFrame()принимает Numba DeviceNDArrayс в качестве входных данных.

      import cudf
import numba as nb

# Convert a Numba DeviceNDArray to a cuDF DataFrame
src = nb.cuda.to_device([[1, 2], [3, 4]])
dst = cudf.DataFrame(src)

print(type(dst), "\n", dst)
Другие вопросы по тегам