Taakgrafieken en planningsmethoden

Parallel programmeren met Dask in Python

James Fulton

Climate Informatics Researcher

Een taakgrafiek visualiseren

# Maak 2 delayed-objecten
delayed_num1 = delayed(my_square_function)(3)
delayed_num2 = delayed(my_square_function)(4)

# Tel ze op
result = delayed_num1 + delayed_num2

# Visualiseer de taakgrafiek result.visualize()

Een diagram met de stappen om het resultaat te berekenen. my-square-function draait twee keer en de twee outputs gaan naar een add-functie. Dit geeft één output terug.

Parallel programmeren met Dask in Python

Overlappende taakgrafiek

delayed_intermediate = delayed(my_square_function)(3)

# Deze twee resultaten gebruiken beide delayed_intermediate_result
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4
Parallel programmeren met Dask in Python

Overlappende taakgrafiek

delayed_result1.visualize()

Een diagram met de taakgrafiek voor resultaat 1.

delayed_result2.visualize()

Een diagram met de taakgrafiek voor resultaat 2.

Parallel programmeren met Dask in Python

Overlappende taakgrafiek

# Visualiseer de taakgrafiek
dask.visualize(delayed_result1, delayed_result2)

Een taakgrafiek die laat zien dat resultaat 1 en resultaat 2 een tussenresultaat delen.

Parallel programmeren met Dask in Python

Multithreading vs. parallelle verwerking

Gegevens verplaatsen

Parallelle verwerking
  • Processen hebben hun eigen RAM-ruimte
Multithreading
  • Threads gebruiken dezelfde RAM-ruimte
Parallel programmeren met Dask in Python

Multithreading vs. parallelle verwerking

# Som uitvoeren op twee grote arrays
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Berekenen met processen
dask.compute(sum1, sum2)
  • Traag met parallelle verwerking

Het diagram toont dat de twee arrays die in één Python-proces ontstaan, naar twee andere Python-processen moeten worden gestuurd.

Parallel programmeren met Dask in Python

Multithreading vs. parallelle verwerking

# Som uitvoeren op twee grote arrays
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Berekenen met threads
dask.compute(sum1, sum2)
  • Snel met multithreading

Het diagram toont dat de twee arrays helemaal niet gekopieerd hoeven te worden.

Parallel programmeren met Dask in Python

De GIL

Global Interpreter Lock: slechts één thread kan tegelijk de Python-code uitvoeren

def sum_to_n(n):
    """Sums numbers from 0 to n"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • Multithreading helpt hier niet
  • Parallelle verwerking wel
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Parallel programmeren met Dask in Python

Voorbeeldtijden - GIL

Drie Gantt-diagrammen met de tijden voor het 16 keer draaien van een eenvoudige Python-functie. Van drie planningsmethoden was processes het snelst.

Parallel programmeren met Dask in Python

Functies die de GIL vrijgeven

  • Bijv. de functie pd.read_csv() laat de GIL los
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Parallel programmeren met Dask in Python

Voorbeeldtijden - Data laden

Drie Gantt-diagrammen met de tijden voor het 16 keer laden van data uit een CSV. Van drie planningsmethoden waren threads het snelst.

Parallel programmeren met Dask in Python

Samenvatting

Threads

  • Starten heel snel
  • Delen geheugen met de hoofd-sessie
  • Geen geheugentransfer nodig
  • Beperkt door de GIL: één thread voert tegelijk code uit

Processen

  • Kosten tijd en geheugen om op te zetten
  • Hebben aparte geheugengebieden
  • Zeer traag om data onderling en met de hoofd-Python-sessie te verplaatsen
  • Hebben elk een eigen GIL en hoeven dus niet af te wisselen
Parallel programmeren met Dask in Python

Laten we oefenen!

Parallel programmeren met Dask in Python

Preparing Video For Download...