2021 Dask 用户调查结果
内容
实时笔记本
您可以在 live session 中运行此笔记本,或查看 Github 上的内容。
2021 Dask 用户调查结果¶
本文展示了2021年Dask用户调查的结果,该调查在今年早些时候进行。感谢所有抽出时间填写调查的人!这些结果帮助我们更好地理解Dask社区,并将指导未来的开发工作。
原始数据以及分析的开始可以在以下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 Dataframes、Dask Delayed 和 Dask Arrays。
绝大多数人喜欢至少部分时间在 Jupyter 或 IPython 中交互式地使用 Dask,大多数人通过网页浏览器查看 Dask 仪表盘。
你经常与Dask一起使用哪些其他库?¶
人们最常与 Dask 一起使用的十个库是:numpy
、pandas
、xarray
、scikit-learn
、scipy
、statsmodels
、matplotlib
、xgboost
、numba
和 joblib
。
[ ]:
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);
你通常处理哪些文件格式?¶
两种最常见的文件格式(csv
和 parquet
)在 Dask Dataframe 用户中很受欢迎。JSON
文件格式也经常与 Dask 一起使用。第四和第五种最常见的文件类型(HDF5
和 zarr
)在 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 漫画 “标准” 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-jobqueue 和 dask 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 仪表板。
在仪表盘上,人们表示最有用的诊断图是:
任务流图
进度图,以及
每个工作者的内存使用情况图
[ ]:
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年早期调查的博客文章 可以在这里找到。
你可以在这里阅读往年调查结果: