实时笔记本

您可以在 live session Binder 中运行此笔记本,或查看 Github 上的内容。

2021 Dask 用户调查结果

本文展示了2021年Dask用户调查的结果,该调查在今年早些时候进行。感谢所有抽出时间填写调查的人!这些结果帮助我们更好地理解Dask社区,并将指导未来的开发工作。

原始数据以及分析的开始可以在以下binder中找到:

2021 Binder

如果你在数据中发现任何问题,请告诉我们。

内容

  • 亮点

  • 谁是 Dask 用户?

  • 人们如何喜欢使用 Dask

  • 诊断

  • 稳定性

  • 用户满意度、支持和文档

  • 改进建议

  • 之前的调查结果

亮点

我们收到了247份调查回复(与去年大致相同,去年收到了略低于240份的回复)。总体而言,回复与往年相似。

我们在调查中提出了43个问题(与去年相比增加了18个问题)。我们提出了一些关于人们工作所用数据集类型、Dask的稳定性以及人们所在行业的新问题。

我们的社区希望:

  • 更多文档和示例

  • 更多中级水平的文档

  • 为了提高Dask的弹性(即计算是否完成?)

用户也重视这些功能:

  • 改进的缩放

  • 易于部署

  • 更好的 scikit-learn 和机器学习支持

典型的 Dask 用户

调查显示我们社区中存在很多多样性,使用Dask的方式也多种多样。也就是说,我们假设的“典型”Dask用户:

  • 适用于千兆字节大小的数据集

  • 存储在本地文件系统上

  • 已经使用 Dask 1 到 3 年

  • 偶尔使用 Dask,不是每天

  • 至少在部分时间内交互式使用 Dask

  • 使用计算集群(可能)

  • 喜欢使用网络浏览器查看 Dask 仪表板

  • 在大多数情况下,Dask 已经足够稳定以满足他们的需求,但提高 Dask 的弹性将会有所帮助。

  • 使用 Dask 数据帧、延迟计算,可能还有 Dask 数组 API,以及 numpy/pandas 和其他 Python 库

  • 对这个人最有帮助的事情是更多的文档,以及更多在其领域中使用Dask的示例。

  • 他们可能在科学领域工作(可能是地球科学、生命科学、物理学或天文学),或者他们可能在会计、金融、保险行业工作,或者作为技术人员。

您可以在这里阅读往年调查结果:2020年调查结果2019年调查结果

[ ]:
# Let's load in the survey data...
%matplotlib inline

from pprint import pprint
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import textwrap
import re


df2019 = (
    pd.read_csv("data/2019-user-survey-results.csv.gz", parse_dates=["Timestamp"])
      .replace({"How often do you use Dask?": "I use Dask all the time, even when I sleep"}, "Every day")
)

df2020 = (
    pd.read_csv("data/2020-user-survey-results.csv.gz")
      .assign(Timestamp=lambda df: pd.to_datetime(df['Timestamp'], format="%Y/%m/%d %H:%M:%S %p %Z").astype('datetime64[ns]'))
      .replace({"How often do you use Dask?": "I use Dask all the time, even when I sleep"}, "Every day")
)

df2021 = (
    pd.read_csv("data/2021-user-survey-results.csv.gz")
      .assign(Timestamp=lambda df: pd.to_datetime(df['Timestamp']).astype('datetime64[ns]'))
      .replace({"How often do you use Dask?": "I use Dask all the time, even when I sleep"}, "Every day")
)

common = df2019.columns.intersection(df2020.columns).intersection(df2021.columns)
added = df2021.columns.difference(df2020.columns)
dropped = df2020.columns.difference(df2021.columns)

df = pd.concat([df2019, df2020, df2021])
df['Year'] = df.Timestamp.dt.year
df = df.set_index(['Year', 'Timestamp']).sort_index()

Dask 的用户是谁?

大多数人表示他们偶尔使用Dask,而一小部分人每天使用Dask。人们使用Dask的时间长短不一,最常见的回答是使用了一到三年。

[ ]:
q = "How often do you use Dask?"
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(";").explode().to_frame());
ax.set(ylabel="", title=q);
[ ]:
q = "How long have you used Dask?"  # New question in 2021
order = ["More than 3 years", "1 - 3 years", "3 months - 1 year", "Less than 3 months", "I've never used Dask"]
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(";").explode().to_frame(), order=order);
ax.set(ylabel="", title=q);

超过一半的受访者与其他人(他们的团队或组织)一起使用 Dask,而另一半则独自使用 Dask。

[ ]:
q = "Do you use Dask as part of a larger group?"
order = [
    'I use Dask mostly on my own',
    'My team or research group also use Dask',
    'Beyond my group, many people throughout my institution use Dask',
]
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(";").explode().to_frame(), order=order)
ax.set(ylabel="", title=q);

在去年,声称其机构内许多人使用 Dask 的人数有所增加(2021 年有 32 人这样说,而 2020 年有 19 人)。在 2019 年到 2020 年之间,声称其直接团队也使用 Dask 的人数有所下降(2019 年有 121 人这样说,而 2020 年有 94 人)。目前尚不清楚为何会出现这些变化,因此未来几年会发生什么将非常有趣。

[ ]:
q = 'Do you use Dask as part of a larger group?'
ax = sns.countplot(y=q, hue="Year", data=df.reset_index());
ax.set(ylabel="", title=q);

你在哪个行业工作?

调查中涵盖了多种多样的行业。

几乎一半的回复来自与科学、学术或政府实验室相关的行业。地球科学领域的回复最多,而生命科学、物理学和天文学也是热门领域。

大约30%的回复来自商业和技术领域的人士。其中,会计/金融/保险行业的人与其他技术人员之间的比例大致相当。

大约10%的回复属于制造业、工程业和其他行业(能源、航空航天等)。其余的回复难以分类。

[ ]:
q = "What industry do you work in?"  # New question in 2021
data = df2021[q].dropna().str.split(";").explode().to_frame()
order = data.value_counts()[data.value_counts() > 1].keys().get_level_values(0)
ax = sns.countplot(y=q, data=data, order=order);
ax.set(ylabel="", title=q);

你升级到Python库的较新版本有多容易?

大多数用户在想要时能够轻松升级到更新版本的Python库。

[ ]:
q = "How easy is it for you to upgrade to newer versions of Python libraries"
sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame()).set_ylabel('Scale from 1 (Difficult) to 4 (Easy)');

人们喜欢如何使用 Dask

人们喜欢将 Dask 与 numpy 和 pandas 结合使用,以及其他一系列的 Python 库。最受欢迎的 Dask API 包括 Dask DataframesDask DelayedDask Arrays

绝大多数人喜欢至少部分时间在 Jupyter 或 IPython 中交互式地使用 Dask,大多数人通过网页浏览器查看 Dask 仪表盘

你经常与Dask一起使用哪些其他库?

人们最常与 Dask 一起使用的十个库是:numpypandasxarrayscikit-learnscipystatsmodelsmatplotlibxgboostnumbajoblib

[ ]:
q = "What are some other libraries that you often use with Dask?"
data = df2021[q].dropna().str.lower().str.split(", ").explode().to_frame()
labels = pd.value_counts(data[q]).iloc[:10].index
sns.countplot(y=q, data=data, order=labels).set_ylabel('');

Dask API

人们最常使用的三个 Dask API 是:1. Dask Dataframes 2. Dask Delayed 3. Dask Arrays

在2021年,我们观察到使用 dask delayed 的人数略有增加,相比前几年。这可能是一件好事,随着人们对Dask的经验和信心的增长,他们可能更倾向于开始使用 delayed 等更高级的功能。除了这一变化,偏好与前几年的结果相当相似。

[ ]:
apis = df2021['Dask APIs'].str.split(", ").explode()
top = apis.value_counts().loc[lambda x: x > 10]
apis = apis[apis.isin(top.index)].reset_index()

sns.countplot(y="Dask APIs", data=apis);

交互式还是批处理?

绝大多数人喜欢至少部分时间在 Jupyter 或 IPython 中交互式地使用 Dask。不到 15% 的 Dask 用户仅在批处理模式下使用 Dask(提交将在未来运行的脚本)。

[ ]:
q = 'Interactive or Batch?'
data = df2021[q].dropna()
data = data.str.replace('Interactive:  I use Dask with Jupyter or IPython when playing with data, Batch: I submit scripts that run in the future', "Interactive and Batch")
data = data.str.replace('Interactive:  I use Dask with Jupyter or IPython when playing with data', "Interactive")
data = data.str.replace('Batch: I submit scripts that run in the future', "Batch")
order = ["Interactive and Batch", "Interactive", "Batch"]
sns.countplot(y=q, data=data.explode().to_frame(), order=order).set_ylabel('');

如何查看 Dask 的仪表板?

大多数人使用网页浏览器查看 Dask 仪表板。一小部分人使用 dask jupyterlab 扩展

仍有少数人不太确定仪表盘是什么。如果你也是其中之一,你可能想观看 这个20分钟的视频 ,它解释了为什么仪表盘非常有用,或者查看 这里的文档

[ ]:
q = "How do you view Dask's dashboard?"
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(", ").explode().to_frame());
ax.set(ylabel="", title=q);

本地机器还是集群?

大约三分之二的受访者至少在部分时间使用计算集群。

[ ]:
q = 'Local machine or Cluster?'
df[q].dropna().str.contains("Cluster").astype(int).groupby("Year").mean()
[ ]:
q = 'Local machine or Cluster?'
order = [
    'Personal laptop',
    'Large workstation',
    'Cluster of 2-10 machines',
    'Cluster with 10-100 machines',
    'Cluster with 100+ machines'
]
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(", ").explode().to_frame(), order=order);
ax.set(ylabel="", title=q);

如果你使用集群,如何启动 Dask?

SSH 是在计算集群上启动 Dask 的最常见方式,其次是 HPC 资源管理器,然后是 Kubernetes。

[ ]:
q = "If you use a cluster, how do you launch Dask? "
data = df2021[q].dropna()
data = data.str.replace("HPC resource manager (SLURM, PBS, SGE, LSF or similar)", "HPC resource manager (SLURM PBS SGE LSF or similar)", regex=False)
data = data.str.replace("I don't know, someone else does this for me", "I don't know someone else does this for me", regex=False)
data = data.str.split(", ").explode().to_frame()
order = data.value_counts()[data.value_counts() > 1].keys().get_level_values(0)
ax = sns.countplot(y=q, data=data, order=order);
ax.set(ylabel="", title=q);

如果你使用集群,你是否需要在同一个集群中使用多种工作节点类型?

在使用计算集群的人群中,略少于一半的人需要在同一个集群中使用多种工作节点类型。例如,这可能包括混合使用带GPU和不带GPU的工作节点,混合使用低内存或高内存分配的工作节点等。

[ ]:
q = "If you use a cluster, do you have a need for multiple worker / machine types (e.g. GPU / no GPU, low / high memory) in the same cluster?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(";").explode().to_frame());
ax.set(ylabel="", title="Do you need multiple worker/machine types on a cluster?");

数据集

你们的典型数据集有多大?

Dask 用户最常处理的是千兆字节大小的数据集。很少有用户处理千兆字节大小的数据集。

[ ]:
q = "How large are your datasets typically?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(", ").explode().to_frame());
ax.set(ylabel="", title=q);

您的数据集通常存储在哪里?

大多数人将他们的数据存储在本地文件系统中。

[ ]:
q = "Where are your datasets typically stored?"  # New question in 2021
data = df2021[q].dropna().str.split(", ").explode().to_frame()
order = data.value_counts()[data.value_counts() > 1].keys().get_level_values(0)
ax = sns.countplot(y=q, data=data, order=order);
ax.set(ylabel="", title=q);

你通常处理哪些文件格式?

两种最常见的文件格式(csvparquet)在 Dask Dataframe 用户中很受欢迎。JSON 文件格式也经常与 Dask 一起使用。第四和第五种最常见的文件类型(HDF5zarr)在 Dask Array 用户中很受欢迎。这与我们所知的 Dask Dataframe API 是最受欢迎的,其次是 Dask Arrays 的情况相符。

[ ]:
q = "What file formats do you typically work with?"  # New question in 2021
data = df2021[q].dropna().str.split(", ").explode().to_frame()
order = data.value_counts()[data.value_counts() > 1].keys().get_level_values(0)
ax = sns.countplot(y=q, data=data, order=order);
ax.set(ylabel="", title=q);

这个调查问题有一个长尾:报告了非常多种类的专业文件格式,其中大多数只被一两个回复调查的人使用。

许多这些专门的文件格式存储图像数据,特定于特定领域(天文学、地球科学、显微镜学等)。

[ ]:
list(data.value_counts()[data.value_counts() == 1].keys().get_level_values(0))

XKCD 漫画 927:标准

XKCD 漫画 “标准” https://xkcd.com/927/

首选云?

最受欢迎的云解决方案是亚马逊网络服务 (AWS),其次是谷歌云平台 (GCP) 和微软 Azure。

[ ]:
q = "Preferred Cloud?"
order = [
    "Amazon Web Services (AWS)",
    "Google Cloud Platform (GCP)",
    "Microsoft Azure",
    "Digital Ocean",
]
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(", ").explode().to_frame(), order=order);
ax.set(ylabel="", title=q);

你使用 Dask 项目来部署吗?

在使用 dask 项目进行部署的人群中,dask-jobqueuedask helm chart 是最受欢迎的两个选项。人们用于部署的项目种类繁多。

[ ]:
q = "Do you use Dask projects to deploy?"
order = [
    "dask-jobqueue",
    "dask's helm chart",
    "dask-kubernetes",
    "dask's docker image at daskdev/dask",
    "dask-gateway",
    "dask-ssh",
    "dask-cloudprovider",
    "dask-yarn",
    "qhub",
    "dask-mpi",
]
ax = sns.countplot(y=q, data=df2021[q].dropna().str.lower().str.split(", ").explode().to_frame(), order=order);
ax.set(ylabel="", title=q);

诊断

我们之前看到,大多数人喜欢使用他们的网络浏览器查看 Dask 仪表板。

在仪表盘上,人们表示最有用的诊断图是:

  1. 任务流图

  2. 进度图,以及

  3. 每个工作者的内存使用情况图

[ ]:
q = "Which Diagnostic plots are most useful?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().str.split(', ').explode().to_frame());
ax.set(ylabel="", title=q);

我们还就2021年的诊断提出了一些新问题。

我们发现,大多数人(65%)不使用 Dask性能报告 ,这是一种将诊断仪表板保存为静态HTML图表以供日后查看的方法。

[ ]:
q = "Do you use Dask's Performance reports?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].explode().to_frame(), order=["Yes", "No"]);
ax.set(ylabel="", title=q);

很少有人使用 Dask 的 Prometheus 指标。Jacob Tomlinson 有一篇关于 使用 Prometheus + Grafana 监控 Dask + RAPIDS 的优秀文章,如果你对如何使用这个功能感兴趣的话。

[ ]:
q = "Do you use Dask's Prometheus Metrics?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].explode().to_frame(), order=["Yes", "No"]);
ax.set(ylabel="", title=q);

稳定性

我们围绕Dask的稳定性提出了许多问题,其中许多是2021年的新问题。

大多数人表示 Dask 对他们来说足够有弹性(例如:计算完成)。然而,这是一个我们可以改进的领域,因为有 36% 的人不满意。这是一个 2021 年的新问题,所以我们无法说明人们对 Dask 弹性的看法随时间的变化。

[ ]:
q = "Is Dask resilient enough for you? (e.g. computations complete)."  # new question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame(), order=["Yes", "No"]);
ax.set(ylabel="", title="Is Dask resilient enough for you?");

大多数人表示,Dask 总体上对他们来说是足够稳定的(例如:在不同版本发布之间)。这与前几年的调查结果相似。

[ ]:
q = "Is Dask stable enough for you?"
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame(), order=["Yes", "No"]);
ax.set(ylabel="", title=q);

人们也认为 Dask 的 API 对他们来说足够稳定。

[ ]:
q = "Is Dask's API stable enough for you?"
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame(), order=["Yes", "No"]);
ax.set(ylabel="", title=q);

绝大多数人对当前的发布频率(大约每两周一次)感到满意。

[ ]:
q = "How is Dask's release frequency?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame());
ax.set(ylabel="", title=q);

大多数人表示,如果Dask有长期支持版本,他们会将代码固定在该版本上。

[ ]:
q = "If Dask had Long-term support (LTS) releases, would you pin your code to use them?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame(), order=["Yes", "No"]);
ax.set(ylabel="", title="Would you pin to a long term support release?");

用户满意度、支持和文档

我们在2021年的调查中提出了许多关于用户满意度的新问题。

Dask 使用起来有多简单?

大多数人表示Dask使用起来中等容易,这与之前的调查结果相同。

[ ]:
q = "On a scale of 1 - 5 (1 being hardest, 5 being easiest) how easy is Dask to use?"
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame());
ax.set(ylabel="1 = Difficult, 5 = Easy", title="How easy is Dask to use?");

Dask 的文档如何?

大多数人认为 Dask 的文档相当不错。

[ ]:
q = "How is Dask's documentation?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame());
ax.set(ylabel="1 = Not good, 5 = Great", title=q);

你对GitHub上维护者的响应速度有多满意?

几乎所有回应的人都对Dask在GitHub上的维护者响应持积极态度。

[ ]:
q = "How satisfied are you with maintainer responsiveness on GitHub?"  # New question in 2021
ax = sns.countplot(y=q, data=df2021[q].dropna().explode().to_frame());
ax.set(ylabel="1 = Not satisfied, 5 = Thrilled", title=q);

过去六个月中,您使用了哪些Dask资源来寻求支持?

dask.org 上的文档是大多数用户寻求帮助的首选之地。

2021年对该问题的回答分解与往年非常相似,除了似乎没有人知道 Dask YouTube 频道 或 Gitter 聊天在2019年存在。

[ ]:
q = 'What Dask resources have you used for support in the last six months?'

resource_map = {
    "Tutorial": "Tutorial at tutorial.dask.org",
    "YouTube": "YouTube channel",
    "gitter": "Gitter chat"
}

df[q] = df[q].str.replace(';',', ')  # Make separator values consistent
d = df[q].str.split(', ').explode().replace(resource_map)
top = d.value_counts()[:8].index
d = d[d.isin(top)]

fig, ax = plt.subplots(figsize=(8, 8))
ax = sns.countplot(y=q, hue="Year", data=d.reset_index(), ax=ax);
ax.set(ylabel="", title=q);

改进建议

现在哪一种帮助对你最有帮助?

人们提到的两个当前最需要的优先事项都与文档相关。人们希望有更多的文档,以及更多与他们领域相关的示例。性能改进也被普遍提及为当前最有帮助的事情。

[ ]:
q = "Which would help you most right now?"
order = [
    "More documentation",
    "More examples in my field",
    "Performance improvements",
    "New features",
    "Bug fixes",
]
ax = sns.countplot(y=q, data=df2021[q].explode().to_frame(), order=order)
ax.set(ylabel="", title=q);

Dask 如何改进?

我们还给了人们机会,让他们对问题“Dask 如何改进?”进行自由文本回复。

Matt 之前写了一篇 早期轶事博客文章,深入探讨了对此问题的回答。

他发现了这些反复出现的主题:

  • 中级文档

  • 文档组织

  • 功能性

  • 高级优化

  • 运行时稳定性和高级故障排除

由于更多的文档和示例是两个最常被要求的改进,我将在这里总结一些在该领域前进的步骤:

  • 关于更中级的文档,Matt 说:> 有很多高级用户在性能和调试方面的好材料,可能会很有趣地发布。

  • Matt 指出 Dask 有出色的 参考文档,但缺乏大量的好 叙述性文档。为了解决这个问题,Julia Signell 目前正在研究我们如何改进 Dask 文档的组织(如果你想跟进这个讨论,可以订阅 这个问题线程

  • Matt 评论说,当有如此多不同的 用户叙述*(即 Dask 被来自许多不同行业的人使用)时,很难拥有好的 *叙述性文档。今年,我们在调查中增加了一个新问题,询问人们工作的行业。我们添加这个问题是因为 “更多我所在领域的例子” 一直是过去三年的前两大请求之一。现在我们可以利用这些信息,将叙述性文档更好地针对最需要的领域(地球科学、生命科学和金融)。

[ ]:
q = 'What industry do you work in?'
data = df2021[df2021["Which would help you most right now?"] == "More examples in my field"]
order = data[q].value_counts()[data[q].value_counts() > 1].keys()
ax = sns.countplot(y=q, data=data[q].dropna().str.split(', ').explode().to_frame(), order=order);
ax.set(ylabel="", title="What field do you want more documentation examples for?");

你最关心的常见功能请求是什么?

对 numpy 和 pandas 的良好支持对大多数用户至关重要。用户还重视:

  • 改进的缩放

  • 易于部署

  • Dask 的韧性

  • 更好的 scikit-learn 和机器学习支持

大多数功能请求与往年调查结果相似,尽管表示更好的 scikit-learn/ML 支持对他们至关重要的受访者人数有所增加。我们还在 2021 年增加了一个关于 Dask 弹性的新问题。

在下图中,你可以看到人们如何评价每个功能请求的重要性,这是我们进行这项调查的三年中的每一年。

[ ]:
common = (df[df.columns[df.columns.str.startswith("What common feature")]]
          .rename(columns=lambda x: x.lstrip("What common feature requests do you care about most?[").rstrip(r"]")))
a = common.loc[2019].apply(pd.value_counts).T.stack().reset_index().rename(columns={'level_0': 'Question', 'level_1': "Importance", 0: "count"}).assign(Year=2019)
b = common.loc[2020].apply(pd.value_counts).T.stack().reset_index().rename(columns={'level_0': 'Question', 'level_1': "Importance", 0: "count"}).assign(Year=2020)
c = common.loc[2021].apply(pd.value_counts).T.stack().reset_index().rename(columns={'level_0': 'Question', 'level_1': "Importance", 0: "count"}).assign(Year=2021)

counts = pd.concat([a, b, c], ignore_index=True)

d = common.stack().reset_index().rename(columns={"level_2": "Feature", 0: "Importance"})
order = ["Not relevant for me", "Somewhat useful", 'Critical to me']
sns.catplot(x='Importance', row="Feature", kind="count", col="Year", data=d, sharex=False, order=order);

之前的调查结果

感谢所有参与调查的人!

如果你想了解更多关于2021年Dask调查的信息,关于Dask 2021年早期调查的博客文章 可以在这里找到

你可以在这里阅读往年调查结果: