Riprende la guida su Sumatra, il tool per la gestione degli esperimenti software, molto utile a mio avviso per tenere traccia di tutte le prove sugli iperparametri durante il Machine Learning training. Dopo aver visto come inizializzare il progetto e i comandi di base, passiamo a quelli meno comuni, ma molto utili in certe situazioni.
Confronto tra esperimenti
Un comando che diventa molto utile con il passare del tempo è diff. Come suggerisce il nome, permette di confrontare due esperimenti in modo da comprenderne i dettagli istantaneamente. La versione più utile è quella con l’opzione long, che permette di vedere il contenuto degli attributi diversi (in particolare i valori dei parametri).
smt diff -l 20190316-114323 20190314-110210
Parameter differences:
20190316-114323:
{'training': {'alpha': 0.1}}
20190314-110210:
{'training': {'alpha': 0.001}}
Output data differences:
Generated by 20190316-114323:
20190316-114323/config.yaml(e2b66dbbd18f76f794394eb4781eb67b067e220e [2019-03-16 11:43:25])
Generated by 20190314-110210:
20190314-110210/config.yaml(0d12b913ed2c95e1630a3b6866c24e89ebe4d995 [2019-03-14 11:02:12])
Spostare il progetto
Durante lo sviluppo di un progetto, specialmente nelle prime fasi, capita spesso di voler rinominare le directory o di spostare l’intero progetto in un’altra alberatura del file system. In questo caso si possono anche migrare i dati di Sumatra. Per prima cosa bisogna assicurarsi che la cartella “.smt” venga copiata.
cp -R SumatraTemplate NewTemplate
cd NewTemplate/
smt info
Project name : SumatraTemplate
Default executable : Python (version: 3.6.7) at /home/omar/.virtualenvs/cv/bin/python
Default repository : GitRepository at /home/omar/Documents/github/SumatraTemplate (upstream: https://github.com/ognibit/SumatraTemplate.git)
Default main file : main.py
Default launch mode : serial
Data store (output) : /home/omar/Documents/github/SumatraTemplate/Data (archiving to ./archive)
. (input) : /
Record store : Django (/home/omar/Documents/github/SumatraTemplate/.smt/records)
Code change policy : error
Append label to : None
Label generator : timestamp
Timestamp format : %Y%m%d-%H%M%S
Plug-ins : []
Sumatra version : 0.7.4
Il comando info rivela che i path di riferimento sono ancora quelli vecchi e qualsiasi comando Sumatra che andremo ad eseguire userà quei riferimenti, creando un casino. Per correggere i path all’interno del record store spostato si usa il comando migrate mentre per configurare i nuovi path per i successivi esperimenti si deve usare configure.
smt configure --store .smt/records --repository . --datapath Data
smt info
Project name : SumatraTemplate
Default executable : Python (version: 3.6.7) at /home/omar/.virtualenvs/cv/bin/python
Default repository : GitRepository at /home/omar/Documents/github/NewTemplate (upstream: https://github.com/ognibit/SumatraTemplate.git)
Default main file : main.py
Default launch mode : serial
Data store (output) : /home/omar/Documents/github/NewTemplate/Data (archiving to ./archive)
. (input) : /
Record store : Django (.smt/records)
Code change policy : error
Append label to : None
Label generator : timestamp
Timestamp format : %Y%m%d-%H%M%S
Plug-ins : []
Sumatra version : 0.7.4
smt migrate --datapath ./Data --archive ./archive
Qualora in uno dei due progetti, ad esempio il primo (SumatraTemplate), fosse stato eseguito qualche altro test, si possono allineare i due repository con il comando sync.
SumatraTemplate$ smt run --label "new_template" conf/default.yaml
smt list
new_template
20190316-114323
20190314-110210
20190314-110152
20190313-114839
20190313-114809
20190313-114127
20190313-113826
20190311-115837
cd ../NewTemplate
smt list
20190316-114323
20190314-110210
20190314-110152
20190313-114839
20190313-114809
20190313-114127
20190313-113826
20190311-115837
smt sync ../SumatraTemplate/.smt/records
smt list
new_template
20190316-114323
20190314-110210
20190314-110152
20190313-114839
20190313-114809
20190313-114127
20190313-113826
20190311-115837
In questo modo i due repository sono allineati, ma non gli archivi! Se vi interessa avere una copia perfetta ricordatevi anche di copiare o sincronizzare la cartella archive. In questo caso un comando classico come rsync è quello che fa al caso vostro.
Esportare i risultati
In Sumatra esiste un comando export e serve unicamente per fare il dump del repository e delle configurazioni in formato JSON. Lo scopo per cui è pensato riguarda essenzialmente l’upgrade ad una nuova versione di Sumatra che qui non tratteremo. Di seguito vedremo, infatti, le possibilità di esportazione dei log ai fini di reportistica e documentazione. Sumatra mette a disposizione dei template per formattare l’output del comando list:
- text
- html
- json
- latex
C’è un’altra modalità, che non rientra tra i template, che è table. Può essere molto comoda in quanto stampa tutti gli attributi dell’esperimento in una sola riga, in formato tabella ASCII.
smt list --table | cut -d'|' -f 2,3,4,5,6
Label | Timestamp | Reason | Outcome | Duration
new_template | 2019-03-22 14:09:06. | | | 0.07936573028564453
20190316-114323 | 2019-03-16 11:43:23. | Repeat experiment al | The new record exact | 0.08548092842102051
20190314-110210 | 2019-03-14 11:02:10. | Smallest learning ra | Underfitting | 0.10014796257019043
20190314-110152 | 2019-03-14 11:01:52. | Smallest learning ra | | 0.09593057632446289
20190313-114839 | 2019-03-13 11:48:39. | | | 0.08293509483337402
20190313-114809 | 2019-03-13 11:48:09. | | | 0.08261561393737793
20190313-114127 | 2019-03-13 11:41:27. | | | 0.09407329559326172
20190313-113826 | 2019-03-13 11:38:26. | | | 0.08511042594909668
20190311-115837 | 2019-03-11 11:58:37. | | | 0.08286452293395996
Esportare i risultati – Text
Si tratta della modalità di default che abbiamo usato finora. Impostarla non varia l’output a cui siamo abbituati.
smt list --format text
new_template
20190316-114323
20190314-110210
20190314-110152
20190313-114839
20190313-114809
20190313-114127
20190313-113826
20190311-115837
Esportare i risultati – Html
La modalità HTML è molto basilare e formatta i dati usando l’elenco puntato per quanto riguarda il list normale e la formattazione con “description list” per quella long.
smt list --format html
<ul>
<li>new_template</li>
<li>20190316-114323</li>
<li>20190314-110210</li>
<li>20190314-110152</li>
<li>20190313-114839</li>
<li>20190313-114809</li>
<li>20190313-114127</li>
<li>20190313-113826</li>
<li>20190311-115837</li>
</ul>
Esportare i risultati – JSON
La formattazione in JSON non varia nella versione long perchè lo è già di default. Il risultato è completo di tutto e probabilmente è la tipologia di export più flessibile. Non riporto tutto il risultato per ragioni di spazio.
smt list --format json > my_project.json
Esportare i risultati – LaTex
In alcuni contesti può tornare molto utile, in genere per generare un pdf pronto da archiviare con il resto della documentazione come allegato. In altri casi può servire per avere un brano di codice LaTex da inserire direttamente nel documento che si sta preparando.
L’output non cambia dalla versione normale di list da quella long.
smt list --format latex > /tmp/sumatra.tex
cd /tmp
pdflatex sumatra.tex
Purtroppo LaTex porta con sé sempre qualche intoppo: ho dovuto correggere alcuni caratteri imprevisti e il risultato non è dei migliori. Però il team di Sumatra ha messo a disposizione una piccola guida per personalizzare il risultato, che però non ho ancora avuto modo di provare.
Nel prossimo articolo, quello conclusivo di questa breve guida, vedremo come si presenta l’interfaccia web di Sumatra. Alla prossima!