This is an old revision of the document!
Table of Contents
Eman
Ondrův e-mail z 4.2.2011:
musim se pochlubit, ze (az na jeste par much) mam ukazku pouziti emana pro preklad i pro ty, kdo to jeste vubec nezkouseli:
svn co https://svn.ms.mff.cuni.cz/svn/statmt/trunk statmt cd statmt/playground # podivejte se na README export PATH=$PATH:$(pwd)/../scripts eman init binaries # to jen proto, abyste mohla potvrdit certifikat sourceforge # a pak uz podle readme spustit mikropokus SKIP_IRSTLM=yes eman clone --start < eman.samples/cs-en-mini.traceback
Prikaz:
eman –man
ukaze manualovou stranku
Tvorba šablon (nové druhy kroků, seeds)
Jako příklad viz eman.seeds/lm. Toto je šablona na všechny kroky, které vytvářejí jazykové modely. Povinně vyžaduje nastavit tyto vstupní proměnné:
- BINARIES: odkaz na krok, ve kterém byly zkompilovány externí nástroje, např. SRILM. Spustitelné binární soubory leží zřejmě přímo ve složce tohoto kroku jako výstupní soubor.
- CORP: zkrácený název trénovacího korpusu. I jednotlivým korpusům odpovídají kroky, které vyrábějí či zpřístupňují dotyčné datové soubory. Na to slouží mj. nový skript
makecorp.pl
(nebo tak nějak), který částečně přebírá práci staršíhoaugment.pl
. - CORPAUG: faktory dotyčného korpusu, které se mají použít pro trénování.
- ORDER: řád modelu (např. 3 pro trigram).
Volitelně lze nastavit i další vstupní proměnné.
Konstruktor (skript eman.seeds/lm
) vytvoří soubor eman.tag
, obsahující stručnou jednořádkovou charakteristiku kroku (v tomto případě zejména charakteristiku korpusu, ze kterého byl jazykový model vyroben).
Dále vytvoří soubor eman.vars
, kam opíše všechny vstupní proměnné a jejich hodnoty ve formě přiřazení (tj. sourcnutí tohoto souboru umožní kdykoli zrekonstruovat příslušnou část prostředí).
Dále vytvoří soubor eman.deps
, kde jsou názvy kroků, na kterých tento krok závisí, tj. dotyčné kroky musí úspěšně skončit ještě před spuštěním tohoto kroku. V případě jazykového modelu je závislost pouze na BINARIES (proč ne taky na trénovacím korpusu?) Pro korpus se v tomto případě sahá přímo do augmented_corpora
– že by zastaralé použití? Pokud je seed skript puštěn v přípravném režimu a dotyčný korpus v augmented_corpora
nevidí, skončí chybou.
Teprve v přípravném režimu se také vyrobí hlavní skript eman.command
, který bude na clusteru vykonávat hlavní činnost kroku.
Založení nového kroku podle šablony
Použijeme příkaz eman init
. Typicky musíme předat nějaké vstupní parametry prostřednictvím proměnných prostředí. Můžeme samozřejmě nejdřív nastavit prostředí a pak zavolat eman init
, ale v bashové syntaxi můžeme také rovnou předřadit přiřazení do proměnných před příkaz, např. takhle vytvoříme nový krok typu dandata
pro jazykový pár en-cs (na všechny operace s emanem se musíme nacházet na hřišti):
cd $STATMT/playground SRC=en TGT=cs eman init dandata
Spuštění kroku
Spuštění kroku znamená, že se vygeneruje jeho skript (pustí se eman.seed
a z něj vypadne eman.command
) a odešle se jako úloha na cluster. Provádí se pomocí eman start
, např.
eman start dandata
(V tomto případě ovšem předpokládáme, že na hřišti leží jen jeden krok typu dandata
. Eman ho pak dokáže identifikovat.)
Kroky, které už byly spuštěny v minulosti a skončily úspěšně (jsou ve stavu DONE
), se fyzicky znova nespustí. Předpokládá se, že by výsledek byl stejný jako ten, který už leží nebo má ležet ve složce kroku. Jestliže chceme vynutit přepočítání kroku (třeba teprve ladíme způsob, jakým se krok počítá), musíme nejdříve ručně změnit stav na INITED
nebo PREPARED
. (Ale pozor, pokud teprve ladíme šablonu (seed) kroku, musíme zajistit, aby se nová šablona okopírovala jako eman.seed
do daného kroku. Taky potom musíme nastavit stav INITED
, nikoli PREPARED
, aby se přegeneroval eman.command
z eman.seed
. Možná by pak bylo jednodušší inicializovat nový krok podle aktuální šablony a ten starý časem vyhodit.)
cat s.dandata.038e9f18.20120118-2212/eman.status DONE echo INITED > s.dandata.038e9f18.20120118-2212/eman.status cp eman.seeds/dandata s.dandata.038e9f18.20120118-2212/eman.seed eman start dandata Executing: eval $(cat eman.vars) EMAN_READONLY=yes ./eman.seed Step s.dandata.038e9f18.20120118-2212 prepared. Executing: ( qsub -C '' -N s.dandata.038e9f18.20120118-2212 -o log.o\$JOB_ID -hard -j y -cwd -S /bin/bash -p -100 ./eman.command 2>&1 ) > log Step s.dandata.038e9f18.20120118-2212 submitted as job 2160759
Druhou možností je příkaz eman redo
. Ten ale vyrobí kopii stávajícího kroku a tu spustí. Jestliže předcházející běh kroku neskončil úspěšně (je ve stavu FAILED
), můžeme zkusit eman continue
, který pracuje v původní složce kroku a pokusí se krok dotáhnout do stavu DONE
.
Spuštění mnoha příbuzných kroků najednou
Řada emanových příkazů, zejména těch pro vypisování informací, je schopná operovat nad všemi kroky daného typu najednou. Např. takhle si vypíšeme proměnné všech kroků typu dandata
a jejich stav:
zeman@lrc1:~/projekty/statmt/playground$ eman vars dandata s.dandata.e91dcaed.20120119-0921 SRC=en TGT=fr s.dandata.eb2b73f5.20120119-0921 SRC=en TGT=es s.dandata.4bd447c7.20120119-0921 SRC=en TGT=de s.dandata.886c6804.20120119-0921 SRC=fr TGT=en s.dandata.038e9f18.20120118-2212 SRC=en TGT=cs s.dandata.18e4135a.20120119-0921 SRC=es TGT=en s.dandata.68958d57.20120119-0921 SRC=de TGT=en s.dandata.640d0845.20120119-0921 SRC=cs TGT=en zeman@lrc1:~/projekty/statmt/playground$ eman status dandata s.dandata.e91dcaed.20120119-0921 INITED s.dandata.eb2b73f5.20120119-0921 INITED s.dandata.4bd447c7.20120119-0921 INITED s.dandata.886c6804.20120119-0921 INITED s.dandata.038e9f18.20120118-2212 RUNNING s.dandata.18e4135a.20120119-0921 INITED s.dandata.68958d57.20120119-0921 INITED s.dandata.640d0845.20120119-0921 INITED
Tento přístup ale není možné použít ke spuštění všech kroků daného typu, které ještě nejsou ve stavu DONE
. eman start
chce vždy spustit právě jeden krok, a pokud ho na základě pouhého určení typu nedokáže jednoznačně určit, odmítne pokračovat:
zeman@lrc1:~/projekty/statmt/playground$ eman start dandata Ambiguous in dir listing: dandata: s.dandata.038e9f18.20120118-2212 s.dandata.18e4135a.20120119-0921 s.dandata.4bd447c7.20120119-0921 s.dandata.640d0845.20120119-0921 s.dandata.68958d57.20120119-0921 s.dandata.886c6804.20120119-0921 s.dandata.e91dcaed.20120119-0921 s.dandata.eb2b73f5.20120119-0921
Nejde dokonce ani zavolat eman start
s několika jednoznačně určenými kroky. Pustí se totiž jen ten první z nich:
zeman@lrc1:~/projekty/statmt/playground$ eman start `eman select t dandata s INITED` Executing: eval $(cat eman.vars) EMAN_READONLY=yes ./eman.seed Step s.dandata.e91dcaed.20120119-0921 prepared. Executing: ( qsub -C '' -N s.dandata.e91dcaed.20120119-0921 -o log.o\$JOB_ID -hard -j y -cwd -S /bin/bash -p -100 ./eman.command 2>&1 ) > log Step s.dandata.e91dcaed.20120119-0921 submitted as job 2160762
Proto použijeme řídící struktury bashe:
for sl in en cs de es fr; do for tl in en cs de es fr; do if [ $sl == en ] && [ $tl != en ] || [ $sl != en ] && [ $tl == en ] ; then SRC=$sl TGT=$tl eman init dandata --start; fi done; done
nebo:
for step in `eman ls dandata`; do eman start $step; done
Navazování kroků
Typický experiment se skládá z několika kroků. Některé mohou probíhat paralelně, jiné na sobě závisí, takže jeden lze spustit až po úspěšném dokončení druhého. Emanovi je pochopitelně potřeba říct, že krok závisí na jiném kroku. Dělá se to tak, že mezi povinné vstupní proměnné v šabloně kroku zavedeme proměnnou, jejíž hodnota je jméno konkrétního jiného kroku. Rovnou při zavádění proměnné ji označíme za proměnnou typu reqstep
a eman zařídí vše potřebné (mimo jiné zapíše jméno požadovaného kroku do souboru eman.deps
ve složce nově zakládaného kroku). Eman nám také může poskytnout absolutní cestu do kroku, na kterém závisíme, abychom mohli k jeho výstupním souborům přistupovat i ze skriptu, který odesíláme na cluster. Do šablony (seedu) můžeme dát např. tohle:
eman defvar DATASTEP type=reqstep help='where are trainal.$SRC.gz and trainal.$TGT.gz' # convert the dependencies to absolute paths DATASTEPDIR=`eman path $DATASTEP`
Podle šablony pak můžeme vytvořit instanci nového kroku, která bude záviset na konkrétně vybrané instanci předchozího kroku. Např. v následujícím příkladu navazujeme nově zakládaný krok typu danalign
na existující krok typu dandata
, přičemž ze všech existujících kroků typu dandata
si vybereme ten, který má proměnnou SRC
nastavenou na en
a proměnnou TGT
nastavenou na cs
:
DATASTEP=`eman select t dandata v SRC=en v TGT=cs` eman init danalign
Kromě výstupních souborů můžeme chtít zdědit také hodnoty proměnných předcházejícího kroku, třeba právě kódy jazyků SRC
a TGT
. Do šablony nového kroku tedy připíšeme tohle:
eman \ defvar SRC inherit=DATASTEP help='source language code' \ defvar TGT inherit=DATASTEP help='target language code'
Korpusové kroky
Některé kroky připravují části korpusů, které jsou pro experiment potřeba. Takový krok asi typicky bude přímo zasvěcen přípravě korpusu, ale není ani vyloučeno, že korpus bude vedlejším produktem jiné činnosti. Každopádně pokud je výsledkem nebo jedním z výsledků kroku korpus, je vhodné ve složce daného kroku založit soubor corpman.info
, který popisuje, jaký korpus nám to tady vznikl. Skript pro tvorbu korpusů ho potom může využít při tvorbě kombinovaných korpusů, jiných faktorů apod.
Sestavování experimentu jako posloupnosti kroků
Pokusit se alespoň zpočátku využít existující kroky pro alignment, jazkový model apod. a nekonvertovat ty svoje. Vytvořit nějakou šablonu joshua
, která jednou bude instalovat Joshuu, ale v tuto chvíli pouze vyrobí symlinky na moji existující instalaci. Potom určitě budu potřebovat alespoň tyto kroky:
- binarizace korpusu a alignmentu
- extrakce gramatiky pro vývojová i testovací data (jeden, nebo dva různé kroky?); analogicky ke kroku
tm
, který vyrábí frázovou tabulku pro Mosese, by se tento krok mohl jmenovat třebajoshtm
. - volání dekodéru Joshuy (
translate
?) s příslušnými modely a konfiguračním souborem s vahami - asi i nějaká úprava mertu, byť současný eman už samozřejmě obsahuje konfiguraci mertu pro Mosese