Introduction à Dask

Programmation parallèle avec Dask en Python

James Fulton

Climate Informatics Researcher

Accélérer les calculs avec plusieurs cœurs

  • Les ordinateurs ont plusieurs cœurs
  • Le code doit être écrit pour les utiliser
  • Le paquet Dask permet de le faire
  • Exécuter nos calculs plus vite
Programmation parallèle avec Dask en Python

Programmation concurrente

Un schéma montrant une liste de tâches et un seul parcours.

Programmation parallèle avec Dask en Python

Multithread

Une liste de tâches divisée en deux.

Programmation parallèle avec Dask en Python

Multithread

Deux ensembles de tâches envoyés à deux cœurs de CPU.

Programmation parallèle avec Dask en Python

Multithread

Les deux ensembles de tâches s'exécutent dans le même processus Python.

Programmation parallèle avec Dask en Python

Traitement parallèle

Les deux ensembles de tâches s'exécutent maintenant dans deux processus Python distincts.

Programmation parallèle avec Dask en Python

Programmation parallèle

Multithread

Deux ensembles de tâches exécutés par deux cœurs de CPU dans le même processus Python.

Traitement parallèle

Deux ensembles de tâches exécutés par deux cœurs de CPU dans deux processus Python distincts.

Programmation parallèle avec Dask en Python

Évaluation paresseuse

  • Les calculs ne s'exécutent que lorsque le résultat est requis
  • Les étapes nécessaires sont conservées pour plus tard
  • Dask répartit les tâches entre fils d'exécution ou processus
Programmation parallèle avec Dask en 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)
Programmation parallèle avec Dask en 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')
Programmation parallèle avec Dask en 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')
Programmation parallèle avec Dask en Python

Calculer la réponse

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
Programmation parallèle avec Dask en Python

Utiliser des opérations sur des objets différés

delayed_result1 = delayed(my_square_function)(4)

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

print(delayed_result2.compute())
100
Programmation parallèle avec Dask en Python

Évaluation paresseuse

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)
Programmation parallèle avec Dask en Python

Évaluation paresseuse

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
Programmation parallèle avec Dask en Python

Mutualiser le calcul

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
Programmation parallèle avec Dask en Python

Mutualiser le calcul

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
Programmation parallèle avec Dask en Python

Passons à la pratique !

Programmation parallèle avec Dask en Python

Preparing Video For Download...