ELTE-DH / NoSketch-Engine-Docker

A NoSketch Engine Docker image which is easy to use
GNU Lesser General Public License v3.0
16 stars 9 forks source link

Indexed alkönyvtárak eltávolítása compile újbóli futtatása előtt #7

Closed gpetho closed 2 years ago

gpetho commented 2 years ago

@sassbalint kérte, hogy jelezzem az alábbi problémát, és javasoljak rá megoldást.

Probléma: Ha egy korpusz az utasításoknak megfelelően le lett fordítva make compile-lal, utána a felhasználó módosítja akár a korpusz konfigurációs fájlját, akár a vertical fájlt, a felhasználó azt várná, hogy a make compile újbóli futtatása újragenerálja simán a korpusz indexét. Ezzel szemben nem ez történik, hanem ha már kész indexszel rendelkező korpuszra futtatjuk újból a make compile-t úgy, hogy közben változtattunk akár a konfiguráción, akár a korpuszon magán, akkor az vagy leáll egy semmitmondó hibaüzenettel, vagy hibaüzenet nélkül lefut ugyan, de nem frissíti a korpuszt.

A hiba a következőképpen reprodukálható a legegyszerűbben:

  1. Kiindulunk a frissen klónozott repóból.
  2. Módosítjuk a corpora/registry/emagyardemo fájlt úgy, hogy eltávolítjuk az utolsó sort (STRUCTURE s), mert elfelejtettük beletenni, amikor összeállítottuk a korpuszunkat.
  3. make compile
  4. Észrevesszük, hogy kifelejtettük a STRUCTURE s sort, beletesszük (azaz visszatesszük) a konfigurációs fájlba.
  5. make compile megszakad az alábbi hibaüzenettel:

    ...
    Checking corpus /corpora/registry/emagyardemo:
    * registry file
    WARNING: the number of distinct values of doc.wordcount is 1
    ERROR: Structure s not compiled
    
    * lexicon queries
    * dynamic attributes
    * word sketches
    * wordcount
    * sizes
    * structure sanity
    <---
    ERROR: line 926 - command 'corpcheck $CORPUS' exited with status: 1
    ... Error at ::main::main called at line 939
    ...

Javasolt megoldás: A make compile távolítsa el a már létező corpora/*/indexed alkönyvtárakat.

dlazesz commented 2 years ago

Probléma: Ha egy korpusz az utasításoknak megfelelően le lett fordítva make compile-lal, utána a felhasználó módosítja akár a korpusz konfigurációs fájlját, akár a vertical fájlt, a felhasználó azt várná, hogy a make compile újbóli futtatása újragenerálja simán a korpusz indexét. Ezzel szemben nem ez történik, hanem ha már kész indexszel rendelkező korpuszra futtatjuk újból a make compile-t úgy, hogy közben változtattunk akár a konfiguráción, akár a korpuszon magán, akkor az vagy leáll egy semmitmondó hibaüzenettel, vagy hibaüzenet nélkül lefut ugyan, de nem frissíti a korpuszt.

Ezzel egyetértek, hogy nem jó így. Köszi, hogy szóltatok!

Javasolt megoldás: A make compile távolítsa el a már létező corpora/*/indexed alkönyvtárakat.

Ezzel már nem értek egyet.

A következő esetet szeretném ha működne:

A jelenlegi megoldás, minden indexet törölni fog, ami nem jó.

Tehát, az elvárás (mint az rm parancs):

Paraméterek:

Működés:

  1. Ha egy/több/összes korpusz le van kompillálva és újra akarjuk kompillálni, akkor adjon warningot és skippelje vagy kérdezzen rá, hogy "törölheti előtte az adott korpuszt?" (Explicit "-f kapcsoló" hiányában)
  2. Ha explicit forceolni akarjuk az újrakompillálást ("-f kapcsoló") egy/több/összes korpuszra, akkor szó nélkül törölheti a célkorpuszok indexeit és kompillálhat.

Mindezt a compile.sh-n belül, nem a Makefileban. Ha a feldolgozás bármely pontján nincs 0-ás exit code, akkor ott álljon meg hibával.

Ha ezt tudod ebbe a branchbe implementálni, akkor elfogadom. Ha nem, akkor ezt a PR-t lezárom nyitok egy issue-t és valamikor, amikor lesz időm, megcsinálom.

sassbalint commented 2 years ago

(A compilecorp-nak van --recompile-corpus opciója, ami itt kellhet. Vö: make execute CMD="compilecorp --recompile-corpus --no-ske CORPUS_REGISTRY_FILE".)

dlazesz commented 2 years ago

Két kérdés:

  1. A --recompile-corpus gyorsabb mint a sima kompillálás?
  2. Ha nem volt előzőleg lekompillálva, akkor mi történik a --recompile-corpus-nál? (Ha attól még lekompillálja, akkor az fél siker, ha hibát dob, az kár.)
gpetho commented 2 years ago

Értem, hogy mi zavar az általam javasolt megoldásban, de pontosan az általad leírt esetről:

A következő esetet szeretném ha működne:

* Van egy nagy korpuszom, amit jó sok óra alatt lekompilláltam.

* Vannak más korpuszok, amiket lekompilláltam.

* A más korpuszok egyikén módosítottam, szeretném újrakompillálni.

* Nem akarom a jó sok óra alatt újrakompillált nem módosult korpuszt törölni és újrakompillálni.

* Nem akarom, hogy hibás állapot legyen, mert ott vannak az indexek, ahol újra akarjuk kompillálni a korpuszt.

szól a README.md-ben a make compile alatti alpont, amit módosítottam a leírt problémának megfelelően ebben a pull requestben így (nem tudom, hogy ezt olvastad-e):

  1. Compile all corpora listed in corpora/registry directory using the docker image: make compile
    • To compile one corpus at a time, use the following command: make execute CMD="compilecorp --no-ske CORPUS_REGISTRY_FILE"
    • If you want to recompile a single corpus after either the configuration or the vertical files of that corpus have been modified, the root-owned indexed subdirectory that was generated in the course of the previous compilation should be removed before recompilation, e.g. sudo rm -r corpora/susanne/indexed/. (This is done automatically for all corpora by make compile.) If this subdirectory is not removed, the compilation will likely fail with an unhelpful error message, or the index will not be generated as expected.

Tehát ha a dokumentációnak megfelelően jár el a felhasználó, akkor szerintem nem léphet fel az a probléma, amit leírsz.

Igazából az egész történetben a lényeg az, hogy a felhasználó tudjon egyáltalán arról, amit az "If this subdirectory is not removed..." kezdetű mondatban írok, mert ez a jelenlegi dokumentációból egyszerűen nem derül ki, és az ember alapból nem számít rá, hogy erre szükség van. Az, hogy a make compile töröl-e bármit vagy nem, az szerintem nagyjából mindegy, a "biztonság kedvéért töröljünk mindent" egyszerűen az idiótabiztos megoldás. Minden más (ellenőrzés, figyelmeztetés, -f) igazából kényelmi funkció, ami persze nem baj, ha ott van, de a lényegen nem változtat.

dlazesz commented 2 years ago

Tehát ha a dokumentációnak megfelelően jár el a felhasználó

Bocs, ennél én paranoiásabb vagyok. :) Kell még biztosíték.

Ez a sor 1:1 ellentmond az én elvárásomnak.

ez a jelenlegi dokumentációból egyszerűen nem derül ki, és az ember alapból nem számít rá, hogy erre szükség van.

Ez külön hiba. A dokumentációé. Ezt javítani kell. Ebben egyetértünk.

Az, hogy a make compile töröl-e bármit vagy nem, az szerintem nagyjából mindegy, a "biztonság kedvéért töröljünk mindent" egyszerűen az idiótabiztos megoldás.

Én overkillnek érzem a dolgot. Ha rá tudna kérdezni a törlés előtt, akkor az olcsóbb, mint újrakompillálni egy korpuszt tévedés esetén. Valamint a recompile vs. törlés kérdéskörben a recompile pártján állok. Főleg ha gyorsabb a recompile mint a sima.

Az is egy álláspont, hogy a compile simán hibát dob, ha nem tiszta a corpora mappa. A custom dolgokat meg execute-tal oldja meg, aki akarja. Még az is belefér nekem, hogy mindent legyalul a corpora mappában a compile, de előtte kérdezzen rá, hogy tényleg ezt akarod? (Én inkább olyan esetet tudok elképzelni, ahol valószínűleg nem.) A "módosítottam egy korpuszon"-ra meg ott az execute+recompile, nem?

gpetho commented 2 years ago

Dolgozom rajta.

Addig is:

Valamint a recompile vs. törlés kérdéskörben a recompile pártján állok. Főleg ha gyorsabb a recompile mint a sima.

A te repód, a te döntésed, de ha engem kérdezel, a recompile csak akkor jobb, mint az explicit és átlátható törlés és compile, ha gyorsabb. A törlés ugyanis sudót kér, és ha átírjuk úgy, hogy sudo rm -vr $(wildcard corpora/*/indexed/), akkor fel is sorolja, hogy mit akar törölni. Szerintem nem életszerű, hogy erre a felhasználó úgy írja be az adminjelszót, hogy igazából nem akarta volna törölni. Én amikor belefutottam ebbe a problémába, éppen azért meg sem próbálkoztam az indexed törlésével, mert írásvédett volt, és ezt csak akkor léptem meg, amikor sehogy máshogy nem sikerült megszabadulni a hibaüzenetektől. (A recompile kapcsolókat nem sikerült akkor megtalálnom a dokumentációban.) Ezzel szemben ugyanakkor a dockerben futtatáshoz, ezen belül a recompile-hoz sudo sem kell az alapértelmezett beállítások szerint. Erre szerintem érdemes gondolni mint szempontra.

Ez a sor 1:1 ellentmond az én elvárásomnak.

Értem, rendben, kiveszem, bár lásd az előző észrevételt.

A "módosítottam egy korpuszon"-ra meg ott az execute+recompile, nem?

Persze, ott lenne, ha lenne, de jelenleg nincs. Execute van csak recompile nélkül, ami nem csinál semmit, ha már megvan az index. Berakok egy figyelmeztetést a compile-ba és egy külön recompile célt a Makefile-ba.

gpetho commented 2 years ago

Teszteltem egy 10 millió tokenes korpuszon.

A --recompile-corpus gyorsabb mint a sima kompillálás?

Nem, pontosan ugyanannyi idő alatt fut le.

Ha nem volt előzőleg lekompillálva, akkor mi történik a --recompile-corpus-nál? (Ha attól még lekompillálja, akkor az fél siker, ha hibát dob, az kár.)

Ahogy az előző alapján várható is, nincs hiba, de még üzenet sem. Simán lefut.

gpetho commented 2 years ago

Módosítottam a pull requestet úgy, hogy azt csinálja, amiről szó volt.

Makefile

dokumentáció

Mindkét szabály megerősítést kér a felhasználótól ennek a megoldását innen vettem: https://stackoverflow.com/questions/47837071/making-make-clean-ask-for-confirmation. Ez csak y válaszra megy tovább, bármi másra hibaüzenettel (make: *** [Makefile:73: recompile] Error 1 stb.) megszakad. Szebb lenne hibaüzenet nélkül, de ahhoz nem vagyok elég ügyes, hogy ezt megoldjam. Említetted, hogy jó lenne egy force kapcsoló arra, hogy ne kérdezzen, ha nem szeretnénk. Erre sincs jó ötletetem, hogy ezt hogy lehetne technikailag jól megcsinálni, ezért ezt kihagytam.

dlazesz commented 2 years ago

Teszteltem egy 10 millió tokenes korpuszon.

A --recompile-corpus gyorsabb mint a sima kompillálás?

Nem, pontosan ugyanannyi idő alatt fut le.

Megnéztem és a compilecorp-ban (ami egy shell script) pontosan abban különbözik a --recompile-copus -szal és nélküli futtatás, hogy törli-e a megfelelő index fájlokat előzőleg vagy nem.

Olykor nem árt a forráskódot is megnézni, ha már nyílt forrású a program. Ez pl. fényt derít arra, hogy nézi a program az index fájlok utolsó módosítását és warningot ad, ha úgy látja, hogy régebbiek, mint a forrás vertical fájlok. Mivel a docker UTC időben fut valószínűleg nem fogja észrevenni a magyar idő szerinti változást.

Ha mégis észrevenné, akkor a --recompile-copus opció használatát javasolná. Tehát azt gondolom, hogy

  1. A compile.sh-n belül legyen default a --recompile-corpus, mert ártani nem árt, de legalább megold egy sor nem kezelt problémát.
  2. A compile.sh-n belül vizsgálja meg, hogy van-e kompillált korpusz, ha van akkor szóljon, hogy mindent újra fog kompillálni igen/nem? És hogy az egyes korpuszok kompillálásához pedig milyen parancsot kell hasznáni. Ezen kívül legyen egy FORCE_RECOMPILE változó, ami ha létezik és nem üres, akkor az egyenlő az igen válsszal. (Így a Makefile-on nem kell változtatni.)

Ami a README.md-t illeti:

Az execute pontosítást köszönöm! A make recompile helyett maradjon a mostani módszer. Esetleg említsd meg a --recompile-corpus opciót. A FORCE_RECOMPILE-t vezesd be Bálint táblázatába, kérlek.

dlazesz commented 2 years ago

Megj.: Ha ragaszkodsz a sed-hez, akkor: sed 's#^corpora/\([^/]*\)/indexed/$#\1#'

A && read ans && [ $${ans:-N} = y ] szép találat! :)

gpetho commented 2 years ago

Tehát azt gondolom, hogy

  1. A compile.sh-n belül legyen default a --recompile-corpus, mert ártani nem árt, de legalább megold egy sor nem kezelt problémát.

  2. A compile.sh-n belül vizsgálja meg, hogy van-e kompillált korpusz, ha van akkor szóljon, hogy mindent újra fog kompillálni igen/nem? És hogy az egyes korpuszok kompillálásához pedig milyen parancsot kell hasznáni. Ezen kívül legyen egy FORCE_RECOMPILE változó, ami ha létezik és nem üres, akkor az egyenlő az igen válsszal. (Így a Makefile-on nem kell változtatni.)

Ami a README.md-t illeti:

Az execute pontosítást köszönöm! A make recompile helyett maradjon a mostani módszer. Esetleg említsd meg a --recompile-corpus opciót. A FORCE_RECOMPILE-t vezesd be Bálint táblázatába, kérlek.

Igen, ez ésszerű megoldásnak tűnik.

Az én feladatom az volt, hogy jelezzem a problémát; az fakultatív volt, hogy meg is oldjam. Biztos tanulságos lenne átírni így a compile.sh-t, de ezzel most nincs kedvem több időt tölteni, tehát utasítsd el nyugodtan azokat a részeit a pull requestnek, amiket visszalépésként ítélsz meg a korábbihoz képest, és zárd le így. Ha valamikor unatkozom, és addig nem csinálja meg más, akkor visszatérek majd rá.

Az egészben az egyetlen lényeges pont számomra továbbra is az, hogy a dokumentáció szóljon, hogy a compile nem működik már lefordított korpuszra. Ha ez megvan, én alapvetően boldog vagyok.