Python 推荐的cudf数据帧结构

Python 推荐的cudf数据帧结构,python,numpy,rapids,cudf,Python,Numpy,Rapids,Cudf,我对推荐的从密集的numpy对象创建cudf数据帧的快速方法感兴趣。我见过许多例子,将2d numpy矩阵的列拆分为元组,然后在元组列表上调用cudf.DataFrame,这相当昂贵。使用numba.cuda.to_设备相当快。是否可以使用numba.cuda.to_设备,或者是否有更有效的方法构建数据帧 [1]中的:导入cudf 在[2]中:导入numba.cuda 在[3]中:将numpy作为np导入 [4]中:data=np.random.random((300100)) In[5]:da

我对推荐的从密集的numpy对象创建cudf数据帧的快速方法感兴趣。我见过许多例子,将2d numpy矩阵的列拆分为元组,然后在元组列表上调用
cudf.DataFrame
,这相当昂贵。使用
numba.cuda.to_设备
相当快。是否可以使用
numba.cuda.to_设备
,或者是否有更有效的方法构建数据帧

[1]中的
:导入cudf
在[2]中:导入numba.cuda
在[3]中:将numpy作为np导入
[4]中:data=np.random.random((300100))
In[5]:data.nbytes
出[5]:240000
在[6]中:%时间numba.cuda.to_设备(数据)
CPU时间:用户8毫秒,系统:0纳秒,总计:8毫秒
墙壁时间:4.45毫秒
出[6]:
在[7]中:记录范围(data.shape[1])中的i的_data=('fea%d'%i,data[:,i]))
[8]中:%时间cudf.DataFrame(记录数据)
CPU时间:用户960毫秒,系统:508毫秒,总计:1.47秒
壁时间:1.61秒
出[8]:

上面显示的
cudf.DataFrame
比直接调用
numba.cuda.to_device
cudf.DataFrame
慢360x。DataFrame是一种专用的列格式,在处理非常高而不是很宽的数据时性能最好。但是,我们有一些重要的零拷贝函数,允许您以低廉的成本在
numba/cupy/cudf
之间移动数据。目前,据我所知,将原始
numpy
矩阵放入
cudf
的最佳方法是使用您确定的
to_设备
方法,然后是
中的
from_gpu_matrix

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])])
输出:


创建
cudf.DataFrame
的186ms是最短的创建时间,主要用于主机端管理列式内存和元数据。

请允许我提及
cudf.DataFrame.from_gpu_matrix()
方法自RAPIDS 0.17以来一直被弃用

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

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)

我使用官方RAPIDS docker图片中的jupyter在GTX 1080ti上运行了您的代码
rapidsai/rapidsai:cuda9.2-runtime-ubuntu16.04
numba.cuda.to_设备(…)
CPU时间:用户1.88毫秒,系统:13.2毫秒,总计:15毫秒
cudf.Dataframe(…)
CPU时间:用户10微秒,系统:4微秒,总计:14微秒
首先,您应该提交一个问题。我不认为
cuda.DataFrame
需要这么长时间,即使它创建了数百列。其次,您是否尝试过将
cudf.从_dlpack
cupy.组合到_dlpack
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)