27.01.20224 min

Vincent ClaesFreelance Machine Learning Engineer

Nie używaj Sparka do Machine Learning!

Jak uprościć Machine Learning bez Sparka?

Nie używaj Sparka do Machine Learning!

Spark to świetna opcja dla tych, którzy muszą przetworzyć dużą ilość danych. Spark i Pyspark (API Pythona zintegrowany Sparkiem) są kluczowymi narzędziami w pasku narzędzi inżyniera danych. I to z dobrego powodu:

Bez względu na to, jak w dużej będą Twoje dane, nadal będziesz w stanie je przetwarzać

To dość częsty argument, chociaż jest to adekwatne do profilu nowoczesnych firm, które budują „klasyczne” potoki danych, używając Sparka w sposób end-to-end do łączenia, czyszczenia, przekształcania i agregowania swoich danych w celu uzyskania zbioru danych.


Koszty Sparka dla uczenia maszynowego

Powyższy argument nie zawsze ma zastosowanie w przypadku naukowców i inżynierów uczenia maszynowego budujących potoki danych, których wynikiem jest model uczenia maszynowego. Z potokami uczenia maszynowego wiążą się następujące koszty:

Zaznajomienie — z mojego doświadczenia wynika, że osoby zajmujące się data science, nie są tak dobrze zaznajomione z (Py)Spark, jak z Pandas. W obu przypadkach wykorzystywana jest koncepcja ramek danych, ale API do manipulowania danymi w ramce jest zupełnie inny. Oto jeden z przykładów zestawienia Pandas i Pyspark, gdzie tworzymy nową kolumnę:

df['Age_times_Fare'] = df['Age'] * df['Fare']
df = df.withColumn("AgeTimesFare", $"Age" * $"Fare")

Utrzymanie — pakiety Pythona, takie jak Pandas, Scikit-learn, Pytorch, Tensorflow, są podstawowym narzędziem dla naukowców danych i inżynierów uczenia maszynowego. Wprowadzając Sparka, wprowadzasz do swojego potoku drugie, dodatkowe narzędzie do przetwarzania danych, które musisz utrzymywać.

Złożoność kształcenia — Spark działa w klastrze, poza procesem Pythona, co wprowadza dodatkową złożoność testowania i uruchamiania niestandardowego kodu. Do testów należy skonfigurować na swoim systemie środowisko Spark. Podczas korzystania z PySpark, zewnętrzne biblioteki Pythona muszą być dostarczane do egzekutorów Sparka, w celu uniknięcia ‘ImportErrors’.

Złożoność wnioskowania — z własnego doświadczenia mogę powiedzieć, że Spark/SparkML rzadko kiedy używany jest do modelowania, jednak zauważyłem, że używany jest do konstruowania cech. W tym przypadku najlepiej jest powtórzyćpodczas wnioskowania kroki z czasu kształcenia. Można to wykonać poprzez spakowanie kroków inżynierii cech jako model w czasie kształcenia, a potem używanie tego modelu w czasie wnioskowania. Ponieważ model uczenia maszynowego jest często oparty na różnych technologiach (Scikit-learn, PyTorch, Tensorflow, etc.), musisz zarządzać organizacją pomiędzy modelem inżynierii cech opartym na Sparku a modelem uczenia maszynowego w czasie wnioskowania. Zwiększa to złożoność uruchomienia modelu.

Nie mówię, że powinieneś wyrzucić Sparka do kosza. Po prostu bądź krytyczny w kwestii jego wyboru.


Więcej prostoty

Poniższe wskazówki sugerują alternatywne rozwiązania i proponują prostsze podejście, jeszcze zanim napiszesz jakąkolwiek linijkę kodu Spark.


1. Skalowanie wertykalne

Spróbuj wertykalnie skalować swoją instancję obliczeniową, aby pomieścić całość danych w pamięci. Spróbuj przetworzyć swoje dane za pomocą Pandas i zobacz, czy czas przetwarzania jest nadal odpowiedni.


2. Czy potrzebujesz wszystkich danych?

Czy potrzebujesz wszystkich swoich danych, aby dostarczyć wartość biznesową? Jaka jest wartość dodana dodatkowego roku danych?

Czy korzyści z wydajności twojego modelu przewyższają koszty zastosowania Sparka? Spójrz na krzywe oceny uczenia maszynowego przed pobraniem większej ilości danych. Jeśli wyniki są już dobre i nie występuje nadmierne dopasowanie, to być może nie potrzebujesz więcej danych.


3. SQL

Zanim napiszesz choćby jedną linijkę kodu w (Py)Spark, sprawdź, czy nie osiągniesz celu, używając SQL. Ogólnie rzecz biorąc, SQL jest łatwiejszy do napisania i utrzymania. Jeśli masz już do dyspozycji klaster Spark, wypróbuj SparkSQL. Możesz również spróbować wystawić swoje dane za pomocą bezserwerowego silnika SQL, takiego jak Google Big Query lub AWS Athena. Możesz nawet wykonać bardziej zaawansowane transformacje, używając SQL poprzez dbt. Koniecznie sprawdź tę możliwość!


4. Usługi w chmurze

Jeśli potrzebujesz stworzyć klaster Spark, najpierw sprawdź bezserwerowe usługi chmurowe, takie jak AWS Glue. Pozwala ona na uruchomienie w ciągu kilku sekund klastra Spark do 100 egzekutorów, gdzie każdy ma 4 CPU i 16 GB RAM.

Jeśli potrzebujesz bardziej konfigurowalnego klastra i wiesz już nieco więcej o tym, co robisz, możesz spróbować np. AWS EMR.


Alternatywy dla Sparka

Niektóre alternatywne rozwiązania mogą pomóc w przetwarzaniu dużych ilości danych:


Vaex

Vaex jest biblioteką Pythona do przetwarzania danych z podobną pod względem API do Pandas. Jest to rozwiązanie niezależne od liczby dostępnych rdzeni, które może obsłużyć do miliarda wierszy na sekundę. Limit wielkości zbioru danych jest równy wielkości Twojego dysku twardego.


Dask

Dask jest podobny do Sparka w tym sensie, że można go skalować horyzontalnie w celu przetworzenia dużej ilości danych. Różni się jednak tym, że jest napisany w Pythonie i obsługuje gotowe do zainstalowania biblioteki, takie jak Pandas i Scikit-Learn.

Oryginał tekstu w języku angielskim przeczytasz tutaj.

<p>Loading...</p>