Dask 配列

Pythonで学ぶDaskによる並列プログラミング

James Fulton

Climate informatics researcher

配列のチャンク化

配列が1つの塊として表示されている

Pythonで学ぶDaskによる並列プログラミング

配列のチャンク化

配列が複数のチャンクに分割されている

Pythonで学ぶDaskによる並列プログラミング

NumPy と Dask 配列の比較

配列が1つの塊として表示され,次元がラベル付けされている

import numpy as np

x = np.ones((4000, 6000))
print(x.sum())
24000000.0
  • 実行に 740 ミリ秒

配列が複数のチャンクに分割され,次元がラベル付けされている

import dask.array as da

x = da.ones((4000, 6000), chunks=(1000,2000))
print(x.sum().compute())
24000000.0
  • 実行に 60 ミリ秒
Pythonで学ぶDaskによる並列プログラミング

Dask 配列のタスクグラフ

タスクグラフの分岐が収束して最終結果になる様子

Pythonで学ぶDaskによる並列プログラミング

Dask 配列のメソッド

Dask 配列は、NumPy 配列とほぼ同じメソッドを備えています。

  • x.max()
  • x.min()
  • x.sum()
  • x.mean()
  • など
print(sum_down_columns.compute())
array([1000., 1000., 1000., 1000., 
    1000., 1000., 1000., 1000., 1000.,
    1000.])
Pythonで学ぶDaskによる並列プログラミング

Dask 配列を NumPy 配列のように扱う

# Dask 配列での遅延計算
y1 = x**2 + 2*x + 1

# 遅延スライス
y2 = x[:10]

# NumPy 関数の適用も遅延
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), ...
Pythonで学ぶDaskによる並列プログラミング

画像配列の読み込み

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>
Pythonで学ぶDaskによる並列プログラミング

チャンクごとの独自関数適用

def instagram_filter(image):
    ...
    return pretty_image

# 各画像に独立に関数を適用 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>
Pythonで学ぶDaskによる並列プログラミング

¡Vamos a practicar!

Pythonで学ぶDaskによる並列プログラミング

Preparing Video For Download...