report 教程
本教程发布基准测试结果:你会把 JSONL 事件流渲染为自包含的 HTML 页面,看到失败的验证如何呈现,导出机器可读的 mmks_1 JSON,并绘制你自己的图表。示例都是完整的测试;文件写入留给你的程序或 mare-mark 命令。
快速上手
moon add Luna-Flow/mare_mark@0.3.0
import {
"Luna-Flow/mare_mark/ir_model",
"Luna-Flow/mare_mark/report",
"Luna-Flow/mare_mark/model",
"Luna-Flow/mare_mark/event",
"Luna-Flow/mare_mark/runner",
"moonbitlang/async",
}
test "JSONL to HTML" {
let events =
#|{"type":"observation","case":"add","implementation":"baseline","dataset_id":0,"elapsed_us":12.5}
#|{"type":"observation","case":"add","implementation":"candidate","dataset_id":0,"elapsed_us":10.2}
#|{"type":"summary","run_id":"first-report"}
let document = @report.document_from_jsonl(events, target="native").unwrap()
let page = @report.html(document)
inspect(page.contains("Run first-report"), content="true")
inspect(page.contains("<svg"), content="true")
}
把 page 保存为 report.html 并在浏览器中打开;它不需要服务器,也不需要网络。
日常任务
直接从运行器报告一次运行
JsonlSink 生成的恰好就是 document_from_jsonl 读取的流:
async test "run and render" {
let negate = @runner.Implementation::stateless("negate", "1", (x : Int) => {
@model.OperationResult::completed(-x, ())
})
let plan = @runner.single_step("negate", [1, 2, 3])
.with_immutable_input(context => context.dataset_key.scale, x => x.to_string())
.compare([negate])
.against_equal(x => -x, (expected, actual) => expected == actual)
.compile()
.unwrap()
let sink = @event.JsonlSink::new()
let environment = @model.EnvironmentSnapshot::new(
@model.SemanticEnvironment::new(@model.ExecutionTarget::Native, "moonc", "", "i32"),
@model.PerformanceEnvironment::new("native", "cpu", "default", 1, "monotonic"),
@model.ProvenanceEnvironment::new("os", "host", "now", "HEAD", "report-tutorial"),
)
ignore(
@runner.run(
plan,
@runner.RunContext::new(environment, sink.as_sink(), 5UL, @runner.ProtocolPreset::QuickCheck.validated()),
),
)
let document = @report.document_from_jsonl(sink.to_jsonl(), target="native").unwrap()
inspect(document.plots[0].points.length(), content="12")
inspect(document.differential.corpus.passed, content="3")
}
三个规模乘以四个区组得到十二个点,每个观测一个。
看看错误的实现会怎样
失败的验证会移除该实现在该数据集上的点,并添加一行不匹配记录:
test "failures hide series and show mismatches" {
let events =
#|{"type":"observation","case":"add","implementation":"good","dataset_id":0,"elapsed_us":12.0}
#|{"type":"observation","case":"add","implementation":"fast-but-wrong","dataset_id":0,"elapsed_us":1.0}
#|{"type":"validation","status":"invalid","case":"add","implementation":"fast-but-wrong","dataset_id":0,"operation":"add","operands":["1","2"],"expected":"3","actual":"4","actual_kind":"value"}
#|{"type":"summary","run_id":"mismatch","passed_count":1,"failed_count":1}
let document = @report.document_from_jsonl(events).unwrap()
inspect(document.plots[0].points.length(), content="1")
inspect(document.plots[0].points[0].series, content="good")
inspect(document.differential.mismatches[0].actual, content="4")
inspect(@report.html(document).contains("Mismatches"), content="true")
}
为其他工具导出 JSON
plot_json 把同一文档写为 mmks_1 JSON,笔记本或仪表盘无需解析 HTML 即可读取:
test "machine-readable output" {
let events =
#|{"type":"observation","case":"add","implementation":"a","dataset_id":0,"elapsed_us":2.5}
let json = @report.plot_json(@report.document_from_jsonl(events).unwrap())
inspect(json.contains("\"kind\":\"scaling\""), content="true")
inspect(json.contains("\"y\":2.5"), content="true")
}
绘制你自己的图表
Plot IR 是纯数据。手工构建一个文档(例如来自一次调优扫描),并用相同的函数渲染它:
test "a hand-made heatmap" {
let cells = [
@ir_model.PlotPoint::new("mc=32", 3.1, "kc=32"),
@ir_model.PlotPoint::new("mc=64", 2.7, "kc=32"),
@ir_model.PlotPoint::new("mc=32", 2.9, "kc=64"),
@ir_model.PlotPoint::new("mc=64", 2.4, "kc=64"),
]
let plot = @ir_model.Plot::new(@ir_model.PlotKind::Heatmap, "Blocking sweep", "µs/op", "median", cells)
let svg = @report.plot_svg(plot)
inspect(svg.contains("<rect"), content="true")
let document = @ir_model.PlotDocument::new("sweep", "native", [plot])
inspect(@report.html(document).contains("Blocking sweep"), content="true")
}
更进一步
- 文件与管道。
mare-mark report events.jsonl report.html和mare-mark report - -会替你完成读写;参见 cli 教程。 - 报告中的统计量。 用
stats计算比较结果,并把它们作为Interval图表或作为 HTML 周围的文本添加;渲染器不会计算它们。 - 保留 JSONL。 HTML 是可以重新生成的投影;JSONL 才是记录。
常见陷阱
- 只含校准事件的流。 它会产生错误,因为没有可显示的内容。
- 以为 x 轴上是规模。 x 值是数据集索引。
- 在一个文件中混合多次运行。 不同运行的点会被绘制在一起,并由最后一个摘要设定运行 id。
- 修改
artifact_version。 只接受mmka_1。
后续步骤
- report API 和 report 设计。
- ir_model API:文档类型。
- event 教程:流的格式。