Download docs/modules/metrics.md from PYTHAI/bankml: direct link, hf CLI and curl.
- Browser
- Download file 3.72 kB
-
https://huggingface.co/spaces/PYTHAI/bankml/resolve/main/docs/modules/metrics.md
- Command line
-
hf download hf://spaces/PYTHAI/bankml/docs/modules/metrics.md
-
curl -L -o metrics.md https://huggingface.co/spaces/PYTHAI/bankml/resolve/main/docs/modules/metrics.md
bankML/metrics.rs — bankML's own measurements of its answers
Summary
metrics.rs (0.3.7) keeps one record per completion, taken inside the engine (Native::complete_with, which
Native::complete wraps since 0.3.8, so streamed, non-streamed and logprobs answers are all counted), in a ring of the
last 256, and serves them at GET /bankml/metrics. The definitions are the conventional ones, so the numbers compare with
llama.cpp's: time to first token (TTFT), prompt processing in tokens per second (llama-bench's pp), generation in tokens
per second (tg), and — when the CPU package's RAPL counter is readable — the energy a completion took and joules per
generated token. Nothing is estimated: a field that was not measured is null. The console's charts and the bankML
persona's SELF block read from here.
Technical usage
pub const KEEP: usize = 256;
pub struct Record { pub at: f64, pub model: String, pub prompt_tokens: usize, pub cached_tokens: usize,
pub completion_tokens: usize, pub prompt_ms: f64, pub ttft_ms: Option<f64>, pub eval_ms: f64,
pub finish: String, pub grammar_ms: f64, pub resampled: usize, pub energy_j: Option<f64> }
impl Record { pub fn prompt_tps(&self) -> Option<f64>; pub fn eval_tps(&self) -> Option<f64>;
pub fn joules_per_token(&self) -> Option<f64>; pub fn json(&self) -> String }
pub fn push(r: Record); pub fn records() -> Vec<Record>; pub fn json() -> String
modelis the GGUF's file stem;atthe end of the completion in Unix seconds.prompt_tpscounts only the prompt tokens actually computed, overprompt_ms.cached_tokensis the prefix found in the slot, or brought back from the host prompt cache (prompt_cache.md); it is thecache_nof the answer'stimings.energy_jis the difference of twosys::energy_uj()readings around the completion (the counter's wrap handled); it includes everything the package drew in that time, an integrated GPU too.Record::jsonadds the derivedprompt_tps,eval_tpsandjoules_per_tokento the stored fields.GET /bankml/metrics→{"source", "kept", "keep", "prompt_tokens", "completion_tokens", "energy_j", "joules_per_token", "records": […]}. The token totals cover every kept record;energy_jandjoules_per_tokenonly the records whose energy was measured (nullwhen none was).
curl -s 127.0.0.1:18093/bankml/metrics | python3 -m json.tool | head
How it is verified
Unit tests: rates_and_energy_are_measured_or_null (the rates, J/token, and null when not measured) and
the_ring_keeps_the_last_ones. Live (0.3.7, Bonsai-1.7B): a non-streamed answer's receipt carries ttft_ms (it was
null before), and the record matches the answer's timings.
Advantages and efficiency
- Measured where the work is done. The engine times its own prompt computation, first piece and generation, so the numbers do not include HTTP or the client.
- Bounded and cheap. A fixed ring of 256 records behind one mutex, one RAPL read before and after a completion.
- Honest by construction.
Optionfields rendernull; no field is ever derived from a guess.
Limitations
- Energy needs
./install.sh power(the counter is root-only by default) and covers the whole CPU package, not bankML alone; a discrete GPU's power is not included (no driver-neutral sensor). - The ring is in memory: a restart empties it (the console keeps its own log of exchanges).
See also
sys.md · native.md · serve.md · prompt_cache.md · console.md · ../usage.md §13