Array Dask

Programmazione parallela con Dask in Python

James Fulton

Climate informatics researcher

Suddividere gli array in chunk

Mostra un array come un singolo blocco

Programmazione parallela con Dask in Python

Suddividere gli array in chunk

Mostra un array suddiviso in più chunk

Programmazione parallela con Dask in Python

NumPy vs Dask arrays

Mostra un array come un singolo blocco

import numpy as np

x = np.ones((4000, 6000))
print(x.sum())
24000000.0
  • Impiega 740 ms per l'esecuzione

Mostra un array suddiviso in più chunk

import dask.array as da

x = da.ones((4000, 6000), chunks=(1000,2000))
print(x.sum().compute())
24000000.0
  • Impiega 60 ms per l'esecuzione
Programmazione parallela con Dask in Python

Task graph degli array Dask

Mostra come i rami del task graph convergono per dare un risultato finale.

Programmazione parallela con Dask in Python

Metodi degli array Dask

Gli array Dask hanno quasi tutti i metodi degli array NumPy.

  • x.max()
  • x.min()
  • x.sum()
  • x.mean()
  • ecc.
print(sum_down_columns.compute())
array([1000., 1000., 1000., 1000., 
    1000., 1000., 1000., 1000., 1000.,
    1000.])
Programmazione parallela con Dask in Python

Usare array Dask come NumPy

# Operazioni matematiche lazy con array Dask
y1 = x**2 + 2*x + 1

# Slicing lazy
y2 = x[:10]

# Anche le funzioni NumPy sono lazy
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), ...
Programmazione parallela con Dask in Python

Caricare array di immagini

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>
Programmazione parallela con Dask in Python

Applicare funzioni personalizzate sui chunk

def instagram_filter(image):
    ...
    return pretty_image

# Applica la funzione a ogni immagine in modo indipendente 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>
Programmazione parallela con Dask in Python

Passons à la pratique !

Programmazione parallela con Dask in Python

Preparing Video For Download...