Рекомендованный 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)