4

我对从密集的 numpy 对象创建 cudf DataFrames 的推荐和快速方法感兴趣。我已经看到了许多将 2d 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

4

2 回答 2

1

cudf.DataFrame是一种专用的列格式,在处理非常高而不是宽的数据时表现最佳。但是,我们有一些重要的零拷贝功能,可以让您以numba/cupy/cudf低廉的价格在它们之间移动数据。目前,据我所知,获取原始numpy矩阵的最佳方法cudf是使用to_device您确定的方法,然后使用from_gpu_matrixin 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是最短的创建时间,主要用于主机端管理列式内存和元数据。

于 2020-01-07T16:45:32.993 回答
1

请让我提一下,cudf.DataFrame.from_gpu_matrix()自 RAPIDS 0.17 以来,该方法已被弃用。

现在,cudf.DataFrame()接受Numba DeviceNDArrays 作为输入数据。

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)
于 2021-01-31T22:28:45.797 回答