提交新活动

谢谢!您的提交已收到!
哎呀!提交表单时出错了。

提交新闻报道

谢谢!您的提交已收到!
哎呀!提交表单时出错了。

订阅通讯

谢谢!您的提交已收到!
哎呀!提交表单时出错了。
2019年3月4日

为 Dask 构建 GPU Groupby 聚合

作者

摘要

我们已充分调整 Dask DataFrame 和 cuDF,以便像下面这样的 groupby 聚合能很好地工作。

df.groupby('x').y.mean()

本文介绍了我们必须完成的工作类型,作为未来开发的模型。

计划

正如之前的一篇文章 Dask、Pandas 和 GPUs:第一步 所概述的,我们生产分布式 GPU dataframe 的计划是将 DaskDataFramecudf 结合起来。特别是,我们必须

  • 更改 Dask DataFrame,使其不仅能够并行处理当前使用的 Pandas DataFrame,还能并行处理任何看起来足够像 Pandas DataFrame 的对象
  • 更改 cuDF,使其看起来足够像 Pandas DataFrame,以便适应 Dask DataFrame 中的算法

变更

在 Dask 方面,这主要意味着替换

  • 将 isinstance(df, pd.DataFrame) 检查替换为 is_dataframe_like(df) 检查(在定义了合适的 is_dataframe_like/is_series_like/is_index_like 函数之后)
  • 避免使用 Pandas 中一些更特殊的功能,而是尝试使用我们认为在大多数 DataFrame 实现中都存在的更常用功能

在 cuDF 方面,这意味着进行数十处细微更改,以使 cuDF API 与 Pandas API 对齐,并添加缺失的功能。

我并不真的期望有人会浏览所有这些问题,但我希望通过快速浏览这些问题标题,人们能够了解我们正在进行的各种更改。这是大量小事情的集合。

此外,赞扬 Thomson Comer 解决了上述大部分 cuDF 问题。

仍有一些待解决的问题

但大多数功能都能工作

但总的来说,目前各项功能运行良好

In [1]: import dask_cudf

In [2]: df = dask_cudf.read_csv('yellow_tripdata_2016-*.csv')

In [3]: df.groupby('passenger_count').trip_distance.mean().compute()
Out[3]: <cudf.Series nrows=10 >

In [4]: _.to_pandas()
Out[4]
0 0.625424
1 4.976895
2 4.470014
3 5.955262
4 4.328076
5 3.079661
6 2.998077
7 3.147452
8 5.165570
9 5.916169
dtype: float64

经验

首先,大部分工作由 cuDF 开发者处理(从上面问题列表的相对长度可能可以看出来)。当我们开始这个过程时,感觉就像一个永无止境的细小问题流。直到完成当前的问题集,我们才能看到下一组问题。幸运的是,大多数问题都很容易修复。此外,随着我们继续前进,随着时间的推移,似乎变得更容易了一些。

此外,由于上述变更,除了 groupby 聚合之外的许多功能也能工作。从习惯使用 Pandas 的人的角度来看,cuDF 库开始感觉更可靠了。在对其他操作使用 cuDF 时,我们遇到缺失功能的频率降低了。

接下来是什么?

最近,我们一直在研究 Dask DataFrame 中的各种 join/merge 操作,例如在排序列上的索引 join,大型和小型 dataframe 之间的 join(一个常见的特殊情况)等等。让主线 Dask DataFrame 代码库中的这些算法与 cuDF 协同工作,产生的问题集与我们在上面看到的 groupby 聚合类似,但到目前为止,列表要小得多。我们希望随着未来继续研究其他功能集,例如 I/O、时间序列操作、滚动窗口等等,这是一个趋势。