[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
user:zeman:malt-parser [2009/12/10 10:35]
zeman Stav trénování čtvrtek 10.12.2009.
user:zeman:malt-parser [2013/07/11 22:15] (current)
zeman Odstraněn záznam o ladění před 3 lety.
Line 1: Line 1:
-====== Malt parser ======+====== Malt parser: pokusy s PDT 2.0 ======
  
-Toto je rychlý úvod do práce s Malt parserem.+http://maltparser.org/
  
-Jeden z formátů, které parser umí, je sloupcový formát CoNLL. Kromě trénovacích dat potřebuje parser znát také seznam slovních druhů (POS), hrubých slovních druhů (CPOS) a značek pro druhy závislostí (české AFUNy). Pokud nemáme k dispozici vyčerpávající seznamy pro naše data, můžeme alespoň dat vytáhnout to, co se v nich opravdu objevilo:+Od května 2012 používám Malt Parser 1.7.1 z ''/home/zeman/nastroje/parsery/maltparser-1.7.1''.
  
-<code>setenv MALT /home/zeman/nastroje/parsery/malt/maltparser_0.+Podle Joakima trénování na celém PDT trvá 3 až 5 dní, a to ještě jen při použití splitting tricku (bez něj několik týdnů)Trénování SVM má kvadratickou složitost vzhledem k&nbsp;počtu trénovacích příkladů; těch z&nbsp;PDT vypadnou asi 3 milióny(S&nbsp;Joakimem jsem se o tom bavil na jaře 2010 a šlo o Malt Parser 1.3. Tehdy jsem také zkoušel trénovat bez splitting trickuJeden experiment běžel i 60 dní, řada experimentů ale vůbec nedoběhla, protože jejich stroj cestou chcípnul.)
-setenv CONLL /net/data/conll +
-cd $MALT +
-$PARSINGROOT/tools/conll_tag_list.pl < $CONLL/2006/swedish/otrain.conll -c > tagset.cpos +
-$PARSINGROOT/tools/conll_tag_list.pl < $CONLL/2006/swedish/otrain.conll -c 4 > tagset.pos +
-$PARSINGROOT/tools/conll_tag_list.pl < $CONLL/2006/swedish/otrain.conll -c 7 > tagset.dep</code>+
  
-Taky potřebujeme soubor s definicemi rysů. Pro začátek můžeme využít jeden ze souborů dodávaných parserem, ale musíme si ho buď přejmenovat, nebo v souboru ''options.dat'' změnit názevpod kterým ho bude parser hledat.+Celá trénovací data mají 68562 vět (někde mám chybně uvedeno 68563 kvůli nejasnostem s&nbsp;počítáním od nuly a od jedničky, ale teď jsem to kontroloval a dvojím způsobem epočítával prázdné řádky v&nbsp;souboru ''dtrain.conll'' a je to opravdu 68562). Testování je vždy, když není řečeno jinak, na celém dtestu, tedy 9270 vět. Tamkde je explicitně uvedeno testování na etestu, jde o 10148 vět; v&nbsp;tom případě pak trénuju na sjednocení trénovacích a d-test dat, celkem 77832 vět.
  
-<code>ln -s m2.par model.par</code>+===== Jak se to pouští? =====
  
-Výchozí volby lze načíst ze souboru options.dati trénování parser posílá na výstup stromečky, což lze využít při konverzi formátůNatrénovaný model se ukládá do souborůjejichž názvy se odvodí ze souboru s definicemi rysů, model.parTrénování můžeme pustit napřtakhle:+  * Přejít do adresáře ''/net/work/people/zeman/parsing/projects/maltpdt'', popřsi nejdřív někam vybalit SVN parsing a pak ejít do složky ''projects/maltpdt''
 +  * Skript ''getdata.csh''případně ''getdata.gold.csh'' (pokud chceme použít ručně zjednoznačněnou morfologii), nám vyrobí místní kopii trénovacích a testovacích dat, evedenou do formátu CoNLLJsou to data z&nbsp;PDT 2.0 (traindtest a etest na analytické rovině) a já už je mám na toto místo zkopírované. 
 +  * Složka ''/net/work/people/zeman/parsing/projects/maltpdt/experiments'' obsahuje pokusy, ve kterých jsem se snažil co nejvíce přiblížit nastavení, které se nejvíce osvědčilo Joakimovi a jeho týmu v&nbsp;roce 2009. Příslušné soubory s&nbsp;definicemi rysů jsou ve složce ''/net/work/people/zeman/parsing/malt-parser/marco-kuhlmann-czech-settings''Je tam také skript ''conll-pdttags2conll.pl'', kterým se patnáctimístné poziční značky PDT převedou na takové seznamy rysů a hodnot, jaké se používaly v&nbsp;soutěži CoNLL 2009. 
 +  * Dosud neexistuje žádný Makefile. Pouštělo se to pomocí skriptu ''all.pl'', který rovnou odesílal úlohy na cluster. Každá složka s&nbsp;odlišným pokusem má svou mutaci tohoto skriptu. Každá odeslaná úloha se skládá ze tří částíučení, rozbor testovacích dat a vyhodnocení.
  
-<code>maltparser -f option.dat -m LEARN -I CONLLTAB -i $CONLL/2006/swedish/otrain.conll</code>+===== Co dál? =====
  
-Trénování nad 11000 švédskými tami trvalo na zenu asi 13 s.+  * Upravit švédskou definici rysů, aby fungovala i s&nbsp;algoritmy ''nivrestandard'', ''nivreeager'', ''covproj'' a ''covnonproj''. Vše vyzkoušet opět na různě velkých trénovacích datech. Nikde není dáno, že právě ''stacklazy'' musí být nejúspěšnější algoritmus na PDT. 
 +  * Odladit ''train.pl'', aby se výsledný soubor ''.mco'' dal rozbalovat. Možná mu vadí pouze ".mco" u volby ''-c''
 +  * Jestli nakonec nějak prorazím, bude potřeba opět učesat obalovací skripty. Mj. jsem přišel na to, že ve tšině svých skriptů používám jako dočasný adresář ''/tmp'' místo Milanem důrazně doporučeného ''/mnt/h/tmp''. Např. na tauri10 jsem tak počmáral 4 GB a proces skončil, protože příslušný svazek byl plný. Tohle by se mj. mělo opravit i u skriptů pro Joshuu a dalších. Jinak jsem taky mohutně čachroval žádostí o příděl paměti na clusteru (týká se i skriptu ''qsub.csh''), s konfigurací Maltu atd. 
 +  * Vyhodnotit to ještě i na e-testu a připsat to na stránku o českém parsingu. 
 +  * Zkusit hlasování pětitisícových kusů.
  
-Vlastní parsing pustíme ze stejného adresáře, parser si zřejmě sám načte natrénovaný model. Z testovacích dat nemusíme odstraňovat případné ruční anotace. Parseru nemusíme říkat, kde leží natrénovaný model, zřejmě tedy ale musíme být ve složce, ve které jsme byli při trénování.+===== Nové výsledky s Malt Parserem 1.7 =====
  
-<code>maltparser -f option.dat -m PARSE -I CONLLTAB -i $CONLL/2006/swedish/etest.conll -O CONLLTAB -o sv.etest.malt.conll +Experimenty probíhaly v&nbsp;červnu 2013Měl jsem dva cíle: 1Natrénovat nové modely, protože ty staré nejsou kompatibilní s novou verzí parseru, a 2získat výsledky na e-testu, protože dosud jsem pracoval jen s d-testemI když jsem novou verzi parseru pouštěl se stejnými parametry jako před třemi lety tu starou, dostal jsem jiné výsledky (nepatrně horší).
-$PARSINGROOT/tools/conll-eval.pl -g $CONLL/swedish/etest.conll -s sv.etest.malt.conll | tee sv.etest.malt.result</code>+
  
-===== Pokusy PDT 2.0 =====+D-test (9270 vět): 
 +LAS 80,04 % 
 +UAS 85,96 % 
 +LAB 86,43 % 
 +Běželo na stroji lucifer5 (Intel Xeon 2394 GHz) s vyhrazenými 30 GB paměti: 
 +learning time (na trénovacích datech) 139 hodin, tj. necelých 6 dní 
 +parsing time 7 hodin (25559301 ms), tj. 1 věta průměrně za 2,76 s
  
-Malt 1.3. Podle Joakima trénování na celém PDT trvá 3 až 5 dní, a to ještě jen při použití splitting triku (bez něj několik týdnů). Trénování SVM má kvadratickou složitost vzhledem k&nbsp;počtu trénovacích íkladů; těch z&nbsp;PDT vypadnou asi milióny.+E-test (10148 vět): 
 +LAS = 79,80 % 
 +UAS = 85,76 % 
 +LAB = 86,24 % 
 +Běželo na stroji hydra1 (AMD Opteron 2518 GHz) s vyhrazenými 30 GB paměti: 
 +learning time (na trénovacích a d-test datech= 221 hodin, tjněco es 9 dní 
 +parsing time = 9 hodin (34135285 ms), tj. 1 věta průměrně za 3,36 s
  
-Trénování na části trénovacích dat (prvních N vět)Testování je vždy na celém dtestutedy 9270 vět.+===== BEST: Malt parser 1.3javová implementace libsvm, splitting trick =====
  
-| N | Délka trénování | Délka parsingu | Rychlost parsingu | Úspěšnost | +Vyžaduje více času a paměti než céčková implementaceale nepadá. Podle dokumentace může dojít i k&nbsp;drobným odchylkám v&nbsp;úspěšnosti způsobeným odlišným zpracováním racionálních čísel. Tato sada pokusů používala splitting trickjinak by trénování v&nbsp;rozumném čase nedoběhlo. Dole mám ještě jednuu které si nejsem jistčím přesně se její nastavení liší. Zdůrazňuje právě splitting trick. Protože rozdíl nemůže tkvět v&nbsp;tomzda vůbec byl splitting trick nasazenbude pravděpodobně v&nbsp;tom, podle jaké hodnoty se dělilo. Předpokládámže tady to byl slovní druh, zatímco tam (jak se tam i říká) poddruh.
-| 1000 | 5 minut | 1 hodina | 2,ty / s | 71,49 % | +
-| 2000 | 24 minut | 5522 s (1,5 hodiny) | 1,7 ty / s | 75,02 % | +
-| 5000 | 4 hod 40 min | 9914 s (2 3/4 hod) | 0,9 věty / s | 77,72 % | +
-| 10000 | 22 hod 05 min | 21865 s (6 hodin) | 0,ty / s | 79,28 % |+
  
-Podívat se na LEMMA místo FORM?+| N | Úloha | Délka trénování | Délka parsingu | Rychlost parsingu | Úspěšnost | Datum | 
 +| 1000 | 1032117 | 2:38 min | 1252 s = 20:52 min | 1 věta / 0,14 s | 74,63 % | 6.4.2010 | 
 +| 2000 | 1032118 | 8:44 min | 2344 s = 39:03 min | 1 věta / 0,25 s | 77,73 % | 6.4.2010 | 
 +| 5000 | 1040063 | 48:07 min | 3956 s = 1:06 h | 1 věta / 0,43 s | 80,18 % | 12.4.2010 | 
 +| 10000 | 1032120 | 3:57 h | 7235 s = 2:01 h | 1 věta / 0,78 s | 82,11 % | 6.4.2010 | 
 +| 20000 | 1032121 | 16:45 h | 12979 s = 3:36 h | 1 věta / 1,40 s | 83,65 % | 6.-7.4.2010 | 
 +| 25000 | 1032122 | 27:43 h | 16500 s = 4:35 h | 1 věta / 1,78 s | 84,24 % | 6.-8.4.2010 | 
 +| 30000 | 1032123 | 47:21 h | 24255 s = 6:44 h | 1 věta / 2,62 s | 84,54 % | 6.-8.4.2010 | 
 +| 35000 | 1035249 | 2 dny 11:08 h | 21468 s = 5:58 h | 1 věta / 2,32 s | 84,89 % | 9.-12.4.2010 | 
 +| 40000 | 1035250 | 3 dny 10 min | 24582 s = 6:50 h | 1 věta / 2,65 s | 85,08 % | 9.-12.4.2010 | 
 +| 45000 | 1035251 | 4 dny 10:53 h | 33744 s = 9:22 h | 1 věta / 3,64 s | 85,35 % | 9.-14.4.2010 | 
 +| 50000 | 1035252 | 5 dní 19:32 h | 37140 s = 10:19 h | 1 věta / 4,01 s | 85,47 % | 9.-15.4.2010 | 
 +| 55000 | 1035258 | 7 dní 8:37 h | 40518 s = 11:15 h | 1 věta / 4,37 s | 85,65 % | 9.-17.4.2010 | 
 +| 60000 | 1035254 | 7 dní 4:55 h | 34374 s = 9:33 h | 1 věta / 3,71 s | 85,80 % | 9.-17.4.2010 | 
 +| 65000 | 1035255 | 5 dní 21:01 h | 31378 s = 8:43 h | 1 věta / 3,38 s | 85,96 % | 9.-15.4.2010 | 
 +| 68563 | 1177906, 1305554 | 10 dní 4:40 h | 46999 s = 13:03 h | 1 věta / 5,07 s | **86,08 %** | 27.4.-14.5.2010 |
  
-Stav trénování Malt Parseru na PDT 2.0, čtvrtek 10.12.2009, 10:00:+===== Trénování větších modelů s céčkovou implementací libsvm padá =====
  
-20000 vět+//Malt Parser 1.3 jsem nedokázal použít s céčkovou implementací libsvm, která má být sice rychlejší, ale mně náhodně padala. Postupně jsem od ní zcela upustil a používám pomalejší, ale bezpečnější Javovou implementaci. Přesto tady zatím nechávám tuhle kapitolu, protože odkrývá některé detaily o Malt Parseru (které by snad mohly platit i v současné verzi).//
  
-orion7: +Chybu hlásí ''sdm0.004.libsvm.mod''což je dílčí model pro hodnotu ''CPOSTAG'' číslo 4. Značky jsou číslovány podle pořadív&nbsp;jakém se v&nbsp;trénovacích datech objevily. Pokud tedy všechny podmnožiny trénovacích dat, které zkouším, začínají na začátku trénovacích dat, mají číslování značek stejné. Číslování je také možné ověřit tak, že rozbalíme model, vznikne stejnojmenná složka, v&nbsp;ní se pak podíváme do souboru ''symboltables.sym'' na část ''CPOSTAG'':
-procesor 64bit Intel Xeon 2 GHz +
-paměť 32 GBale proces zabírá jen 2,2 GB +
-Je to náročné na diskové operace?+
  
-Trénování na 20000 větách už běží 46 hodin (CPU time, ne real time!) a asi ještě dlouho poběží, protože trénování na 10000 větách trvalo 22 hodin (real time) a předtím vždy zdvojnásobení trénovacích dat znamenalo pětiaž desetinásobné nároky na čas.+<code>java -jar ~/nastroje/parsery/malt-1.3/malt.jar -c model -m unpack 
 +cd model 
 +less symboltables.sym</code>
  
----+Až na jednu výjimku trénování spadlo vždy při budování ''sdm0.004.libsvm.mod'' a vždy na větších trénovacích datech. Tento model patří podstatným jménům (přesněji: situacím, kdy na vrcholu zásobníku leží podstatné jméno). Tento model, resp. jeho vstupní data, jsou také zřejmě vždy největší. Není sice asi problém s&nbsp;dostupností operační paměti (''svm-train'' spotřebovává řádově stovky megabajtů, přitom má k dispozici desítky gigabajtů), ale vnitřní struktury libsvm asi na tak velká data nejsou připraveny.
  
-celý treebank (68562 vět)+Joakim navrhuje, abychom zkusili dělení zjemnit, např. místo CPOSTAGu dělit modely podle slovního poddruhu (druhá pozice české značky). Pak by dílčí modely byly menší a libsvm by třeba nespadlo. Ve skutečnosti budu asi muset zjemňovat jiným způsobem, protože právě u podstatných jmen žádné zvláštní dělení na poddruhy neexistuje. Mohly by ale pomoct pády.
  
-sol5: +===== Splitting trick podle slovního poddruhujlibsvm =====
-procesor 64bit dual core AMD Opteron 2 GHz +
-paměť 16 GBale proces zabírá jen 4,1 GB+
  
-Trénování už běží 161 hodin (CPU time), tedy téměř týden.+Snižuje časovou náročnost, zanedbatelně snižuje i úspěšnost. 
 + 
 +| N | Úloha | Délka trénování | Délka parsingu | Rychlost parsingu | Úspěšnost | Datum | 
 +| 1000 | 1177862 | 3:00 min | 1304 s = 21:43 min | 1 věta / 0,14 s | 73,81 % | 27.4.2010 | 
 +| 2000 | 1177863 | 7:32 min | 1715 s = 28:35 min | 1 věta / 0,19 s | 76,98 % | 27.4.2010 | 
 +| 5000 | 1177864 | 42:28 min | 3282 s = 54:42 min | 1 věta / 0,35 s | 79,86 % | 27.4.2010 | 
 +| 10000 | 1177866 | 2:50 h | 5863 s = 1:38 h | 1 věta / 0,63 s | 81,63 % | 27.4.2010 | 
 +| 20000 | 1177867 | 15:52 h | 13877 s = 3:51 h | 1 věta / 1,50 s | 83,28 % | 27.-28.4.2010 | 
 +| 25000 | 1177868 | 21:02 h | 13345 s = 3:42 h | 1 věta / 1,44 s | 83,97 % | 27.-28.4.2010 | 
 +| 30000 | 1177870 | 30:36 h | 15689 s = 4:21 h | 1 věta / 1,69 s | 84,23 % | 27.-28.4.2010 | 
 +| 35000 | 1177871 | 39:04 h | | | | 27.4.2010 | Parsing selhal. | 
 +| 40000 | 1177872 | 2 dny 8 h | 19298 s = 5:22 h | 1 věta / 2,08 s | 84,92 % | 27.-30.4.2010 | 
 +| 45000 | 1177873 | 2 dny 20 h | 21907 s = 6:05 h | 1 věta / 2,36 s | 85,18 % | 27.-30.4.2010 | 
 +| 50000 | 1177875 | 3 dny 14 h | 22805 s = 6:20 h | 1 věta / 2,46 s | 85,37 % | 27.4.-1.5.2010 | 
 +| 55000 | 1177876 | 5 dní | 32512 s = 9:02 h | 1 věta / 3,51 s | 85,57 % | 27.4.-2.5.2010 | 
 +| 60000 | 1177877 | 5 dní 20 h | 27429 s = 7:37 h | 1 věta / 2,96 s | 85,70 % | 27.4.-3.5.2010 | 
 +| 65000 | 1177878 | 6 dní 4 h | 28112 s = 7:48 h | 1 věta / 3,03 s | 85,91 % | 27.4.-3.5.2010 | 
 +| full | 1177879 | 8 dní 7 h | 38957 s = 10:49 h | 1 věta / 4,20 s | 86,02 % | 27.4.-6.5.2010 | 
 + 
 +===== Stackeager, java libsvm, švédské rysy ===== 
 + 
 +| N | Úloha | Délka trénování | Délka parsingu | Rychlost parsingu | Úspěšnost | Datum | Poznámka | 
 +| 1000 | 1473892 | 2:38 min | 1283 s = 21 min | 1 věta / 0,14 s | 74,50 % | 2.6.2010 | | 
 +| 2000 | 1473932 | 7:45 min | 1891 s = 32 min | 1 věta / 0,20 s | 77,47 % | 2.6.2010 | | 
 +| 5000 | 1473933 | 49:08 min | 4178 s = 1:10 h | 1 věta / 0,45 s | 79,98 % | 2.6.2010 | | 
 +| 10000 | 1473934 | 3:33 h | 7534 s = 2:06 h | 1 věta / 0,81 s | 81,93 % | 2.6.2010 | | 
 +| 20000 | 1473956 | 18:09 h | 14095 s = 3:55 h | 1 věta / 1,52 s | 83,47 % | 2.-3.6.2010 | | 
 +| 25000 | 1473957 | 26:12 h | 17299 s = 4:48 h | 1 věta / 1,87 s | 84,01 % | 2.-3.6.2010 | | 
 +| 30000 | 1473958 | 2 dny | 25161 s = 6:59 h | 1 věta / 2,71 s | 84,43 % | 2.-4.6.2010 | | 
 +| 35000 | 1473982 | 42:40 h | 18856 s = 5:14 h | 1 věta / 2,03 s | 84,74 % | 2.-4.6.2010 | | 
 +| 40000 | 1473983 | 3 dny 18 h | 32172 s = 8:56 h | 1 věta / 3,47 s | 85,08 % | 2.-6.6.2010 | | 
 +| 50000 | 1474005 | 4 dny 19 h | 29638 s = 8:14 h | 1 věta / 3,20 s | 85,26 % | 2.-7.6.2010 | | 
 +| 55000 | 1474009 | 7 dní 17 h | 41959 s = 11:39 h | 1 věta / 4,53 s | 85,51 % | 2.-10.6.2010 | | 
 +| 60000 | 1474010 | 9 dní 8 h | 43088 s = 11:58 h | 1 věta / 4,65 s | 85,65 % | 2.-12.6.2010 | | 
 +| 65000 | 1474011 | 7 dní 14 h | 37991 s = 10:33 h | 1 věta / 4,10 s | 85,81 % | 2.-10.6.2010 | | 
 +| full | 1474032 | 8 dní 6 h | 40110 s = 11:09 h | 1 věta / 4,33 s | 85,94 % | 2.-11.6.2010 | | 
 + 
 +===== Stackproj, java libsvm, švédské rysy ===== 
 + 
 +| N | Úloha | Délka trénování | Délka parsingu | Rychlost parsingu | Úspěšnost | Datum | Poznámka | 
 +| 1000 | 1474105 | 2:46 min | | | | 7.6.2010 | Parsing nedoběhl ("The symbol code '-1' cannot be found in the symbol table."
 +| 2000 | 1474106 | 6:53 min | 1810 s = 30 min | 1 věta / 0,19 s | 74,74 % | 7.6.2010 | | 
 +| 5000 | 1474107 | 51:45 min | 3723 s = 1:02 h | 1 věta / 0,40 s | 76,84 % | 7.6.2010 | | 
 +| 10000 | 1474108 | 3:38 h | 6934 s = 1:55 h | 1 věta / 0,75 s | 78,50 % | 7.6.2010 | | 
 +| 20000 | 1474109 | 17:03 h | 13256 s = 3:41 h | 1 věta / 1,43 s | 79,57 % | 7.-8.6.2010 | | 
 +| 25000 | 1474110 | 29:14 h | 15764 s = 4:23 h | 1 věta / 1,70 s | 80,23 % | 7.-8.6.2010 | | 
 +| 30000 | 1474111 | 36:55 h | 18845 s = 5:14 h | 1 věta / 2,03 s | 80,50 % | 7.-9.6.2010 | | 
 +| 35000 | 1474112 | 2 dny 4 h | 20638 s = 5:44 h | 1 věta / 2,23 s | 80,80 % | 7.-9.6.2010 | | 
 +| 40000 | 1474113 | 3 dny 11 h | 30127 s = 8:22 h | 1 věta / 3,25 s | 81,01 % | 7.-11.6.2010 | | 
 +| 45000 | 1474114 | 4 dny 17 h | 33036 s = 9:10 h | 1 věta / 3,56 s | 81,04 % | 7.-12.6.2010 | | 
 +| 50000 | 1474115 | 5 dní 4 h | 35954 s = 9:59 h | 1 věta / 3,88 s | 81,35 % | 7.-13.6.2010 | | 
 +| 55000 | 1474116 | 4 dny 23 h | 30700 s = 8:32 h | 1 věta / 3,31 s | 81,48 % | 7.-12.6.2010 | | 
 +| 60000 | 1474117 | 6 dní 9 h | 32758 s = 9:06 h | 1 věta / 3,53 s | 81,58 % | 7.-14.6.2010 | | 
 +| 65000 | 1474118 | 9 dní 20 h | 44870 s = 12:28 h | 1 věta / 4,84 s | 81,70 % | 7.-17.6.2010 | | 
 +| full | 1474119 | 7 dní 11 h | 36260 s = 10:04 h | 1 věta / 3,91 s | 81,88 % | 7.-15.6.2010 | | 
 + 
 +===== Covproj / covnonproj / nivrestandard / nivreeager, java libsvm, švédské rysy ===== 
 + 
 +Všechny trénovací procesy hlásí "The function cannot be initialized." Mohlo by to být tím, že Marcova definice rysů, kterou se pokouším použít, byla původně určena pro algoritmus ''stacklazy''. Takže se třeba snaží dívat na zásobník, se kterým Covingtonův algoritmus vůbec nepracuje? Žádnou změnou na clusteru ta chyba totiž není, trénink ''stacklazy'' se rozeběhne bez problémů stejně jako dřív.
  

[ Back to the navigation ] [ Back to the content ]