Grafy úloh a metody plánování

Parallel Programming with Dask in Python

James Fulton

Climate Informatics Researcher

Vizualizace grafu úloh

# Create 2 delayed objects
delayed_num1 = delayed(my_square_function)(3)
delayed_num2 = delayed(my_square_function)(4)

# Add them
result = delayed_num1 + delayed_num2

# Plot the task graph result.visualize()

Diagram znázorňuje kroky potřebné k výpočtu výsledku. Funkce my-square-function je spuštěna dvakrát a oba výstupy jsou předány funkci add, která vrátí jeden výsledek.

Parallel Programming with Dask in Python

Překrývající se graf úloh

delayed_intermediate = delayed(my_square_function)(3)

# These two results both use delayed_intermediate_result
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4
Parallel Programming with Dask in Python

Překrývající se graf úloh

delayed_result1.visualize()

Diagram znázorňující graf úloh pro výsledek 1.

delayed_result2.visualize()

Diagram znázorňující graf úloh pro výsledek 2.

Parallel Programming with Dask in Python

Překrývající se graf úloh

# Plot the task graph
dask.visualize(delayed_result1, delayed_result2)

Graf úloh znázorňující, že výsledek 1 a výsledek 2 sdílejí mezivýsledek.

Parallel Programming with Dask in Python

Multivláknové vs. paralelní zpracování

Přesun dat

Paralelní zpracování
  • Procesy mají vlastní prostor v RAM
Multivláknové zpracování
  • Vlákna sdílejí prostor v RAM
Parallel Programming with Dask in Python

Multivláknové vs. paralelní zpracování

# Run a sum on two big arrays
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Compute using processes
dask.compute(sum1, sum2)
  • Paralelní zpracování je pomalé

Diagram ukazuje, že obě pole pocházející z jednoho procesu Pythonu musí být odeslána do dvou dalších procesů Pythonu.

Parallel Programming with Dask in Python

Multivláknové vs. paralelní zpracování

# Run a sum on two big arrays
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Compute using threads
dask.compute(sum1, sum2)
  • Multivláknové zpracování je rychlé

Diagram ukazuje, že pole není třeba vůbec kopírovat.

Parallel Programming with Dask in Python

GIL

Global interpreter lock – najednou může číst skript Pythonu pouze jedno vlákno

def sum_to_n(n):
    """Sums numbers from 0 to n"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • Multivláknové zpracování zde nepomůže
  • Paralelní zpracování ano
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Parallel Programming with Dask in Python

Ukázkové časy – GIL

Tři Ganttovy diagramy zobrazující časy spuštění jednoduché funkce Pythonu 16krát. Ze tří metod plánování úloh bylo nejrychlejší zpracování pomocí procesů.

Parallel Programming with Dask in Python

Funkce uvolňující GIL

  • Např. funkce pd.read_csv() uvolňuje GIL
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Parallel Programming with Dask in Python

Ukázkové časy – načítání dat

Tři Ganttovy diagramy zobrazující časy spuštění funkce načítající data z CSV 16krát. Ze tří metod plánování úloh bylo nejrychlejší multivláknové zpracování.

Parallel Programming with Dask in Python

Shrnutí

Vlákna

  • Spouštějí se velmi rychle
  • Sdílejí paměť s hlavní relací
  • Není třeba přenášet data v paměti
  • Omezena GIL, která umožňuje čtení kódu vždy jen jednomu vláknu

Procesy

  • Spuštění vyžaduje čas a paměť
  • Mají oddělené paměťové prostory
  • Přenos dat mezi nimi i s hlavní relací Pythonu je velmi pomalý
  • Každý má vlastní GIL, takže si nemusí střídavě číst kód
Parallel Programming with Dask in Python

Lass uns üben!

Parallel Programming with Dask in Python

Preparing Video For Download...