Dask 简介

Python 中的 Dask 并行编程

James Fulton

Climate Informatics Researcher

用多核加速计算

  • 计算机有多个核心
  • 代码需要编写以利用它们
  • 可使用 Dask 包来实现
  • 更快完成计算
Python 中的 Dask 并行编程

并发编程

一个图示,显示一列任务以及穿过它们的一条路径。

Python 中的 Dask 并行编程

多线程

被分成两部分的一列任务。

Python 中的 Dask 并行编程

多线程

两组任务被发送到两个不同的 CPU 核心。

Python 中的 Dask 并行编程

多线程

这两组任务在同一 Python 进程内运行。

Python 中的 Dask 并行编程

并行处理

现在这两组任务由两个不同的 Python 进程运行。

Python 中的 Dask 并行编程

并行编程

多线程

两组任务由两个 CPU 核心在同一 Python 进程内运行。

并行处理

两组任务由两个 CPU 核心在两个不同的 Python 进程内运行。

Python 中的 Dask 并行编程

惰性求值

  • 仅在需要结果时才运行计算
  • 计算结果所需步骤会被存储以备后用
  • Dask 在线程或进程间拆分任务
Python 中的 Dask 并行编程

Dask delayed(延迟)

from dask import delayed

def my_square_function(x):
    return x**2

# Create delayed version of above function delayed_square_function = delayed(my_square_function)
Python 中的 Dask 并行编程

Dask delayed(延迟)

from dask import delayed

def my_square_function(x):
    return x**2

# Create delayed version of above function
delayed_square_function = delayed(my_square_function)

# Use the delayed function with input 4
delayed_result = delayed_square_function(4)


# Print the delayed answer print(delayed_result)
Delayed('my_square_function-7f71b132-70a9-457a-aa52-604e8c34f8a7')
Python 中的 Dask 并行编程

Dask delayed(延迟)

from dask import delayed

def my_square_function(x):
    return x**2

# Delay and use function
delayed_result = delayed(my_square_function)(4)

print(delayed_result)
Delayed('my_square_function-7f71b132-70a9-457a-aa52-604e8c34f8a7')
Python 中的 Dask 并行编程

执行计算并取结果

from dask import delayed

def my_square_function(x):
    return x**2

delayed_result = delayed(my_square_function)(4)

real_result = delayed_result.compute() # <- This line is where the calculation happens

# Print the answer
print(real_result)
16
Python 中的 Dask 并行编程

对延迟对象进行运算

delayed_result1 = delayed(my_square_function)(4)

# Math operations return delayed object
delayed_result2 = (4 + delayed_result1) * 5

print(delayed_result2.compute())
100
Python 中的 Dask 并行编程

惰性求值

x_list = [30, 85, 14, 12, 27, 62, 89, 15, 78,  0]

sum_of_squares = 0

for x in x_list:
    # Square and add numbers
    sum_of_squares += delayed(my_square_function)(x)
Python 中的 Dask 并行编程

惰性求值

x_list = [30, 85, 14, 12, 27, 62, 89, 15, 78,  0]

sum_of_squares = 0

for x in x_list:
    # Square and add numbers
    sum_of_squares += delayed(my_square_function)(x)

result = sum_of_squares.compute()

# Print the answer
print(result)
27268
Python 中的 Dask 并行编程

共享计算

delayed_intermediate = delayed(my_square_function)(3)

# These two results both use delayed_intermediate
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4

# delayed_3_squared will be computed twice
print('delayed_result1:', delayed_result1.compute())
print('delayed_result2:', delayed_result2.compute())
delayed_result1: 4
delayed_result2: 13
Python 中的 Dask 并行编程

共享计算

import dask

# delayed_intermediate will be computed once
comp_result1, comp_result2 = dask.compute(delayed_result1, delayed_result2)

print('comp_result1:', comp_result1)
print('comp_result2:', comp_result2)
delayed_result1: 4
delayed_result2: 13
Python 中的 Dask 并行编程

¡Vamos a practicar!

Python 中的 Dask 并行编程

Preparing Video For Download...