笔者按,数据科学家需要算力。无论您是用 pandas 处理一个大数据集,还是用 numpy 在一个大矩阵上运行一些计算,您都需要一台强大的机器,以便在合理的时间内完成这项工作。
在过去的几年中,数据科学家常用的 python 库已经非常擅长利用 cpu 能力。
pandas 的基础代码是用 c 语言编写的,它可以很好地处理大小超过 100gb 的数据集。如果您没有足够的 ram 来容纳这样的数据集,那么您可以使用分块功能,它很方便,可以一次处理一个数据块。
gpus vs cpus:并行处理
有了大量的数据,cpu 就不会切断它了。
一个超过 100gb 的数据集将有许多数据点,数据点的数值在数百万甚至数十亿的范围内。有了这么多的数据点要处理,不管你的 cpu 有多快,它都没有足够的内核来进行有效的并行处理。如果你的 cpu 有 20 个内核(这将是相当昂贵的 cpu),你一次只能处理 20 个数据点!
cpu 在时钟频率更重要的任务中会更好——或者根本没有 gpu 实现。如果你尝试执行的流程有一个 gpu 实现,且该任务可以从并行处理中受益,那么 gpu 将更加有效。
使用 scikit-learn 在 cpu 上运行 dbscan 的结果
gpu 上带 rapids 的 dbscan
现在,让我们用 rapids 进行加速!
首先,我们将把数据转换为 pandas.dataframe 并使用它创建一个 cudf.dataframe。pandas.dataframe 无缝转换成 cudf.dataframe,数据格式无任何更改。
importpandasaspdimportcudfx_df=pd.dataframe({'fea%d'%i:x[:,i]foriinrange(x.shape[1])})x_gpu=cudf.dataframe.from_pandas(x_df)然后我们将从 cuml 导入并初始化一个特殊版本的 dbscan,它是 gpu 加速的版本。dbscan 的 cuml 版本的函数格式与 scikit-learn 的函数格式完全相同:相同的参数、相同的样式、相同的函数。
fromcumlimportdbscanascumldbscandb_gpu=cumldbscan(eps=0.6,min_samples=2)最后,我们可以在测量运行时间的同时运行 gpu dbscan 的预测函数。
%%timey_db_gpu=db_gpu.fit_predict(x_gpu)gpu 版本的运行时间为 4.22 秒,几乎加速了 2 倍。由于我们使用的是相同的算法,因此结果图也与 cpu 版本完全相同。
使用 cuml 在 gpu 上运行 dbscan 的结果
使用 rapids gpu 获得超高速
我们从 rapids 获得的加速量取决于我们正在处理的数据量。一个好的经验法则是,较大的数据集将更加受益于 gpu 加速。在 cpu 和 gpu 之间传输数据有一些开销时间——对于较大的数据集,开销时间变得更「值得」。
我们可以用一个简单的例子来说明这一点。
我们将创建一个随机数的 numpy 数组并对其应用 dbscan。我们将比较常规 cpu dbscan 和 cuml 的 gpu 版本的速度,同时增加和减少数据点的数量,以了解它如何影响我们的运行时间。
下面的代码说明如何进行测试:
importnumpyasnpn_rows,n_cols=10000,100x=np.random.rand(n_rows,n_cols)print(x.shape)x_df=pd.dataframe({'fea%d'%i:x[:,i]foriinrange(x.shape[1])})x_gpu=cudf.dataframe.from_pandas(x_df)db=dbscan(eps=3,min_samples=2)db_gpu=cumldbscan(eps=3,min_samples=2)%%timey_db=db.fit_predict(x)%%timey_db_gpu=db_gpu.fit_predict(x_gpu)检查下面的 matplotlib 结果图:
当使用 gpu 而不是 cpu 时,数量会急剧增加。即使在 10000 点(最左边),我们的速度仍然是 4.54x。在更高的一端,1 千万点,我们切换到 gpu 时的速度是 88.04x!
苏州到常德物流专线移动端要怎么设计才能更好地提升用户的体验?上海网站建设公司以顾客为上优酷网的高点击率对微视频网站的影响嘉兴到天长物流专线从搜索引擎优化的角度,制定本地门户网站的建设方案网站的基础优化包括几方面的优化?301重定向对于网站建设有什么意义?