-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathJsonMetricsRenderer.java
More file actions
67 lines (59 loc) · 2.8 KB
/
JsonMetricsRenderer.java
File metadata and controls
67 lines (59 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package org.beehive.gpullama3.auxiliary.metrics;
import java.util.ArrayList;
import java.util.List;
/**
* Renders metrics as an Ollama-compatible JSON object.
* All duration fields are in nanoseconds; rate fields are in tokens per second.
* The {@code tornadovm} nested object is always included (fields are zero on CPU runs).
*
* <p>Enable via system properties:</p>
* <pre>
* -Dllama.metrics.format=json
* -Dllama.metrics.output=stdout # pipe to jq or another tool
* </pre>
*
* <p>Or write to a file:</p>
* <pre>
* -Dllama.metrics.format=json
* -Dllama.metrics.output=file
* -Dllama.metrics.file=/path/to/metrics.json
* </pre>
*/
public final class JsonMetricsRenderer implements MetricsRenderer {
@Override
public String render(RunMetricsSnapshot s) {
List<String> fields = new ArrayList<>();
fields.add(field(" ", "total_duration", s.totalDuration()));
fields.add(field(" ", "load_duration", s.loadDuration()));
fields.add(field(" ", "prompt_eval_count", s.promptEvalCount()));
fields.add(field(" ", "prompt_eval_duration", s.promptEvalDuration()));
fields.add(field(" ", "eval_count", s.evalCount()));
fields.add(field(" ", "eval_duration", s.evalDuration()));
fields.add(field(" ", "total_count", s.totalCount()));
fields.add(field(" ", "prompt_eval_rate", s.promptEvalRate()));
fields.add(field(" ", "eval_rate", s.evalRate()));
fields.add(field(" ", "total_rate", s.totalRate()));
fields.add(field(" ", "has_prefill_phase", s.hasPrefillPhase()));
fields.add(tornadoObject(s));
return "{\n" + String.join(",\n", fields) + "\n}";
}
private static String tornadoObject(RunMetricsSnapshot s) {
List<String> inner = new ArrayList<>();
inner.add(field(" ", "plan_creation_duration", s.tornadoPlanCreationDuration()));
inner.add(field(" ", "jit_duration", s.tornadoJitDuration()));
inner.add(field(" ", "read_only_weights_copy_in_duration", s.tornadoReadOnlyWeightsCopyInDuration()));
return " \"tornadovm\": {\n" + String.join(",\n", inner) + "\n }";
}
private static String field(String indent, String key, long value) {
return indent + "\"" + key + "\": " + value;
}
private static String field(String indent, String key, int value) {
return indent + "\"" + key + "\": " + value;
}
private static String field(String indent, String key, double value) {
return indent + "\"" + key + "\": " + String.format("%.4f", value);
}
private static String field(String indent, String key, boolean value) {
return indent + "\"" + key + "\": " + value;
}
}