| `llamacpp:n_tokens_max` | Counter | High watermark of the context size observed. |
| `llamacpp:n_decode_total` | Counter | Total Number of llama_decode() calls. |
| `llamacpp:n_busy_slots_per_decode` | Gauge | Average number of busy slots per llama_decode() call. |
+| `llamacpp:spec_decode_num_draft_tokens_total` | Counter | Total draft tokens generated (0 when spec-decode is off). |
+| `llamacpp:spec_decode_num_accepted_tokens_total` | Counter | Total draft tokens accepted by the target model (0 when spec-decode is off). |
+| `llamacpp:spec_decode_num_drafts_total` | Counter | Total speculative decoding verification steps (0 when spec-decode is off). |
+| `llamacpp:spec_decode_num_accepted_tokens_per_pos_total` | Counter | Accepted tokens per draft position (labeled `position="N"`; absent when spec-decode is off or before the first completed speculative request). |
### POST `/slots/{id_slot}?action=save`: Save the prompt cache of the specified slot to a file.
uint64_t n_decode_total = 0;
uint64_t n_busy_slots_total = 0;
+ uint64_t n_draft_tokens_total = 0;
+ uint64_t n_draft_accepted_total = 0;
+ uint64_t n_draft_verif_steps_total = 0;
+ std::vector<uint64_t> n_accepted_per_pos_total;
+
void init() {
t_start = ggml_time_us();
}
n_tokens_predicted += slot.n_decoded;
t_tokens_generation += slot.t_token_generation;
t_tokens_generation_total += slot.t_token_generation;
+
+ n_draft_tokens_total += slot.n_draft_total;
+ n_draft_accepted_total += slot.n_draft_accepted;
+ n_draft_verif_steps_total += slot.n_draft_verif_steps;
+
+ if (n_accepted_per_pos_total.size() < slot.n_accepted_per_pos.size()) {
+ n_accepted_per_pos_total.resize(slot.n_accepted_per_pos.size(), 0);
+ }
+ for (size_t i = 0; i < slot.n_accepted_per_pos.size(); i++) {
+ n_accepted_per_pos_total[i] += slot.n_accepted_per_pos[i];
+ }
}
void on_decoded(const std::vector<server_slot> & slots) {
res->n_decode_total = metrics.n_decode_total;
res->n_busy_slots_total = metrics.n_busy_slots_total;
+ res->n_draft_tokens_total = metrics.n_draft_tokens_total;
+ res->n_draft_accepted_total = metrics.n_draft_accepted_total;
+ res->n_draft_verif_steps_total = metrics.n_draft_verif_steps_total;
+ res->n_accepted_per_pos_total = metrics.n_accepted_per_pos_total;
+
if (task.metrics_reset_bucket) {
metrics.reset_bucket();
}
{"name", "n_tokens_max"},
{"help", "Largest observed n_tokens."},
{"value", res_task->n_tokens_max}
+ }, {
+ {"name", "spec_decode_num_draft_tokens_total"},
+ {"help", "Total draft tokens generated"},
+ {"value", res_task->n_draft_tokens_total}
+ }, {
+ {"name", "spec_decode_num_accepted_tokens_total"},
+ {"help", "Total draft tokens accepted by the target model"},
+ {"value", res_task->n_draft_accepted_total}
+ }, {
+ {"name", "spec_decode_num_drafts_total"},
+ {"help", "Total speculative decoding verification steps"},
+ {"value", res_task->n_draft_verif_steps_total}
}}},
{"gauge", {{
{"name", "prompt_tokens_seconds"},
}
}
+ // labeled counter: one time series per draft position
+ if (!res_task->n_accepted_per_pos_total.empty()) {
+ prometheus << "# HELP llamacpp:spec_decode_num_accepted_tokens_per_pos_total"
+ " Accepted tokens per draft position\n"
+ << "# TYPE llamacpp:spec_decode_num_accepted_tokens_per_pos_total counter\n";
+ for (size_t i = 0; i < res_task->n_accepted_per_pos_total.size(); i++) {
+ prometheus << "llamacpp:spec_decode_num_accepted_tokens_per_pos_total{position=\""
+ << i << "\"} " << res_task->n_accepted_per_pos_total[i] << "\n";
+ }
+ }
+
res->headers["Process-Start-Time-Unix"] = std::to_string(res_task->t_start);
res->content_type = "text/plain; version=0.0.4";
res->status = 200;