Arrays Dask

Programação Paralela com Dask em Python

James Fulton

Climate informatics researcher

Dividindo arrays em blocos

Mostra um array como uma única peça

Programação Paralela com Dask em Python

Dividindo arrays em blocos

Mostra um array dividido em vários blocos

Programação Paralela com Dask em Python

Arrays NumPy vs. Dask

Mostra um array como uma única peça

import numpy as np

x = np.ones((4000, 6000))
print(x.sum())
24000000.0
  • Leva 740 milissegundos para executar

Mostra um array dividido em vários blocos

import dask.array as da

x = da.ones((4000, 6000), chunks=(1000,2000))
print(x.sum().compute())
24000000.0
  • Leva 60 milissegundos para executar
Programação Paralela com Dask em Python

Grafo de tarefas de array Dask

Mostra como os ramos do grafo de tarefas convergem para dar uma resposta final.

Programação Paralela com Dask em Python

Métodos de array Dask

Arrays Dask têm quase todos os métodos dos arrays 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.])
Programação Paralela com Dask em Python

Tratar arrays Dask como arrays NumPy

# Matemática preguiçosa com Dask array
y1 = x**2 + 2*x + 1

# Fatiamento preguiçoso
y2 = x[:10]

# Aplicar funções NumPy também é preguiçoso
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), ...
Programação Paralela com Dask em Python

Carregando arrays de imagens

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>
Programação Paralela com Dask em Python

Aplicando funções personalizadas por bloco

def instagram_filter(image):
    ...
    return pretty_image

# Aplicar a função a cada imagem de forma independente 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>
Programação Paralela com Dask em Python

Vamos praticar!

Programação Paralela com Dask em Python

Preparing Video For Download...