{% extends "base.html" %} {% block title %}Trainline — psyc{% endblock %} {% block content %}

Trainline — Datasets

{{ datasets|length }} dataset{{ '' if datasets|length == 1 else 's' }}
{% if not datasets %}

No datasets yet. Run psyc train-build-all.

{% else %} {% for d in datasets %} {% endfor %}
DatasetExamplesSizeBuilt
{{ d.name }} {{ d.examples }} {{ d.size_bytes }} B {{ d.modified[:16] }}
{% endif %}

Trainline — Adapters

{{ adapters|length }} adapter{{ '' if adapters|length == 1 else 's' }}
{% if not adapters %}

No adapters yet. Build Dockerfile.train and run a QLoRA fine-tune.

{% else %}
{% for a in adapters %}

{{ a.name }} {% if a.status == 'trained' %}trained {% elif a.status == 'in_progress' %} {% else %}not started{% endif %}

Base model
{{ a.base_model }}
Examples
{{ a.examples }}
Epochs
{{ a.epochs }}
LoRA r
{{ a.lora_r }}
Learning rate
{{ a.lr }}
Final train loss
{% if a.train_loss is not none %}{{ '%.4f'|format(a.train_loss) }}{% else %}— (trained before loss capture){% endif %}
Datasets
{% for ds in a.datasets %}{{ ds }} {% endfor %}{% if not a.datasets %}—{% endif %}
{% if a.loss_history %}

Training loss by step

{% set max_loss = a.loss_history | map(attribute='loss') | max %}
{% for h in a.loss_history %}
step {{ h.step }} · ep {{ h.epoch | round(0, 'floor') | int }} {{ '%.4f'|format(h.loss) }}
{% endfor %}
{% else %}

No per-step loss recorded for this run.

{% endif %}
{% endfor %}
{% endif %}
{% endblock %}