Introducere în Dask

Programare paralelă cu Dask în Python

James Fulton

Climate Informatics Researcher

Accelerarea calculelor prin utilizarea mai multor nuclee

  • Calculatoarele au mai multe nuclee
  • Codul trebuie scris pentru a le utiliza
  • Pachetul Dask poate fi folosit în acest scop
  • Calculele se realizează mai rapid
Programare paralelă cu Dask în Python

Programare concurentă

O diagramă care arată o listă de sarcini și un singur traseu prin ele.

Programare paralelă cu Dask în Python

Multi-threading

O listă de sarcini împărțită în două.

Programare paralelă cu Dask în Python

Multi-threading

Două seturi de sarcini trimise către două nuclee CPU diferite.

Programare paralelă cu Dask în Python

Multi-threading

Cele două seturi de sarcini sunt rulate din același proces Python.

Programare paralelă cu Dask în Python

Procesare paralelă

Cele două seturi de sarcini sunt rulate din două procese Python diferite.

Programare paralelă cu Dask în Python

Programare paralelă

Multi-threading

Două seturi de sarcini rulate de două nuclee CPU în același proces Python.

Procesare paralelă

Două seturi de sarcini rulate de două nuclee CPU în două procese Python diferite.

Programare paralelă cu Dask în Python

Evaluare leneșă

  • Calculele nu sunt executate până când rezultatul este necesar
  • Pașii necesari pentru calcul sunt stocați pentru mai târziu
  • Dask împarte sarcinile între fire sau procese
Programare paralelă cu Dask în Python

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)
Programare paralelă cu Dask în Python

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')
Programare paralelă cu Dask în Python

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')
Programare paralelă cu Dask în Python

Calcularea rezultatului

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
Programare paralelă cu Dask în Python

Operații pe obiecte delayed

delayed_result1 = delayed(my_square_function)(4)

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

print(delayed_result2.compute())
100
Programare paralelă cu Dask în Python

Evaluare leneșă

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)
Programare paralelă cu Dask în Python

Evaluare leneșă

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
Programare paralelă cu Dask în Python

Partajarea calculelor

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
Programare paralelă cu Dask în Python

Partajarea calculelor

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
Programare paralelă cu Dask în Python

Să exersăm!

Programare paralelă cu Dask în Python

Preparing Video For Download...