ognibit-logo
Menu
  • Home
  • Chi Sono
  • Contatti
  • Servizi
  • Computer Science
  • Blog
  • Informativa sulla privacy
Menu

Tracciatura degli Esperimenti con Sumatra (diff)

Posted on Marzo 25, 2019Agosto 4, 2022 by omar

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.

Una pagina del PDF generato dal LaTex. Fortunatamente si può personalizzare.

Nel prossimo articolo, quello conclusivo di questa breve guida, vedremo come si presenta l’interfaccia web di Sumatra. Alla prossima!

Articoli recenti

  • Python Multilingua con GetText
  • PyData Venice #0 @ ESC
  • Python CLI con Fire
  • Bumpversion – Come gestire le versioni del software
  • PyConX 2019 – Python a Firenze

Categorie

  • Artificial Intelligence
  • Conferenze
  • Data Scientist Tool
  • progetti
  • python
© 2023 Omar Rampado | Powered by Minimalist Blog WordPress Theme