[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

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é:

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í a opakované 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.commandeman.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 jsme úspěšně prošli stavy INITED a PREPARED a nepotřebujeme měnit základní nastavení kroku (zejména hodnoty proměnných), ale krok přesto skončil ve stavu FAILED (např. proto, že došlo místo na disku), můžeme zavolat eman continue, který pracuje v původní složce kroku a pokusí se krok dotáhnout do stavu DONE. Continue pouze znova pustí skript eman.command ve složce kroku. Tento skript můžeme nejdřív podle potřeby upravit, např. zakomentovat řádky, které při předcházejícím pokusu doběhly úspěšně a jejich výsledek už ve složce kroku leží.

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

Parametry clusteru

Pokud Eman běží na clusteru, odesílá zpracování kroků (eman.command) jako clusterové úlohy. V opačném případě se pokouší pouštět místní procesy, které na sebe čekají. Někdy potřebujeme vznést konkrétní požadavky na stroj, na který plánovač clusteru naši úlohu umístí. Zejména jde o požadavky na operační paměť. V Emanovi momentálně nelze nastavit výchozí paměťové požadavky daného typu kroku (šablony). Musíme proto o paměť požádat explicitně pokaždé, když spouštíme konkrétní krok. Např. takto si řekneme o stroj, na kterém je dostupných 20 GB:

eman start danalign --mem 20g

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'

eman select

Když se ptáme na hodnotu proměnné, která obsahuje zvláštní (ale ne tak moc zvláštní) znaky, z nějakého neznámého je musíme obalit uvozovkami a ještě tyto uvozovky zachránit před shellem, aby se dostaly dovnitř do emana. Jinak dotaz nefunguje a eman vrátí dlouhý seznam obsahující nejspíš všechny známé kroky. Např. takhle:

eman select t augment v ACDESC=\"news-commentary-v6.cs-en+europarl-v6.cs-en/en+lcstem4\"

V tomto konkrétním případě bych se také místo hledání hodnoty proměnné mohl spokojit s hledáním kroku podle značky (tagu), ale to zatím eman neumožňuje, alespoň podle manuálových stránek.

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 (a je pak obvykle typu corpus), ale není ani vyloučeno, že korpus bude vedlejším produktem jiné činnosti. (Za zvláštní druh korpusového souboru se v tomto případě považuje i soubor se zarovnáním slov.) 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.

Soubor corpman.info lze také vytvořit pomocí příkazu corpman register. Nástroj corpman je součástí hřiště a umožňuje také vyhledat podle zadaných parametrů (název korpusu, jazyk a faktory) krok emana, ve kterém už je daný korpus vytvořen.

Ondrův návod, jak převzít existující augmented corpus

Dříve se k práci s korpusy používala složka augmented_corpora a nástroj augment.pl. Pokud už v této složce máme připravený korpus se spoustou jazyků a hotových faktorů (např. ve složce augmented_corpora/newstest2010-v6b) a chceme ho zapojit do práce s emanem, lze to zařídit tak, že mu vytvoříme falešný krok emana, který na něj bude odkazovat:

udelej si v playgroundu uplne prazdny adresar s.podvod.12345678.20120229-2355

v nem udelej

echo DONE > eman.status
echo fake > eman.seed
echo fake > eman.command
touch eman.vars
touch eman.deps

a pak v nem vyrob symlinky na vse, co potrebujes, cili treba:

ln -s /net/data/augmented_corpora/newstest2010-v6b/cs.gz ./
ln -s /net/data/augmented_corpora/newstest2010-v6b/de.gz ./
ln -s /net/data/augmented_corpora/newstest2010-v6b/en.gz ./
ln -s /net/data/augmented_corpora/newstest2010-v6b/es.gz ./
ln -s /net/data/augmented_corpora/newstest2010-v6b/fr.gz ./

Nakonec rucne vyrob corpman.info:
cs.gz TAB -1 TAB wmt10v6b TAB cs TAB form|lemma|tag TAB 2489 TAB 0
de.gz TAB -1 TAB wmt10v6b TAB de TAB form|lemma|tag TAB 2489 TAB 0

(DZ: Položky na každém řádku v corpman.info mají následující význam:

  1. Název souboru (cs.gz)
  2. Číslo sloupce v tomto souboru (-1, pokud v souboru nerozlišujeme sloupce)
  3. Název korpusu (wmt10v6b)
  4. Kód jazyka (cs); může zahrnovat i identifikaci dalšího zpracování (csNm), protože platí, že všechny soubory jednoho korpusu mají stejný počet řádků a všechny soubory jednoho korpusu a jazyka mají stejný počet tokenů.
  5. Názvy a pořadí faktorů, ze kterých se skládá každý token (form|lemma|tag)
  6. Počet řádků souboru (2489)
  7. Informace, zda je tento korpus automaticky odvozen z jiného korpusu (0 nebo 1))

Pak dej ./corpman reindex
A pak over, ze to funguje:

./corpman wmt10v6b/cs+stc
# vypise asi dva kroky, kterymi to samo vyrobi stc.

Kdybys chtel pouzit i sve stc, muzes ho taky symlinknout a pridat radek:
cs-stc.gz TAB -1 TAB wmt10v6b TAB cs TAB stc TAB 2489 TAB 0

ln -s /net/data/augmented_corpora/newstest2010-v6b/cs.factors/stc.gz cs-stc.gz
ln -s /net/data/augmented_corpora/newstest2010-v6b/de.factors/stc.gz de-stc.gz
ln -s /net/data/augmented_corpora/newstest2010-v6b/en.factors/stc.gz en-stc.gz
ln -s /net/data/augmented_corpora/newstest2010-v6b/es.factors/stc.gz es-stc.gz
ln -s /net/data/augmented_corpora/newstest2010-v6b/fr.factors/stc.gz fr-stc.gz

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