用Dask进行并行计算

用Dask进行并行计算

Dask是一个灵活的开源Python库,用于并行计算。在这篇文章中,我们将了解并行计算以及为什么我们应该选择Dask来实现这一目的。

我们将把它与其他各种库如spark、ray和modin进行比较。我们还讨论了Dask的使用案例。

并行计算

一种被称为并行计算的计算方式同时进行几个计算或进程。大型问题通常被划分为可管理的部分,可以分别解决。

并行计算的四个类别是

  • 比特级

  • 指令级

  • 数据层面

  • 工作平行化。

虽然并行化在高性能计算中已经利用了很长时间,但由于频率扩展的物理限制,它最近才变得更加流行。

Dask的需要

我想到的一个问题是,为什么我们甚至需要Dask。

Numpy、Sklearn、Sklearn、Seaborn等Python库的帮助下,数据处理和机器学习任务变得简单。对于大多数的数据分析任务,Python [pandas]模块就足够了。数据可以通过许多不同的方式进行处理,并可以利用这些数据创建机器学习模型。

然而,如果你的数据大于可用的RAM,Pandas就会变得不足。这是一个相当普遍的问题。你可以采用Spark或Hadoop来解决这个问题。然而,这些并不是Python环境。因此,你无法使用NumPypandas、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的认识,它的需求和它与其他库的比较。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程