ayshakhatun9365
Dołączył: 11 Lis 2024 Posty: 1
|
Wysłany: Pon Lis 11, 2024 09:57 Temat postu: Skalowanie do jednego miliarda wierszy danych w pandas przy |
|
|
One Billion Row Challenge to zabawny test porównawczy, który pokazuje podstawowe operacje przetwarzania danych. Pierwotnie został uruchomiony jako konkurs w czystej Javie i zgromadził społeczność programistów w innych językach, w tym Python, Rust, Go, Swift i innych. Wyzwanie było przydatne dla wielu inżynierów oprogramowania zainteresowanych eksploracją szczegółów odczytu plików tekstowych, algorytmów opartych na skrótach i optymalizacji procesora. Od połowy 2024 r. repozytorium GitHub One Billion Row Challenge przyciągnęło do tej pory ponad 1,8 tys. rozwidleń, zdobyło ponad 6 tys. gwiazdek i zainspirowało dziesiątki postów na blogach i filmów .
W tym poście pokazano użycie trybu akceleratora RAPIDS cuDF pandas do ukończenia wyzwania przetwarzania miliarda wierszy danych. W szczególności pokazujemy, jak dwie nowe funkcje w wersji 24.08 akceleratora cuDF pandas — obsługa dużych ciągów znaków i zarządzana pamięć z wstępnym pobieraniem — umożliwiają lepszą wydajność dużych rozmiarów danych dzięki przepływom pracy przetwarzania danych akcelerowanym przez GPU.
Przetwarzanie danych w trybie akceleratora RAPIDS cuDF pandas
pandas to biblioteka oprogramowania typu open source zbudowana na Pythonie specjalnie do manipulacji danymi i ich analizy. Jest to elastyczne narzędzie do przetwarzania danych, które obsługuje operacje potrzebne do ukończenia wyzwania One Billion Row Challenge, w tym parsowanie pliku tekstowego, agregowanie danych liczbowych według grup i sortowanie tabeli.
RAPIDS cuDF to biblioteka GPU DataFrame, która zapewnia API podobne do pandas do ładowania, filtrowania i manipulowania danymi. A tryb akceleratora RAPIDS cuDF pandas wprowadza przyspieszone obliczenia do przepływów pracy pandas bez żadnych zmian w kodzie dzięki ujednoliconemu środowisku użytkownika CPU/GPU. Aby dowiedzieć się więcej, zobacz RAPIDS cuDF przyspiesza pandas prawie 150x bez żadnych zmian w kodzie .
Poniższy skrypt pandas wystarczy, aby ukończyć wyzwanie One Billion Row Challenge:
import pandas as pd
Uruchomienie tego skryptu z trybem akceleratora cuDF pandas wymaga dodania polecenia jednowierszowego przed zaimportowaniem pandas do Python lub Jupyter Notebooks. Polecenie to %load_ext cudf.pandas.
%load_ext cudf.pandas
import pandas as pd
Dowiedz się Lista e-mailowa B2B więcej o trybie akceleratora RAPIDS cuDF pandas , w tym o różnych sposobach używania tego trybu w Pythonie, takich jak flaga modułu Pythona lub jawne włączanie poprzez import.
Nowe funkcje przetwarzania dużych danych w trybie akceleratora RAPIDS cuDF pandas 24.08
Wersja RAPIDS cuDF pandas accelerator mode 24.08 obejmuje dwie kluczowe funkcje dla wydajniejszego przetwarzania danych: obsługę dużych ciągów i zarządzaną pulę pamięci z prefetchingiem. Razem te funkcje umożliwiają przetwarzanie dużych DataFrame — do 2,1 miliarda wierszy danych, z dobrą wydajnością nawet przy 2-3-krotności całkowitej pamięci GPU. Należy zauważyć, że Windows Subsystem for Linux (WSL2) ma ograniczone wsparcie dla nadsubskrypcji GPU, a wyniki przedstawione w tym poście zostały zebrane w Ubuntu 22.04.
Duży wspornik strunowy
Obsługa dużych ciągów znaków umożliwia RAPIDS cuDF dynamiczne przełączanie między indeksami 32-bitowymi i 64-bitowymi. Zamiast jawnie obsługiwać dwa typy ciągów znaków, tak jak typy ciągów znaków i dużych ciągów znaków istnieją w PyArrow, ciągi znaków w cuDF przełączają się na indeksy 64-bitowe tylko wtedy, gdy dane kolumny przekraczają 2,1 miliarda znaków. Umożliwia to cuDF zachowanie mniejszego śladu pamięci i większej szybkości przetwarzania dla kolumn zawierających mniej niż 2,1 miliarda znaków, a jednocześnie obsługę wydajnego przetwarzania dla dużych kolumn ciągów znaków.
Wcześniej, w wersji 24.06, przepełnienie ciągu występowało, gdy kolumna ciągu na GPU miała ponad 2,1 miliarda znaków, a wynikający z tego błąd przepełnienia powodował, że dane były kopiowane z powrotem do hosta i wracały do przetwarzania pandas. Teraz, w wersji 24.08, DataFrames mogą mieć mieszankę dużych i małych kolumn ciągu, a każda kolumna jest przetwarzana poprawnie jako typ kolumny ciągu w cuDF.
Zarządzana pula pamięci z wstępnym pobieraniem
Zarządzana pula pamięci z prefetchingiem umożliwia cuDF korzystanie zarówno z pamięci GPU, jak i pamięci hosta do przechowywania danych i unikania błędów braku pamięci. Zarządzana pamięć, znana również jako CUDA Unified Virtual Memory, utrzymuje pojedynczą przestrzeń adresową obsługiwaną przez pamięć GPU i hosta. Gdy jądro GPU jest uruchamiane, wszelkie dane, do których nie ma dostępu GPU, są stronicowane (migrowane) z pamięci hosta do pamięci GPU. Korzystanie z puli pamięci z zarządzaną pamięcią zmniejsza narzut z każdej alokacji i skraca ogólny czas wykonywania. Prefetching jest również ważny dla obserwacji dobrej wydajności z zarządzaną pamięcią, ponieważ pomaga zapewnić, że dane są dostępne dla jąder GPU bez konieczności stronicowania danych w momencie obliczeń, co może być „po prostu za późno”.
Wcześniej, w wersji 24.06, większe zestawy danych częściej wyczerpywały całkowitą pamięć GPU, a wynikający z tego błąd braku pamięci powodował również kopiowanie danych z powrotem do hosta i powrót do przetwarzania pandas. Teraz, w wersji 24.08, tryb akceleratora cuDF pandas używa zarządzanej puli pamięci z włączonym wstępnym pobieraniem. Należy pamiętać, że najlepsza wydajność przy dużych rozmiarach danych może zależeć od danych i przepływu pracy. Zapraszamy do przesyłania opinii .
Uruchamianie wyzwania One Billion Row Challenge przy użyciu procesorów graficznych NVIDIA
Możesz uruchomić wyzwanie zarówno na GPU o dużej, jak i małej pamięci, co pokazuje wpływ na wydajność dużych funkcji danych w RAPDIS cuDF 24.08. Przy liczbie wierszy wynoszącej jeden miliard wyzwanie zaczyna się od pliku tekstowego o rozmiarze 13,1 GB. W cuDF zamienia się to w 16 GB danych ciągów i 8 GB danych float64. Operacja read_csvosiąga szczyt ~76 GB szczytowego śladu pamięci, a groupbyłączna operacja osiąga szczyt ~56 GB szczytowego śladu pamięci.
Należy zauważyć, że pliki wejściowe zostały wygenerowane zgodnie z repozytorium One Billion Row Challenge GitHub, przechowywane na lokalnym dysku SSD NVMe i buforowane przez system operacyjny podczas testów porównawczych. Czas ściany mierzono jako czas wykonania kompletnego polecenia subprocess.runw Pythonie, w tym wszystkich kroków inicjalizacji i ładowania.
Procesor graficzny NVIDIA A100 Tensor Core
Podczas uruchamiania wyzwania z trybem akceleratora RAPIDS cuDF pandas i GPU z wystarczającą ilością pamięci, obsługa dużych ciągów znaków jest kluczowa dla dobrej wydajności. Pierwszy zestaw sprzętowy wykorzystuje GPU NVIDIA A100 Tensore Core 80 GB PCIe, procesor Arm Neoverse-N1 z 500 GiB pamięci RAM i dysk SSD Samsung MZ1L23T8HBLA. Dla liczby wierszy 200 milionów, cuDF pokazuje ~6 sekund czasu wykonania, w porównaniu do czasu wykonania samego procesora pandas wynoszącego ~50 sekund. Jednak dla 300 milionów wierszy, przepełnienie ciągu znaków w cuDF 24.06 powoduje, że pandas cofa się i wydłuża czas wykonania do ~240 sekund.
Przy obsłudze dużych ciągów w cuDF 24.08 obserwujemy czas wykonania miliarda wierszy wynoszący 17 sekund, co jest znacznie szybsze niż czas wykonania pandas wynoszący 260 sekund i czas wykonania cuDF 24.06 wynoszący 800 sekund. Jest to pokazane na rysunku 1 na zielono. Należy zauważyć, że łagodne przejście na CPU z powodu wyczerpania pamięci GPU prowadzi do dłuższego czasu wykonania w cuDF 24.06.
Wykres przedstawiający czas wykonania 1BRC jako funkcję liczby wierszy przy użyciu cuDF 24.06, cuDF 24.08 i pandas 2.2.2 na węźle GPU NVIDIA A100.
Rysunek 1. Czas wykonania wyzwania „One Billion Row Challenge” jako funkcja liczby wierszy, z cuDF 24.06, cuDF 24.08 i pandas 2.2.2, na węźle GPU NVIDIA A100
Procesor graficzny NVIDIA Tesla T4
Możemy również ocenić wydajność na starszej generacji GPU z 2018 roku, która jest szeroko dostępna na platformach notebooków, takich jak Colab i Kaggle. W tym przypadku zarządzana pula pamięci z prefetchingiem staje się krytyczna dla dobrej wydajności. Drugi zestaw sprzętowy wykorzystuje GPU NVIDIA Tesla T4 14 GB PCIe, procesor Intel Xeon Gold 6130 z 376 GiB pamięci RAM i dysk SSD Dell Express Flash PM1725a. Dla liczby wierszy 200 milionów tryb akceleratora RAPIDS cuDF pandas pokazuje ~10 sekund czasu wykonania w porównaniu do czasu wykonania pandas ~130 sekund. Gdy skalujemy do miliarda wierszy, GPU T4 działa przy około 5-krotnej nadsubskrypcji i nadal kończy z czasem wykonania 200 sekund, w porównaniu do czasu wykonania pandas 660 sekund (Rysunek. _________________ Lista e-mailowa B2B |
|