Uppgiftsgrafer och schemaläggningsmetoder

Parallellprogrammering med Dask i Python

James Fulton

Climate Informatics Researcher

Visualisera en uppgiftsgraf

# 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()

Ett diagram som visar stegen för att beräkna resultatet. my-square-function körs två gånger och de två utvärdena skickas till en addfunktion som returnerar ett resultat.

Parallellprogrammering med Dask i Python

Överlappande uppgiftsgraf

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
Parallellprogrammering med Dask i Python

Överlappande uppgiftsgraf

delayed_result1.visualize()

Ett diagram som visar uppgiftsgrafen för resultat 1.

delayed_result2.visualize()

Ett diagram som visar uppgiftsgrafen för resultat 2.

Parallellprogrammering med Dask i Python

Överlappande uppgiftsgraf

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

En uppgiftsgraf som visar att resultat 1 och resultat 2 delar ett mellanresultat.

Parallellprogrammering med Dask i Python

Flertrådning vs. parallell bearbetning

Flytta data

Parallell bearbetning
  • Processer har sitt eget RAM-utrymme
Flertrådning
  • Trådar delar samma RAM-utrymme
Parallellprogrammering med Dask i Python

Flertrådning vs. parallell bearbetning

# 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)
  • Långsamt med parallell bearbetning

Diagrammet visar att de två arrayerna, som finns i en Python-process, måste skickas till två andra Python-processer.

Parallellprogrammering med Dask i Python

Flertrådning vs. parallell bearbetning

# 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)
  • Snabbt med flertrådning

Diagrammet visar att de två arrayerna inte behöver kopieras alls.

Parallellprogrammering med Dask i Python

GIL

Global interpreter lock – bara en tråd kan läsa Python-skriptet åt gången

def sum_to_n(n):
    """Sums numbers from 0 to n"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • Flertrådning hjälper inte här
  • Parallell bearbetning gör det
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Parallellprogrammering med Dask i Python

Exempeltider – GIL

Tre Gantt-diagram som visar tiderna för att köra en enkel Python-funktion 16 gånger. Av tre olika schemaläggningsmetoder var processer snabbast.

Parallellprogrammering med Dask i Python

Funktioner som frigör GIL

  • T.ex. frigör funktionen pd.read_csv() GIL
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Parallellprogrammering med Dask i Python

Exempeltider – Inläsning av data

Tre Gantt-diagram som visar tiderna för att köra en funktion som läser in data från CSV 16 gånger. Av tre olika schemaläggningsmetoder var trådar snabbast.

Parallellprogrammering med Dask i Python

Sammanfattning

Trådar

  • Startar mycket snabbt
  • Delar minnesutrymme med huvudsessionen
  • Ingen minnesöverföring krävs
  • Begränsas av GIL, som tillåter en tråd åt gången att läsa koden

Processer

  • Tar tid och minne att starta
  • Har separata minnespooler
  • Mycket långsam dataöverföring mellan processer och till huvud-Python-sessionen
  • Har varsin GIL och behöver därför inte turas om att läsa koden
Parallellprogrammering med Dask i Python

Nu kör vi en övning!

Parallellprogrammering med Dask i Python

Preparing Video For Download...