{% extends "base.html" %} {% block title %}vq · fleet · {{ jobid }}{% endblock %} {% block content %} {% if error %}

fleet jobs · {{ jobid }}

Could not read job {{ jobid }} on {{ queue_host }}: {{ error }}

Retry

{% else %} {% set s = detail.status %}

fleet jobs · {{ jobid }} {{ s.state }} on {{ queue_host }}{% if detail.owner_host != queue_host %} (read on {{ detail.owner_host }}){% endif %}

Fetched live from the owning host just now. Refresh

{% if flash %}

{{ flash }}

{% endif %} {% if can_act and s.state in ("pending", "running", "suspended") %}
{% if s.state in ("pending", "running") %}
{% endif %} {% if s.state == "running" %}
{% endif %} {% if s.state == "suspended" %}
{% endif %}
{% endif %}

spec

command
{{ s.command | join(" ") }}
cwd
{{ s.cwd }}
cpus
{{ s.cpus }}
mem_mb
{{ s.mem_mb or "(undeclared)" }}
wall_time_seconds
{{ s.wall_time_seconds or "(undeclared)" }}
submitter
{{ s.submitter or "-" }}
job_name
{{ s.job_name or "-" }}
{% if s.tags %}
tags
{{ s.tags | join(", ") }}
{% endif %}
submitted
{{ s.submitted_at }}
{% if s.started_at %}
started
{{ s.started_at }}
{% endif %} {% if s.finished_at %}
finished
{{ s.finished_at }}
{% endif %} {% if s.exit_code is not none %}
exit_code
{{ s.exit_code | describe_exit }}
{% endif %} {% if s.failure_reason %}
failure_reason
{{ s.failure_reason }}
{% endif %}
{% if s.scheduler_target %}

scheduler

target
{{ s.scheduler_target }}
{% if s.scheduler_id %}
scheduler_id
{{ s.scheduler_id }}
{% endif %} {% if s.pbs_state_label %}
scheduler state
{{ s.pbs_state_label }}
{% endif %} {% if s.fetch_state_label %}
fetch state
{{ s.fetch_state_label }}
{% endif %}
{% endif %} {# #168: where the scheduler placed the job, node by node. #} {% if allocation %}

nodes

{% for a in allocation %} {% endfor %}
nodeallocated cores
{{ a.node }}{{ a.cores if a.cores is not none else "not reported" }}

The scheduler's allocation: {{ allocation | length }} node{{ "s" if allocation | length != 1 else "" }}. Nothing is measured per node; the usage on this page is the whole job's.

{% endif %} {# #168: what the finished command measurably used, from its receipt. #} {% if final_usage %}

final resource usage

{% if final_usage.status == "ok" %}
wall
{{ final_usage.wall }}
cpu time
{{ final_usage.cpu }}{% if final_usage.average_cores is not none %} ({{ final_usage.average_cores }} cores on average{% if final_usage.declared_cpus %} of {{ final_usage.declared_cpus }} declared{% endif %}){% endif %}
peak rss
{% if final_usage.peak_rss_mb is not none %}{{ "%.0f" | format(final_usage.peak_rss_mb) }} MB{% if final_usage.peak_share is not none %} ({{ final_usage.peak_share }}% of {{ final_usage.declared_mem_mb }} MB declared){% endif %}{% else %}unknown{% endif %}
{% if final_usage.process_count is not none %}
processes
{{ final_usage.process_count }} at most at once
{% endif %}

Measured by {{ final_usage.collector }}{% if final_usage.receipts and final_usage.receipts > 1 %} over {{ final_usage.receipts }} array elements (cpu summed, wall and peak the largest){% endif %}. Peak rss is the {{ final_usage.peak_rss_scope }}, not a sum over the job's processes.

{% elif final_usage.status == "absent" %}

No usage receipt. The command did not exit on its own (a killed job leaves none), or it ran under a vq that did not write one.

{% elif final_usage.status == "error" %}

The collector could not measure this run: {{ final_usage.error }}

{% else %}

The usage receipt is not shown because it cannot be trusted: {{ final_usage.error }}

{% endif %}
{% endif %} {# #168: a running GPU job's newest nvidia-smi sample. #} {% if gpu_live %}

gpu now

{% if gpu_live.status == "ok" %} {% for device in gpu_live.devices %} {% endfor %}
gpumodelutilisationdevice memoryjob processes
{{ device.index }}{{ device.name }} {% if device.utilization_percent is not none %}{{ device.utilization_percent }}%{% else %}unknown{% endif %} {% if device.memory_used_mb is not none %}{{ "%.0f" | format(device.memory_used_mb) }} MB{% else %}unknown{% endif %}{% if device.memory_total_mb is not none %} of {{ "%.0f" | format(device.memory_total_mb) }} MB{% endif %} {% if not device.job_process %}none seen{% elif device.job_memory_mb is not none %}{{ "%.0f" | format(device.job_memory_mb) }} MB{% else %}unknown{% endif %}

The newest complete nvidia-smi sample from the batch node, taken {{ gpu_live.observed or "at an unknown time" }} by the node's clock. {% if gpu_live.coverage == "allocation" %}The node shows exactly the {{ gpu_live.allocated }} allocated GPUs. {% elif gpu_live.coverage == "attributed" %}The node shows {{ gpu_live.visible }} GPUs for an allocation of {{ gpu_live.allocated }}; only devices a process of this job is on are listed. {% else %}The node shows {{ gpu_live.visible }} of {{ gpu_live.allocated }} allocated GPUs; other nodes are not observed.{% endif %} Utilisation and device memory are the device as a whole, not this job's share.

{% else %}

GPU use is not measured now: {{ gpu_live.reason }}

{% endif %}
{% endif %} {# #168: what the job's GPUs did, from its nvidia-smi samples. #} {% if gpu_usage %}

gpu use

{% if gpu_usage.status == "ok" %} {% if gpu_usage.elements %}{% endif %} {% for device in gpu_usage.devices %} {% if gpu_usage.elements %}{% endif %} {% endfor %}
elementgpumodeljob processes peakdevice memory peakutilisation meanutilisation peak
{{ device.element }}{{ device.index }}{{ device.name }} {% if device.job_peak_memory_mb is not none %}{{ "%.0f" | format(device.job_peak_memory_mb) }} MB{% else %}not attributed{% endif %} {% if device.device_peak_memory_mb is not none %}{{ "%.0f" | format(device.device_peak_memory_mb) }} MB{% else %}unknown{% endif %}{% if device.memory_total_mb is not none %} of {{ "%.0f" | format(device.memory_total_mb) }} MB{% endif %} {% if device.utilization_mean_percent is not none %}{{ device.utilization_mean_percent }}%{% else %}unknown{% endif %} {% if device.utilization_peak_percent is not none %}{{ device.utilization_peak_percent }}%{% else %}unknown{% endif %}

Measured by {{ gpu_usage.collector }} on the batch node, {{ gpu_usage.samples }} samples every {{ gpu_usage.interval_seconds }} s{% if gpu_usage.truncated %}, until sampling reached its size cap{% endif %}. {% if gpu_usage.coverage == "allocation" %}The node showed exactly the {{ gpu_usage.allocated }} allocated GPUs, so these are the job's devices. {% elif gpu_usage.coverage == "attributed" %}The node showed {{ gpu_usage.visible }} GPUs for an allocation of {{ gpu_usage.allocated }}; only devices a process of this job was seen on are listed. {% elif gpu_usage.coverage == "mixed" %}Each of the {{ gpu_usage.elements | length }} array elements is summarised on its own node, and which devices are listed differs between them: {% for element in gpu_usage.elements %}element {{ element.index }} {{ element.coverage or ("not measured: " ~ element.reason) }}{% if not loop.last %}; {% endif %}{% endfor %}. {% else %}The node showed {{ gpu_usage.visible }} of {{ gpu_usage.allocated }} allocated GPUs; other nodes are not observed, so this is partial.{% endif %} Device memory and utilisation are the device as a whole, not this job's share. Job process memory counts processes started from the job script and, on Slurm, the job's other steps in its cgroup.

{% elif gpu_usage.status == "absent" %}

No GPU samples: the command never ran, or it ran under a vq that does not sample GPUs.

{% elif gpu_usage.status == "unavailable" %}

GPU use was not measured: {{ gpu_usage.reason }}

{% else %}

The GPU samples are not shown because they cannot be trusted: {{ gpu_usage.error }}

{% endif %}
{% endif %} {% if detail.samples %}

resource samples (last {{ detail.samples | length }}, newest first)

Watchdog samples from the owning host, ~5 s apart. CPU% is the whole process group ({{ s.cpus }} core(s) declared ⇒ up to ~{{ s.cpus * 100 }}%). {% if s.mem_mb %}Declared memory ceiling {{ s.mem_mb }} MB.{% endif %}

{# Four narrow columns, but a 19-char timestamp plus three numerics still exceeds a phone viewport once main's padding is taken off. #}
{% if s.mem_mb %}{% endif %} {% for smp in detail.samples | reverse %} {% if s.mem_mb %} {% endif %} {% endfor %}
tscpu %rss MBmem %
{{ smp.ts[:19] | replace("T", " ") if smp.ts else "-" }} {{ "%.0f" | format(smp.cpu_percent) if smp.cpu_percent is not none else "-" }} {{ "%.0f" | format(smp.rss_mb) if smp.rss_mb is not none else "-" }}{{ "%.1f" | format(100.0 * smp.rss_mb / s.mem_mb) if smp.rss_mb is not none else "-" }}
{% endif %} {% if preview and (preview.method or preview.formula or preview.name or preview.scf or preview.error or preview.optimisation or preview.headline.total_energy is not none) %}

calculation

{% if preview.name or preview.formula %}
system
{{ preview.name or "" }}{% if preview.name and preview.formula %} · {% endif %}{{ preview.formula or "" }}{% if preview.atoms %} ({{ preview.atoms }} atoms{% if preview.periodic_dimensions %}, {{ preview.periodic_dimensions }}D periodic{% endif %}){% endif %}
{% endif %} {% if preview.method %}
method
{{ preview.method }}{% if preview.basis %} / {{ preview.basis }}{% endif %}
{% endif %} {% if preview.headline.total_energy is not none %}
total energy
{{ "%.10f" | format(preview.headline.total_energy) }} Ha
{% endif %} {% if preview.headline.gap_ev is not none %}
gap
{{ "%.4f" | format(preview.headline.gap_ev) }} eV
{% endif %} {% if preview.scf %}
SCF
iteration {{ preview.scf[-1].iter }}, E = {{ "%.10f" | format(preview.scf[-1].energy) }} Ha, residual {{ "%.2e" | format(preview.scf[-1].residual) }}
{% endif %} {% if preview.scf_energies | length > 1 %}
SCF solutions
{{ preview.scf_energies | length }} (latest {{ "%.10f" | format(preview.scf_energies[-1]) }} Ha)
{% endif %} {% if preview.optimisation %}
optimisation
{{ preview.optimisation.iterations }} iterations, max|grad| {{ "%.2e" | format(preview.optimisation.max_gradient) }}, {{ "converged" if preview.optimisation.converged else "not converged" }}
{% endif %} {% if preview.error %}
error
{{ preview.error }}
{% endif %}
{% if chart %}
log10 ||[F,DS]|| from {{ chart.log_top }} to {{ chart.log_bottom }}, iterations {{ chart.first_iter }}–{{ chart.last_iter }}
{% endif %}
{% endif %}

stdout (tail)

{% if s.stdout %}
{{ s.stdout }}
{% else %}

No stdout captured yet.

{% endif %}

stderr (tail)

{% if s.stderr %}
{{ s.stderr }}
{% else %}

No stderr captured yet.

{% endif %}

events ({{ detail.events | length }})

{% if detail.events %} {# Same unbounded detail cell as job_detail.html. #}
{% for e in detail.events %} {% endfor %}
tskinddetail
{{ e.ts }} {{ e.kind }} {%- set core = ["ts", "kind", "jobid"] -%} {%- for k, v in e.items() if k not in core -%} {{ k }}: {{ v }}{% if not loop.last %} · {% endif %} {%- endfor -%}
{% else %}

No events recorded (pre-v0.6.54 job, or workspace cleaned up).

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