Managing Sessions¶
Every run of your entrypoint is logged as a session. The dashboard provides tools to browse, organize, inspect, and visualize those sessions without touching the underlying log files.
Browsing¶
The Overview page lists every project with logged sessions. Open a project to see its individual sessions, or open a session directly to see its full logs and metadata.
Each session has a status:
running— currently in progresscompleted— finished normallyfailed— finished with an errorcrashed— stopped writing without a proper close (e.g. the process died)
Filtering¶
From a project or the overview, sessions can be filtered by:
- Project
- Status (
running,crashed,completed,failed) - Date range — sessions started after/before a given
YYYY-MM-DD HH:MM:SStimestamp - Sort — by start time, end time, duration, warning count, or exception count (ascending or descending)
Archived sessions are hidden by default; toggle Include archived to bring them back into the list.
Renaming¶
Give a session a more memorable display name than its generated ID directly from the session or project view. The underlying .fn file and session ID are untouched—only the display name changes.
Archiving¶
Archiving hides a session from the default view without deleting anything, making it useful for tidying up old or exploratory runs you want to keep around but not see day-to-day.
Archived sessions can be restored at any time from the Include archived view.
Deleting¶
Deleting a session removes it permanently.
Unlike archiving, deletion cannot be undone. Use archiving instead if you simply want a session out of the way.
Metrics and Graphs¶
In addition to free-text log messages, fenn supports structured numeric metrics through logger.log_metric(). These metrics are stored alongside the session log and power the Graphs tab in the dashboard.
Logging metrics¶
Parameters:
name— identifies the metric. The dashboard currently recognizes and renders:train_lossval_lossaccvalue— numeric value to recordstep— x-axis position, typically the training epoch or iteration
Example:
for epoch in range(epochs):
train_loss = run_train_epoch(...)
logger.log_metric("train_loss", train_loss, step=epoch)
if epoch % val_epochs == 0:
val_loss, acc = run_validation(...)
logger.log_metric("val_loss", val_loss, step=epoch)
logger.log_metric("acc", acc, step=epoch)
Automatic metric logging¶
The built-in trainers log metrics automatically during fit():
ClassificationTrainerRegressionTrainerLoRATrainer
These trainers record:
train_lossevery training epochval_lossandaccon validation epochs
No additional logging code is required when using these trainers.
Metric storage¶
Each call to log_metric() appends a <metric> element to the session's .fn file:
Metrics are additive and independent of the free-text log entries stored in the same session.
Sessions created before metric logging was introduced—or sessions that never call log_metric()—remain fully compatible. They simply contain no metric data.
If log_metric() is called before the logger has been configured (for example, when using a trainer outside an @app.entrypoint execution), the call silently does nothing instead of raising an exception.
Viewing graphs¶
Open a session and switch from the Logs tab to the Graphs tab.
While a session is still running, the Graphs tab displays a placeholder. Once the session finishes, the dashboard renders any available metrics as SVG line charts.
Currently, three graphs are supported:
- Train Loss
- Validation Loss
- Accuracy
Sessions without metric data simply display an empty state in the Graphs tab.