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
- Scheduler jednowątkowy
Domyślna opcja Dask, wykonująca zadania sekwencyjnie na jednym wątku. Przydatna do debugowania i zrozumienia przepływu zadań. - Scheduler wielowątkowy
Odpowiedni dla zadań wymagających dużo czasu na operacje zewnętrzne, np. odczyt z dysku czy operacje sieciowe. - 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. - Scheduler rozproszony
Rozszerza scheduler wieloprocesowy na wiele maszyn w klastrze, umożliwiając rozproszone obliczenia. - 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:
- 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. - NVTabular
Biblioteka do przetwarzania i inżynierii cech danych tabelarycznych. Umożliwia łatwą manipulację terabajtowymi zbiorami danych. - BlazingSQL
Szybki silnik SQL na GPU, pozwalający na wykonywanie zapytań na dużych zbiorach danych w chmurze. - 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.
W kręgu moich zainteresowań są finanse oraz psychologia zachowań konsumenckich. Jestem fanką ekologicznych rozwiązań, które są w stanie zmienić świat na lepsze. W wolnym czasie czytam i ćwiczę jogę.