用Dask进行并行计算
Dask是一个灵活的开源Python库,用于并行计算。在这篇文章中,我们将了解并行计算以及为什么我们应该选择Dask来实现这一目的。
我们将把它与其他各种库如spark、ray和modin进行比较。我们还讨论了Dask的使用案例。
并行计算
一种被称为并行计算的计算方式同时进行几个计算或进程。大型问题通常被划分为可管理的部分,可以分别解决。
并行计算的四个类别是
- 比特级
-
指令级
-
数据层面
-
工作平行化。
虽然并行化在高性能计算中已经利用了很长时间,但由于频率扩展的物理限制,它最近才变得更加流行。
Dask的需要
我想到的一个问题是,为什么我们甚至需要Dask。
在Numpy、Sklearn、Sklearn、Seaborn等Python库的帮助下,数据处理和机器学习任务变得简单。对于大多数的数据分析任务,Python [pandas]模块就足够了。数据可以通过许多不同的方式进行处理,并可以利用这些数据创建机器学习模型。
然而,如果你的数据大于可用的RAM,Pandas就会变得不足。这是一个相当普遍的问题。你可以采用Spark或Hadoop来解决这个问题。然而,这些并不是Python环境。因此,你无法使用NumPy、pandas、sklearn、TensorFlow和其他著名的Python机器学习工具。是否存在一种方法来解决这个问题?有!有!有这就是Dask发挥作用的时候了。
Dask的介绍
Dask是一个平行计算的框架,与Jupyter笔记本无缝集成。最初,它是为了扩展NumPy、Pandas和Scit-kit的计算能力,以超越单机的存储限制而创建的。DASK的类似物可以用来学习,但很快它就被用作一个通用的分布式系统
Dask有两个主要的优势 –
可扩展性
Dask与Python版本的Pandas、NumPy和Scikit-Learn进行了原生扩展,并在具有许多内核的集群上弹性地运行。它也可以缩小规模,在单个系统上运行。
Planning
与Airflow、Luigi类似,Dask任务调度器是为计算而优化的。它提供快速反馈,用任务图管理任务,并支持本地和分布式诊断,使其具有动态和响应性。
此外,Dask提供了一个实时、动态的仪表盘,每100毫秒更新一次,显示各种信息,如进度、内存利用率等。
根据你的喜好,你可以克隆git仓库或使用Conda/pip来安装Dask。
conda install dask
要只安装核心–
conda install dask-core
数据库-核心 是一个受限制的Dask版本,只安装基本的组件。对于pip来说也是如此。如果用dask数据框和dask数组来扩展pandas、numpy或两者对你来说是最重要的,你也可以只安装dask数据框或dask数组。
python -m pip install dask
安装数据框架的要求
python -m pip install "dask[dataframe]" #
要安装阵列的要求
python -m pip install "dask[list]"
让我们来看看这个库被用于并行计算的几个实例。我们的代码使用dask.delayed来实现并行性。
注意 – 以下两个代码片断应在Jupyter笔记本的两个不同单元中运行
import time
import random
def calcprofit(a, b):
time.sleep(random.random())
return a + b
def calcloss(a, b):
time.sleep(random.random())
return a - b
def calctotal(a, b):
time.sleep(random.random())
return a + b
现在运行下面的代码片断-
%%time
profit = calcprofit(10, 22)
loss = calcloss(18, 3)
total = calctotal(profit, loss)
print(total)
输出
47
CPU times: user 4.13 ms, sys: 1.23 ms, total: 5.36 ms
Wall time: 1.35 s
尽管它们是相互独立的,但这些功能将按顺序一个接一个地执行。因此,我们可以同时执行它们以节省时间。
import dask
calcprofit = dask.delayed(calcprofit)
calcloss = dask.delayed(calcloss)
calctotal = dask.delayed(calctotal)
现在运行下面的代码片断-
%%time
profit = calcprofit(10, 22)
loss = calcloss(18, 3)
total = calctotal(profit, loss)
print(total)
输出
Delayed('calctotal-9e3e896e-b4de-400c-aeb8-9e4c0961fe11')
CPU times: user 3.3 ms, sys: 0 ns, total: 3.3 ms
Wall time: 10.2 ms
即使在这个简单的例子中,运行时间也得到了改善。我们还可以看到任务图如下 —
total.visualize(rankdir='LR')
Spark与Dask
Spark是一个强大的集群计算框架工具,它将数据和处理分成可管理的部分,将它们分布在任何规模的集群上,并并发地执行它们。
尽管Spark是大数据分析的事实上的标准技术,但Dask似乎是相当有前途的。Dask是轻量级的,是作为Python组件开发的,而Spark有额外的能力,主要是用Scala开发的,也支持Python/R。如果你想要一个现实的解决方案,甚至有JVM基础设施,Spark可以成为你的第一选择。然而,如果你想要快速、轻量级的并行处理,Dask是一个可行的选择。在快速的pip安装之后,它就可以供你使用了。
Dask, Ray, and Modin
Ray,和Dask有不同的调度策略。一个集群的所有工作都由Dask使用的中央调度器管理。由于Ray是分散的,每台计算机都有自己的调度器,允许在特定的机器上而不是在整个集群上解决计划任务的问题。Ray缺乏Dask提供的丰富的高级集合API(如数据帧、分布式阵列等)。
相反,Modin则在Dask或Ray之上驰骋。只要简单地增加一行代码,将modin.pandas导入为pd,我们就可以用Modin快速扩展我们的Pandas进程。尽管Modin努力将Pandas API的大部分内容并行化,但Dask DataFrame有时并不能扩展完整的Pandas API。
Dask使用案例的例子
Dask的应用案例分为两类 —
- 我们可以通过使用动态任务调度来优化我们的计算。
-
大型数据集可以使用 “大数据 “集合来处理,例如并行数组和数据帧。
任务图是对我们的数据处理工作的组织的可视化描述,是使用Dask集合制作的。
任务图是使用Dask调度器进行的。
Dask使用并行编程来完成这些工作。
术语 “并行编程 “是指同时执行许多任务。
通过这样做,我们可以有效地利用我们的资源,同时完成几个任务。
让我们来看看Dask提供的几个数据集。
- Dask.array–使用Numpy接口,dask.array将巨大的数组分割成更小的数组,使我们能够对大于系统内存的数组进行计算。
-
Dask.bag–它提供了对标准Python对象集合的操作,如过滤、映射、分组和折叠。
-
Dask.dataframe – 分布类似于Pandas的数据框架 它是一个由几个微小的数据框架构建的巨大的并行数据框架。
结论
在这篇文章中,我们了解了Dask和并行计算。我们已经帮助你提高了对Dask的认识,它的需求和它与其他库的比较。