6 minut Czytania

Biblioteka Dask w Pythonie – niezastąpione narzędzie do obliczeń równoległych

Dask to open-source’owa biblioteka do obliczeń równoległych. Oferuje elastyczne i przyjazne podejście do zarządzania dużymi zbiorami danych oraz złożonymi obliczeniami. Bezproblemowo integruje się z popularnymi bibliotekami Pythona, takimi jak NumPy, Pandas i scikit-learn, umożliwiając równoległe wykonywanie operacji na wielu rdzeniach, procesorach lub komputerach, bez konieczności nauki nowych bibliotek czy języków programowania.

Zapraszamy do kolejnego artykułu z serii „najpopularniejsze biblioteki Python”.

Co to jest Dask?

Dask to biblioteka wspierająca obliczenia równoległe w Pythonie. Obsługuje dynamiczne planowanie zadań zoptymalizowane pod kątem interaktywnych obciążeń obliczeniowych.

Większość analiz Big Data wykorzystuje Pandas i NumPy. Choć te biblioteki wspierają szeroki zakres obliczeń, mają ograniczenia przy pracy z danymi, które „nie mieszczą się w pamięci”. W takich sytuacjach użyteczna jest właśnie biblioteka Dask. Gdy na dane „nie ma już miejsca”, umożliwia ona ich „dopasowanie do dysku” – pozwala łatwo skalować obliczenia – na klaster lub pojedynczą maszynę – w zależności od wielkości zbioru danych.

Zastosowania biblioteki Dask

Dask pozwala na efektywne przetwarzanie setek terabajtów danych i przyspiesza pipeline’y nauki o danych. Przykłady zastosowań:

  • Analiza danych czasowych.
  • Przygotowanie danych do uczenia maszynowego.
  • Przetwarzanie wielowymiarowych danych w naukach przyrodniczych, obrazach satelitarnych, genomice i biomedycynie.

Dzięki bibliotece Dask-ML, można używać Dask w połączeniu z scikit-learn i XGBoost, aby trenować modele na dużych zbiorach danych.

Główne komponenty biblioteki Pythona Dask

Dask składa się z dwóch części:

  • Interfejsu API dla równoległych list, tablic i DataFrames do natywnego skalowania NumPy, Pandas i scikit-learn w celu uruchomienia w środowiskach większych niż pamięć lub rozproszonych. Kolekcje Dask są równoległymi odpowiednikami kolekcji z bibliotek źródłowych (np. tablica Dask składa się z tablic NumPy) i działają w oparciu o harmonogram zadań.
  • Harmonogramu zadań, który buduje grafy zadań, koordynuje, harmonogramuje i monitoruje ich realizację. Jest zoptymalizowany do interaktywnych obciążeń obliczeniowych na wielu rdzeniach procesorów lub maszynach.

Kolekcje danych w Dask

Dask oferuje trzy rodzaje równoległych kolekcji:

  • DataFrames – używane do przetwarzania danych tabelarycznych, podobnych do Pandas.
  • Bags – używane do przetwarzania danych nieustrukturyzowanych.
  • Arrays – do przetwarzania danych numerycznych, podobnych do NumPy.

Te kolekcje mogą automatycznie korzystać z danych podzielonych między RAM i dysk lub rozproszonych w klastrze w zależności od dostępnych zasobów.

W przypadkach, gdy dane nie pasują do wysokopoziomowych abstrakcji, takich jak tablice czy DataFrames, Dask oferuje funkcję „delayed”.

Dzięki dekoratorom Python można zmodyfikować funkcje tak, by działały w trybie leniwym – ich wykonanie jest opóźnione, a same funkcje i ich argumenty są umieszczane w grafie zadań.

Harmonogram zadań w Dask

Harmonogram Dask może skalować się do klastrów składających się z tysięcy węzłów. W scenariuszach rozproszonych harmonogram koordynuje wielu pracowników (workers) i przenosi obliczenia do odpowiedniego węzła, utrzymując ciągłą i nieblokującą komunikację. Obsługuje również systemy plików Hadoop HDFS oraz chmury, takie jak Amazon S3.

Dask oferuje również harmonogram zoptymalizowany dla pojedynczej maszyny, który dzieli zadania na wiele wątków i procesorów, zużywając jedynie około 50 mikrosekund na zadanie.

Jak zainstalować Dask?

Aby zainstalować Dask, wpisz w terminalu poniższą komendę:


python -m pip install "dask[complete]"

Kiedy używać Dask?

Python i jego biblioteki, takie jak NumPy, Pandas czy scikit-learn, stały się niezwykle popularne wśród naukowców zajmujących się danymi. Jednakże te biblioteki nie oferowały solidnych rozwiązań dla równoległości w przypadku dużych zbiorów danych. Dask wypełnił tę lukę, oferując:

  • Łatwe skalowanie obliczeń w Pythonie.
  • Możliwość pracy z danymi większymi niż pamięć RAM.
  • Integrację z istniejącymi bibliotekami Python bez potrzeby pisania nowego kodu.

Dask jest elastyczny i działa lepiej niż rozwiązania takie jak Hadoop czy Apache Spark, szczególnie dla użytkowników Pythona. Dzięki wsparciu dla kodu natywnego jest łatwy w użyciu również dla programistów C/C++/CUDA.

Typy schedulerów w Dask

  1. Scheduler jednowątkowy
    Domyślna opcja Dask, wykonująca zadania sekwencyjnie na jednym wątku. Przydatna do debugowania i zrozumienia przepływu zadań.
  2. Scheduler wielowątkowy
    Odpowiedni dla zadań wymagających dużo czasu na operacje zewnętrzne, np. odczyt z dysku czy operacje sieciowe.
  3. Scheduler wieloprocesowy
    Wykorzystuje wiele procesów do równoległego wykonywania zadań. Każdy proces ma własny interpreter Pythona, co pozwala na efektywne wykorzystanie maszyn wielordzeniowych.
  4. Scheduler rozproszony
    Rozszerza scheduler wieloprocesowy na wiele maszyn w klastrze, umożliwiając rozproszone obliczenia.
  5. Scheduler adaptacyjny
    Dynamicznie dostosowuje liczbę procesów roboczych w zależności od obciążenia, co czyni go idealnym do obsługi zmiennych obciążeń.

Optymalizuj przetwarzanie danych w Pythonie!

Porównanie wydajność Dask i Pandas

Wydajność Pandas – odczytanie zbioru danych za pomocą pd.read_csv()

import pandas as pd


%time
temp = pd.read_csv('dataset.csv', encoding='ISO-8859-1')

Wynik:

  • Czasy CPU: użytkownik 619 ms, system 73,6 ms, łącznie 692 ms
  • Czas ściany (Wall time): 705 ms

Wydajność Dask – odczytanie zbioru danych za pomocą dask.dataframe.read_csv

import dask.dataframe as dd


%time
df = dd.read_csv("dataset.csv", encoding='ISO-8859-1')

Wynik:

  • Czasy CPU: użytkownik 21,7 ms, system 938 µs, łącznie 22,7 ms
  • Czas ściany (Wall time): 23,2 ms

Porównanie wydajności Pandas i Dask pokazuje:

  • znaczącą różnicę w czasie odczytu dużych zbiorów danych.
  • Pandas, choć jest świetnym narzędziem do analizy danych na mniejszą skalę, staje się mniej efektywny przy pracy z większymi zbiorami danych, co widać po czasie odczytu wynoszącym 705 ms.
  • Dask, dzięki swojej zdolności do równoległego przetwarzania i zarządzania zasobami, odczytuje te same dane w zaledwie 23,2 ms.

Oznacza to, że Dask jest znacznie bardziej wydajny w zastosowaniach, gdzie wielkość danych przekracza możliwości pojedynczej maszyny, pozwalając na znaczną oszczędność czasu i zasobów obliczeniowych. To czyni go idealnym rozwiązaniem dla analizy dużych zbiorów danych w środowiskach wymagających skalowalności i szybkiego przetwarzania.

Dask i GPU

GPU, w przeciwieństwie do CPU, posiadają setki rdzeni obsługujących tysiące wątków jednocześnie. Dask umożliwia wykorzystanie mocy obliczeniowej GPU, co czyni go doskonałym narzędziem do przyspieszania analiz danych.

Przykłady integracji Dask z GPU:

  1. RAPIDS
    Pakiet open-source umożliwiający budowanie pipeline’ów nauki o danych na GPU. Dzięki Dask użytkownicy mogą korzystać z akceleracji GPU w Pythonie.
  2. NVTabular
    Biblioteka do przetwarzania i inżynierii cech danych tabelarycznych. Umożliwia łatwą manipulację terabajtowymi zbiorami danych.
  3. BlazingSQL
    Szybki silnik SQL na GPU, pozwalający na wykonywanie zapytań na dużych zbiorach danych w chmurze.
  4. cuStreamz
    Platforma do strumieniowego przetwarzania danych w czasie rzeczywistym, używana m.in. w NVIDIA GeForce NOW™ i NVIDIA DRIVE Sim™.

Podsumowanie

Jeśli chcesz zgłębić temat Dask i ogólnie efektywnej analizy danych w Pythonie, koniecznie zajrzyj na nasz blog oraz do zakładki ze szkoleniami. W naszej bazie wiedzy o programowaniu mamy całą serię wpisów poświęconych bibliotekom Python, takich jak NumPy, Pandas.

To świetny punkt wyjścia, aby zrozumieć, jak te narzędzia wzajemnie się uzupełniają i pozwalają na tworzenie fenomenalnych rozwiązań do analizy danych.