• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Uruchamianie skryptów Python na GPU

Object Storage Arubacloud
+2 głosów
598 wizyt
pytanie zadane 21 stycznia 2022 w Python przez Marak123 Stary wyjadacz (11,190 p.)
zamknięte 27 stycznia 2022 przez Marak123

Witam smiley

Mam plik z danymi który waży ok. 5GB i chcę wprowadzić te dane do bazy danych redis sortując je odpowiednio itp. ale to nie ważne bo zrobić to zrobiłem tylko że na jednym procesie działało to wolno i bym musiał poczekać parę godzin aby się to skończyło więc zrobiłem za pomocą "multiprocessing" parę procesów i zabiera mi to 100% procesora tylko ze i tak to wolno się to wpisuje.

Więc pomyślałem sobie że zrobię te procesy na GPU aby przyśpieszyć proces wpisywania i używać procesora do obsługi bazy danych a karty graficznej do obsługi procesów z odczytywanie danych z pliku i wpisywanie do tej bazy danych. 

I takie pytanie czy tworzenie procesów na GPU coś da i przyśpieszy odczyt danych z pliku i wpisanie do bazy danych?

A jeżeli tak to jak to zrobić? bo robiłem to za pomocą "numba" tylko że nie działa i pokazuje ze "numba nie ma obiektu cuda", a po za tym to czy da się uruchomić na GPU parę procesów naraz?

I jak coś to tak samo jak jest w kategorii i tytule to robię to w Python.

komentarz zamknięcia: problem rozwiązany
komentarz 21 stycznia 2022 przez tkz Nałogowiec (42,000 p.)
Masz Nvidie? Inaczej CUDA nie zadziała. Zostaje jeszcze OpenCl jeżeli na pierwsze pytanie, odpowiedź jest negatywna. Pół żartem, pół serio, imo cuda z pythonem to trochę bluźnierstwo. Musisz pokazać kod, będzie najprościej. Pare procesów(idę o zakład, że mylisz proces z wątkiem) na jednym GPU to słaby pomysł.
komentarz 21 stycznia 2022 przez Marak123 Stary wyjadacz (11,190 p.)

Mam Nvidia RTX 3050. Używam biblioteki multiprocessing i wykorzystuje w niej klase Proces

kod tworzenia procesu:

proc_1 = multiprocessing.Process(target=pushToDB, args=(filename, ))

proc_1.start()

proc_1.join()

 

Kod wywołania działania na GPU:

import numba
from numba import jit, cuda
import numpy as np
import redis


@jit
def pushToDB():#, ret, valRec):
    dbClient = redis.Redis(host='localhost', port=6379, db=0)
    with open("./file/data.txt") as file:
        for line in file:
            if len(line) > 2:
                dbClient.lpush((str(len(line)) + "." + line[0]), line)
            else:
                print("Error: " + line)


if __name__=="__main__":
    pushToDB()

error:

Traceback (most recent call last):
  File "C:\Users\user\Desktop\db\test.py", line 49, in <module>
    pushToDB(filename)
  File "C:\Programs\Python\lib\site-packages\numba\core\dispatcher.py", line 471, in _compile_for_args
    error_rewrite(e, 'unsupported_error')
  File "C:\Programs\Python\lib\site-packages\numba\core\dispatcher.py", line 409, in error_rewrite
    raise e.with_traceback(None)
numba.core.errors.UnsupportedError: Failed in object mode pipeline (step: analyzing bytecode)
The 'with (context manager) as (variable):' construct is not supported.

Musze python bo client redis na c++ jest jakiś problem z kompilacją a bibliotek na c++ skompilowanych nie znalazłem i nie wiem jak zastosować.

I czemu to bluźnierstwo? 

I co znaczy to zdanie "Zostaje jeszcze OpenCl jeżeli na pierwsze pytanie, odpowiedź jest negatywna." tam jest literówka i "odpowiedź na pierwsze pytanie jest negatywna" czy "da się zastosować OpenCI jeżeli GPU nie przyśpieszy wpisywania danych z pliku do bazy danych"?

1 odpowiedź

+2 głosów
odpowiedź 21 stycznia 2022 przez adrian17 Ekspert (344,860 p.)
wybrane 27 stycznia 2022 przez Marak123
 
Najlepsza
Od kompletnie odwrotnej strony do tego podszedłeś i robisz nonsensowne rzeczy.

Pierwszą rzeczą nad jaką powinieneś był się zastanowić to - co w ogóle sprawia że to tak długo trwa, co jest najwolniejszą częścią. Na przykład... komentując linię robiącą push redisowy.

Na moim losowym przykładowym 5GB pliku dostałem:

- sama iteracja po pliku i generowanie klucza: ~5 minut

- odkomentowana linia dbClient.lpush: ~15-20h

Więc program spędza znaczącą większość czasu na gadaniu z redisem.

Czy jit z tym pomoże? Niezbyt - jit odrobinę przyśpieszy Pythona, ale to nie ma znaczenia jak program spędza 99% czasu czekając na redisa.

Czy GPU z tym pomoże? Nie, po pierwsze z tego samego powodu co jit, po drugie... GPU w ogóle do tego nie służy; GPU ma specjalizowane mikro-rdzenie stworzone do obliczeń macierzowych; nie możesz tak po prostu robić na nim operacji na stringach, a co dopiero na plikach czy socketach; ani nie masz tutaj żadnych operacji typowo matematycznych. W dodatku, jak napisał tkz, takie naiwne "wrzucanie Pythona na GPU" to jak lanie super drogiego paliwa dla samochodów F1 do fiata 126p (który nawet na nim nie zapali).

Zamiast tego spójrz na sposoby przyśpieszenia komunikacji z redisem, np batchowanie zapytań przez `dbClient.pipeline()` (poczytaj o nim w dokumentacji); z tym batchowaniem po 1000 operacji, już mi przyśpieszyło z 10x.

Albo wygenerować komendy dla redis-cli i odpalić go osobno: https://redis.io/topics/mass-insert , ale nie wiem czy to będzie lepsze czy gorsze od batchowania w Pythonie.
komentarz 21 stycznia 2022 przez Marak123 Stary wyjadacz (11,190 p.)

Właśnie tak myślałem jeżeli chodzi o operacje na GPU ze jest tam wykonywane operacje matematyczne a nie odczyt stringa z pliku itp. Dzięki za wyjaśnienie.

Poczytam o tym batchowaniu w Python i spróbuję przyśpieszyć jakoś komunikacje z redis bo podobno jest to najszybsza baza danych jaką można zainstalować z tego co czytałem i mimo że stoi na tym samym komputerze na którym jest odpalany skrypt to i tam jest zbyt wolna do tego co chcę zrobić. Dzięki za poświęcony czas i wypowiedź yes 

1
komentarz 21 stycznia 2022 przez adrian17 Ekspert (344,860 p.)

bo podobno jest to najszybsza baza danych jaką można zainstalować

Redis to specjalistyczny in-memory key-value DB. Nie powiedziałbym że to jest typowa baza danych, a to czy jest "najszybsza" czy ogólnie optymalna do zastosowania zależy od... zastosowania :)

komentarz 22 stycznia 2022 przez Marak123 Stary wyjadacz (11,190 p.)

Mam mały problem z baza danych redis ponieważ zrobiłem to wtłaczanie danych do bazy danych za pomocą pipeline co 10000 linijek danych i dała dobrze dopóki nie zostanie wstawione ok 500mln danych bo potem zaczynają się schody z bazą danych i się po prostu wyłącza i nie idzie dalej. Podczas wprowadzania danych do bazy danych jest robiona chyba jakaś kopia i gdy baza danych się wyłącza sama z siebie podczas wpisywania danych to ostatnie linijki wyglądają tak:

2326:M 22 Jan 2022 16:06:37.071 * Background saving started by pid 2340
2340:C 22 Jan 2022 16:08:23.027 * DB saved on disk
2340:C 22 Jan 2022 16:08:23.091 * RDB: 17 MB of memory used by copy-on-write
2326:M 22 Jan 2022 16:08:23.286 * Background saving terminated with success
2326:M 22 Jan 2022 16:09:25.267 * 10000 changes in 60 seconds. Saving...
2326:M 22 Jan 2022 16:09:25.428 * Background saving started by pid 2341
Killed
root@NazywamSie:/home/maby/db-compare# 2341:C 22 Jan 2022 16:13:06.025 * DB saved on disk
2341:C 22 Jan 2022 16:13:06.084 * RDB: 6359 MB of memory used by copy-on-write

Dodam jeszcze ze pamięć ram komputera jest na prawie 100%. A baza danych stoi na ubuntu wsl.

Wie ktoś może dlaczego tak się dzieje i jak temu zapobiec??

 

Druga rzecz z jaką mam problem to taka że zrobiłem skrypt który tworzyć protokół redis i wstawia go do pliku i to działa rzeczywiście tylko ze na ubuntu(linux) protokół redis w pliku zostaje przekazany do bazy danych i pokazuje "successful". Ale jak odpalam go na windows to plik się tworzy itp. ale gdy chcę go wprowadzić do bazy danych:

cat data.txt | redis-cli --pipe

to mi nie wprowadza do bazy danych ani nie ma żadnego komunikatu(erroru), coś takiego jest i tyle:

root@NazywamSie:/home/maby/db-compare# cat data.txt | redis-cli --pipe
root@NazywamSie:/home/maby/db-compare#

Więc tak myślę ze chyba chodzi o system przetwarzania znaków czy coś jeżeli na linux działa dobrze a na windows nie działa. Masz może pomysł dlaczego?

komentarz 22 stycznia 2022 przez adrian17 Ekspert (344,860 p.)

Dodam jeszcze ze pamięć ram komputera jest na prawie 100%. 

No... tak. Wziąłeś sobie redisa bo jest "najszybszy", a zignorowałeś fundamentalną cechę którą wcześniej wspomniałem: trzyma wszystko w pamięci.

https://redis.io/

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker

Próbujesz tam wrzucić 5GB plik, więc po wrzuceniu do bazy zajmie Ci w ramie jeszcze więcej.

komentarz 22 stycznia 2022 przez Marak123 Stary wyjadacz (11,190 p.)
Aha czyli zamiast trzymać pliki na dysku to trzyma je w pamięci?

Jaki to ma sens poza szybkością? jeżeli mamy jakąś platformę i używamy redisa jako bazy danych do przechowywania danych o użytkownikach itp. to musimy dokupywać pamięć ram zamiast dysk twardy.

Da się to jakoś przestawić żeby zapisywało bazę danych na dysku i nie zużywało jakieś makabrycznej ilości pamięci ram? a jeżeli nie to jakiej bazy danych mogę użyć aby była szybka i przechowywała dane na dysku a pamięć ram nie była używana w 100%?
1
komentarz 22 stycznia 2022 przez adrian17 Ekspert (344,860 p.)

jeżeli mamy jakąś platformę i używamy redisa jako bazy danych do przechowywania danych o użytkownikach itp

To właśnie do czegoś takiego nie używa się redisa... Dokładnie dlatego wyżej napisałem

Redis to specjalistyczny in-memory key-value DB. Nie powiedziałbym że to jest typowa baza danych, a to czy jest "najszybsza" czy ogólnie optymalna do zastosowania zależy od... zastosowania :)

Zaznaczę też, że w zasadzie to cały czas nie powiedziałeś czemu w ogóle to 5GB linii pliku chcesz trzymać w bazie, co z nimi robić etc. To od konkretnego zastosowania zależy wybranie bazy (jeśli w ogóle bazy), a nie "która jest dobra i szybka". To jak powiedzieć że mikrofalówka jest lepsza od lodówki bo ma więcej watów :)

komentarz 22 stycznia 2022 przez Marak123 Stary wyjadacz (11,190 p.)
W sumie to nie 5GB tylko 100GB 8,5mld linijek i nie chcę ich trzymać w bazie danych tylko włożyć te dane do bazy aby je sobie rozdzielić bo nie chcę mieć powtórzeń. Nie chcę aby jakaś linijka była wpisana w plik parę razy i dlatego chcę wprowadzić dane do bazy danych i jest jakoś posortować aby program sprawdzający powtórzenia nie wykonywał tego przez 20dni.

Chcę to zrobić jak najbardziej w optymalny sposób i wpadłem na pomysł z bazą danych ale się też zastanawiam czy nie zrobić po prostu katalogu w którym będą pliki tekstowe które będą w środku miały dane z grupy takiej jak się nazywa plik. Tylko nie wiem czy to będzie dobre rozwiązanie bo może być tam nawet z 50k plików o różnych wielkościach.
1
komentarz 22 stycznia 2022 przez adrian17 Ekspert (344,860 p.)

aby je sobie rozdzielić bo nie chcę mieć powtórzeń

(Jakby co, na linuxie zwykłe `LC_ALL=C sort -u plik.txt` do deduplikacji jest szybkie i umie obsługiwać pliki znacznie większe niż dostępny RAM, więc możliwe że u Ciebie też się sprawi)

komentarz 22 stycznia 2022 przez Marak123 Stary wyjadacz (11,190 p.)

AHA surprise

Ja się tu męczę od paru dni z usunięciem duplikatów z pliku a na linux jest narzędzie które to umożliwia i jeszcze posortuje ten plik. No ja pier****.

A mogłem pomyśleć i wpisać w neta czy jest takie narzędzie, nie przyszło mi nawet to do głowy. Ale chociaż nauczyłem się obsługi redis.

Dobra dzięki wielkie za poświęcony czas i pomoc.

Na razie przetestowałem na mniejszym piku i działa dobrze.

Podobne pytania

+2 głosów
2 odpowiedzi 122 wizyt
pytanie zadane 2 lutego w Python przez MichaelM Bywalec (2,520 p.)
0 głosów
0 odpowiedzi 937 wizyt
0 głosów
0 odpowiedzi 111 wizyt

92,570 zapytań

141,423 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...