Construirea pipeline-urilor amânate

Programare paralelă cu Dask în Python

James Fulton

Climate Informatics Researcher

Fragmente de date

Diagramă care arată un set de date prea mare pentru RAM, dar care încape pe hard disk.

Diagramă care arată un set de date împărțit în bucăți. Întreg setul nu încape în RAM, dar bucățile individuale încap.

Programare paralelă cu Dask în Python

Setul de date Spotify

files = [
  '2005_tracks.csv',
  '2006_tracks.csv',
  '2007_tracks.csv',
  '2008_tracks.csv',
  '2009_tracks.csv',
  '2010_tracks.csv',
  ...
  '2020_tracks.csv',
]
Programare paralelă cu Dask în Python

Setul de date Spotify

                       name  duration_ms release_date  ...
0     Aldrig (feat. Carmon)       247869   2019-01-01  ...
2  2019 - The Year to Build       288105   2019-01-01  ...
3                 Na zawsze       186812   2019-01-01  ...
4         Humo en la Trampa       258354   2019-01-01  ...
5                     Au Au       176000   2019-01-01  ...
...                     ...          ...          ...  ...
Programare paralelă cu Dask în Python

Analiza datelor

import pandas as pd

maximums = []

for file in files:
    # Load each file
    df = pd.read_csv(file)

# Find maximum track length in each file max_length = df['duration_ms'].max()
# Store this maximum maximums.append(max_length)
# Find the maximum of all the maximum lengths absolute_maximum = max(maximums)
Programare paralelă cu Dask în Python

Analiza datelor

import pandas as pd

maximums = []

for file in files:
    # Load each file
    df = delayed(pd.read_csv)(file) # <------- delay loading
    # Find maximum track length in each file
    max_length = df['duration_ms'].max()
    # Store this maximum
    maximums.append(max_length)

# Find the maximum of all the maximum lengths
absolute_maximum = max(maximums)
Programare paralelă cu Dask în Python

Analiza datelor

import pandas as pd

maximums = []

for file in files:
    # Load each file
    df = delayed(pd.read_csv)(file) # <------- delay loading
    # Find maximum track length in each file
    max_length = df['duration_ms'].max()
    # Store this maximum
    maximums.append(max_length)

# Find the maximum of all the maximum lengths
absolute_maximum = delayed(max)(maximums) # <------- delay max() function
Programare paralelă cu Dask în Python

Utilizarea metodelor unui obiect amânat

import pandas as pd

maximums = []

for file in files:
    df = delayed(pd.read_csv)(file)
    # Use the .max() method
    max_length = df['duration_ms'].max()

    maximums.append(max_length)


absolute_maximum = delayed(max)(maximums)
print(max_length)
Delayed('max-0602855d-3ee6-4c43-a4d2-...')
  • Metodele și proprietățile unui obiect amânat returnează noi obiecte amânate
print(df.shape)
print(df.shape.compute())
Delayed('getattr-bc1e8838ab...')
(11907, 12)
Programare paralelă cu Dask în Python

Utilizarea metodelor unui obiect amânat

import pandas as pd

maximums = []

for file in files:
    df = delayed(pd.read_csv)(file)
    # Use a method which doesn't exist
    max_length = df['duration_ms'].fake()

    maximums.append(max_length)


absolute_maximum = delayed(max)(maximums)
print(max_length)
Delayed('max-6c026036-5daf-4b2-...')
  • Metodele nu sunt executate până la apelarea .compute()
print(max_length.compute())
...
AttributeError: 'Series' object has no 
attribute 'fake'
Programare paralelă cu Dask în Python

Utilizarea metodelor unui obiect amânat

import pandas as pd

maximums = []

for file in files:
    df = delayed(pd.read_csv)(file)

    max_length = df['duration_ms'].max()
    # Add delayed object to list
    maximums.append(max_length)

# Run delayed max on delayed objects list
absolute_maximum = delayed(max)(maximums)

maximums este o listă de obiecte amânate

print(maximums)
[Delayed('max-80b...'), 
Delayed('max-fa15d...', 
...]
Programare paralelă cu Dask în Python

Calculul listelor de obiecte amânate

import pandas as pd

maximums = []

for file in files:
    df = delayed(pd.read_csv)(file)

    max_length = df['duration_ms'].max()
    # Add dalayed object to list
    maximums.append(max_length)

# Compute all the maximums
all_maximums = dask.compute(maximums)
print(all_maximums)
([2539418, 4368000, ...
... 4511716, 4864333],)
Programare paralelă cu Dask în Python

Calculul listelor de obiecte amânate

import pandas as pd

maximums = []

for file in files:
    df = delayed(pd.read_csv)(file) 

    max_length = df['duration_ms'].max()

    maximums.append(max_length)

# Compute all the maximums
all_maximums = dask.compute(maximums)[0]
print(all_maximums)
[2539418, 4368000, ...
... 4511716, 4864333]
Programare paralelă cu Dask în Python

A amâna sau a nu amâna

def get_max_track(df):
    return df['duration_ms'].max()

for file in files:
    df = delayed(pd.read_csv)(file) 
    # Use function to find max
    max_length = get_max_track(df)

    maximums.append(max_length)


absolute_maximum = delayed(max)(maximums)
Programare paralelă cu Dask în Python

Graf de sarcini mai complex

absolute_maximum.visualize()

Graf de sarcini care descrie pașii necesari pentru calculul maximului absolut pe toate fișierele. Graful este mare, dar simplu.

Programare paralelă cu Dask în Python

Să exersăm!

Programare paralelă cu Dask în Python

Preparing Video For Download...