Paralelizace a zrychlení v Pythonu

txt

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #45 kdy: 05. 03. 2015, 21:15:05 »
většina věcí stejně už v C je, proto je Python je tak rychlý
Tedy poté co jsi přepsal kód z Pythonu do C, tak je Python rychlý. Vskutku brilantní úvaha ;D
Neni tajemství že je Python lepidlo C knihoven. Takže výsledná kombinace by měla bejt přijatelně rychlá, napsaná v přijatelným čase a oproti C přehlednější.


Re:Paralelizace a zrychlení v Pythonu
« Odpověď #46 kdy: 05. 03. 2015, 21:19:05 »
V tomhle dobrý, asi bych to měl vyzkoušet. Právě ty PARALELNÍ data v Pythonu, mi přišlo že se člověk musí věnovat víc implementaci paralelního modelu, než samotnýmu významu dat. Prostě si to v OpenMP, či pomocí socketů napsat sám.
Ono s tou paralelizací je to těžký - nemám moc rád v tomhle ohledu obecný tvrzení, protože víc zamlžují než odhalují. Primárně je paralelizace o tom, jak vypadá ten proces, že jo. Pokud máš operace, který na sebe z principu musí čekat, tak s tím nic nenaparalelizuješ. A naopak pokud máš triviální SIMD operace, tak to nějak půjde paralelizovat prakticky v jakýmkoli jazyce... A někde mezi tím je programátorská kultura - když máš brutálně propojenou haldu objektů, tak seš v pytli každopádně. Pokud máš oddělený datový struktury, je zas šance větší... Prostě no silver bullet, většinou je to stejně nakonec o kvalitě analytika ;)

Ohledně distribuované verze, tam jenom vim že by to prej asi mělo jít, ale teď se věnuju něčemu jinýmu.
Jo, vím že existuje třeba http://www.ebi.ac.uk/Tools/rcloud/ a různý jiný balíčky, ale vyzkoušený to právě nemám a ani to zatím není úplná priorita...

Neni tajemství že je Python lepidlo C knihoven. Takže výsledná kombinace by měla bejt přijatelně rychlá, napsaná v přijatelným čase a oproti C přehlednější.
Jenže to právě nic neříká o kvalitě jazyka. To bys taky mohl mít jazyk, ve kterým by se OS Windows implementoval takhle:
Kód: [Vybrat]
new Windows();
...a zbytek by byl v C++ ;)

xmdude00

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #47 kdy: 05. 03. 2015, 22:43:01 »
Není to tak úplně pravda. Python může volat C funkce, které mohou být paralelizované, viz numpy. Okolnosti mě donutily přepsat nejpomalejší část mého kodu do C, tu jsem paralelizoval pomoci omp. Doba řešení se zkrátila z hodin na minuty. Řešení je to jednoduché a spolehlivé, pokud je možné úlohu zadat pomocí několika ctypes.
Začátečnickej dotaz - to potom běží víc interpreterů, nebo se paralelizuje na úrovni dynamický knihovny?
Je to paralelizované na úrovni knihovny. Například zkuste použít OpenBLAS misto ATLAS a pak řešit soustavu rovnic pomocí scipy.sparse.linalg.gmres . Řešení bude probíhat na více CPU (pokud máte OpenBLAS zkompilovaný jako multithread)

andy

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #48 kdy: 05. 03. 2015, 23:03:10 »
Nie je na matice a take veci najlepsi octave? Kedysi som v tom daco robil a vykon bol pre mna dostatocny. Ale treba to vsetko dostat do tych matic. Ked tam zacnes cpat cykly, tak to bude este pomalsie.. (konkretne som nacitaval nejake zvukove subory a robil fft)

Kolemjdoucí

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #49 kdy: 05. 03. 2015, 23:05:15 »
Neni tajemství že je Python lepidlo C knihoven. Takže výsledná kombinace by měla bejt přijatelně rychlá, napsaná v přijatelným čase a oproti C přehlednější.

Dneska mě to tady baví  ;D

--- Kód v C se použitím v Pythonu stává přehlednějším.
--- Přepsáním kódu z Pythonu do C se Python stane rychlým.


jozef.m

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #50 kdy: 06. 03. 2015, 00:30:14 »
Kód: [Vybrat]
gc.disable()

rngy = range(yPM)
rngx = range(xPM)

for line in infile:
    lst = line.split(";")
    pressure = float(lst[0]) + const
    x = float(lst[1])
    y = float(lst[2])
    z = float(lst[3])
    pidID = int(lst[4])

    for xx in rngx:  # pocet bodu v Y (je definovana matice sledovanych bodu - Y = 4)
        for yy in rngy:  # pocet bodu v X v Y (je definovana matice sledovanych bodu - X = 0)
            tmp = POINT_MATRIX[xx][yy][0]

            if pidID == tmp[0]:
                if (x == tmp[1] and y == tmp[2] and z == tmp[3]):
                    RES_POINT_MATRIX[xx, yy, it] = pressure

infile.close()
gc.enable()


ak by to bolo stale pomale, tak pouzit pypy.
pripadne pustit paralerne tolko skriptov kolko je cpu.

xmdude00

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #51 kdy: 06. 03. 2015, 06:41:55 »
Nie je na matice a take veci najlepsi octave? Kedysi som v tom daco robil a vykon bol pre mna dostatocny. Ale treba to vsetko dostat do tych matic. Ked tam zacnes cpat cykly, tak to bude este pomalsie.. (konkretne som nacitaval nejake zvukove subory a robil fft)
Není, to co uvádíte lze řesit přes numpy, scipy které většinou využívá stejných knihoven jako octave. Výkon je tedy skoro stejný.
Někdy nejde úloha vektorizovat, cyklům se potom nelze vyhnout. Pokud to lze "dostat do tych matic", pak to výjde na stejno.

xmdude00

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #52 kdy: 06. 03. 2015, 06:53:30 »
Neni tajemství že je Python lepidlo C knihoven. Takže výsledná kombinace by měla bejt přijatelně rychlá, napsaná v přijatelným čase a oproti C přehlednější.

Dneska mě to tady baví  ;D

--- Kód v C se použitím v Pythonu stává přehlednějším.
--- Přepsáním kódu z Pythonu do C se Python stane rychlým.

Taková je praxe. Zkuste se podívat na scipy. Většina je obal okolo Fortranovských a Cčkovýh knihoven LAPACK, ARPACK, FITPACK apod.
U numerických výpočtu je skutečně nesmysl reprezentovat každé číslo pomocí ukazatele na PyObject, když jde o každou tisícinu vteřiny.
Výsledná kombinace nabízí rychlost Cčkového kodu a pohodlné uživatelské rozhraní přes pythonovské objekty, při použití dobrého interaktivního  interpreteru (např. ipython) je s tím radost pracovat.

Kolemjdoucí

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #53 kdy: 06. 03. 2015, 09:55:35 »
Čtvrt roku píšeš 50 000 řádků v C, pomalu se v tom začínáš ztrácet, ale 50 řádků v Pythonu na zapouzdřující objekt to zázračně zpřehlední a rozradostní ;D Není ten Python ze SSSR ? ;-)

txt

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #54 kdy: 06. 03. 2015, 10:52:32 »
Čtvrt roku píšeš 50 000 řádků v C, pomalu se v tom začínáš ztrácet, ale 50 řádků v Pythonu na zapouzdřující objekt to zázračně zpřehlední a rozradostní ;D Není ten Python ze SSSR ? ;-)
Vtip je v tom, že těch 50K řádků nepíšeš ty, ale specialisti na implementaci fest rychlých algoritmů. Ty řešíš, jak pomocí těch algoritmů vypočítat něco aplikačně specifickýho.

karel

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #55 kdy: 07. 03. 2015, 09:38:54 »
No nevim co tu maji nekteri za problem s paralelismem v pythonu, ale odpoved na puvodni otazku je celkem snadna
pokud potrebujes x souboru/dat zpracovat tou samou funkci paralelne tak pouzi multiprocessing pool proste se ti vytvori tolik procesu kolik zadas nebo pokud nic nezadas tak si to veme podle poctu jader a sup uz to leti.

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #56 kdy: 07. 03. 2015, 11:14:05 »
No nevim co tu maji nekteri za problem s paralelismem v pythonu
S paralelismem v Pythonu nikdo problém nemá, protože v Pythonu žádný paralelismus není ;)

Citace
One of the most frequently asked questions from beginning Python programmers when they explore multithreaded code for optimisation of CPU-bound code is "Why does my program run slower when I use multiple threads?".
http://www.quantstart.com/articles/Parallelising-Python-with-Threading-and-Multiprocessing

Citace
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
https://wiki.python.org/moin/GlobalInterpreterLock

Citace
pokud potrebujes x souboru/dat zpracovat tou samou funkci paralelne tak pouzi multiprocessing pool proste se ti vytvori tolik procesu kolik zadas nebo pokud nic nezadas tak si to veme podle poctu jader a sup uz to leti.
...což je skoro to samý, jako by si spustil tolik interpreterů, kolik má jader :)

jenda

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #57 kdy: 07. 03. 2015, 17:39:30 »
baba :)

jen pro inspiraci, kdyz uz to mam pusteny ... je to jen scitani, takze rychlejsi - milion pod desetinu vteriny :

ipython qtconsole

In [1]: import pyopencl as cl
   ...: import numpy
   ...: import numpy.linalg as la
   ...: import time
   ...:
   ...: _tlast = 0
   ...:
   ...: def TimingInit():
   ...:     global _tlast
   ...:     _tlast=time.clock()
   ...:
   ...: def Timing():
   ...:     global _tlast
   ...:     t0=time.clock()
   ...:     print t0-_tlast
   ...:     _tlast=t0
   ...:
   ...: ###  ----- main ---
   ...:     

In [2]: TimingInit()
   ...: a = numpy.random.rand(1e6).astype(numpy.float32)
   ...: Timing()
   ...: b = numpy.random.rand(1e6).astype(numpy.float32)
   ...: Timing()
   ...: ctx = cl.create_some_context()
   ...: Timing()
   ...: queue = cl.CommandQueue(ctx)
   ...: mf = cl.mem_flags
   ...: a_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a)
   ...: b_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b)
   ...: dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, b.nbytes)
   ...: Timing()
   ...: prg = cl.Program(ctx, """
   ...:     __kernel void sum(__global const float *a,
   ...:     __global const float *b, __global float *c)
   ...:     {
   ...:       int gid = get_global_id(0);
   ...:       c[gid] = a[gid] + b[gid];
   ...:     }
   ...:     """).build()
   ...: Timing()
   ...: prg.sum(queue, a.shape, None, a_buf, b_buf, dest_buf)
   ...: Timing()
   ...: a_plus_b = numpy.empty_like(a)
   ...: Timing()
   ...: cl.enqueue_copy(queue, a_plus_b, dest_buf)
   ...: Timing()
   ...: print(la.norm(a_plus_b - (a+b)), la.norm(a_plus_b), a_plus_b.size)
   ...:
0.012044
0.011675
0.061999
0.00342
0.003968
0.001592
8.8e-05
0.000712
(0.0, 1080.2306, 1000000)

karel

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #58 kdy: 09. 03. 2015, 09:27:53 »
...což je skoro to samý, jako by si spustil tolik interpreterů, kolik má jader :)

omlouvam se obcas zapomenu ze spravny programator misto toho aby nechal robit pocitac tak radeji sam rucne rozdeli data na podobne hromadky a nasledne nad daty pusti per hromadka script, pak to hezky cekuje kdy uz to dojede a nasledne sleje vysledky dohromady pokud mozno do excelu

Kolemjdoucí

Re:Paralelizace a zrychlení v Pythonu
« Odpověď #59 kdy: 09. 03. 2015, 11:32:41 »

Správný programátor použije technologii podporující SMP, jedna funkce běží klidně 16x paralelně nad tou stejnou hromadou dat.
http://en.wikipedia.org/wiki/Symmetric_multiprocessing
SMP se v konzumním IT vyskytuje od Pentia D asi tak 10 let, ale nepřekvapivě to zatím asi žádný skriptovací jazyk nepodporuje.