Tableaux Dask

Programmation parallèle avec Dask en Python

James Fulton

Climate informatics researcher

Découper les tableaux en blocs

Montre un tableau en un seul bloc

Programmation parallèle avec Dask en Python

Découper les tableaux en blocs

Montre un tableau divisé en plusieurs blocs

Programmation parallèle avec Dask en Python

Tableaux NumPy vs Dask

Montre un tableau en un seul bloc

import numpy as np

x = np.ones((4000, 6000))
print(x.sum())
24000000.0
  • Exécution : 740 millisecondes

Montre un tableau divisé en plusieurs blocs

import dask.array as da

x = da.ones((4000, 6000), chunks=(1000,2000))
print(x.sum().compute())
24000000.0
  • Exécution : 60 millisecondes
Programmation parallèle avec Dask en Python

Graphe de tâches d'un tableau Dask

Montre comment les branches du graphe de tâches convergent vers une réponse finale.

Programmation parallèle avec Dask en Python

Méthodes des tableaux Dask

Les tableaux Dask offrent presque toutes les méthodes des tableaux NumPy.

  • x.max()
  • x.min()
  • x.sum()
  • x.mean()
  • etc.
print(sum_down_columns.compute())
array([1000., 1000., 1000., 1000., 
    1000., 1000., 1000., 1000., 1000.,
    1000.])
Programmation parallèle avec Dask en Python

Utiliser les tableaux Dask comme des NumPy

# Calcul paresseux avec Dask array
y1 = x**2 + 2*x + 1

# Découpage paresseux (slicing)
y2 = x[:10]

# Appliquer des fonctions NumPy est aussi paresseux
y3 = np.sin(x)
print(y1)
dask.array<add, shape=(1000, 10), ...
print(y2)
dask.array<getitem, shape=(10, 10), ...
print(y3)
dask.array<sin, shape=(1000, 10), ...
Programmation parallèle avec Dask en Python

Charger des tableaux d'images

import dask.array as da

import da.image
image_array = da.image.imread('images/*.png')
print(image_array)
dask.array<imread, shape=(40000, 256, 256, 3), dtype=uint8, 
    chunksize=(1, 256, 256, 3), chunktype=numpy.ndarray>
Programmation parallèle avec Dask en Python

Appliquer des fonctions personnalisées sur les blocs

def instagram_filter(image):
    ...
    return pretty_image

# Appliquer la fonction à chaque image séparément pretty_image_array = image_array.map_blocks(instagram_filter)
print(pretty_image_array)
dask.array<instagram_filter, shape=(40000, 256, 256, 3), dtype=uint8, 
    chunksize=(1, 256, 256, 3), chunktype=numpy.ndarray>
Programmation parallèle avec Dask en Python

Passons à la pratique !

Programmation parallèle avec Dask en Python

Preparing Video For Download...