診斷並分析管線
| 欄位 | 值 |
|---|---|
| 類別 | 圖形與管線 |
| 難度 | 中級 |
| 預估閱讀時間 | <10 minutes |
| 標籤 | diagnostics, debugging, observability |
當管線出現問題時,人們往往傾向於直接進行元件層級的除錯。本章介紹一種更經濟的初步方法:一種可重複的初步檢測流程,它會依序回答三個問題——圖的合約是否有效?單次執行是否成功?執行階段診斷顯示了什麼? 它可以在幾秒鐘內捕獲大多數的錯誤設定,防止問題演變成耗時數小時的除錯過程,並且它適用於與第 004 章中相同的最簡輸入 → 輸出圖。
在本章結束時,您將驗證圖的合約,執行單次測量的框架,並列印測量報告,以確定管線是否正常運作。
操作指南
驗證合約
validate() 是一種合約層級的檢查,它在 build() 之前執行。它會測試節點順序、限制和後端解析路徑,而無需串流任何資料,並傳回一份報告,其中包含標準的 error_code。一個空的/ok 代碼表示圖的結構是健全的;任何其他代碼都會將錯誤分類(請參閱下方的錯誤分類),以便您知道從何處開始查找。首先執行此操作意味著您永遠不會浪費時間在一個從未能夠建立的圖的執行階段行為上進行除錯。
tutorials/012_diagnose_a_pipeline/diagnose_a_pipeline.cpp
// validate() checks the Graph before build() and prints any caps problems.
auto report = graph.validate();
std::cout << "validate.error_code=" << report.error_code << "\n";
執行單個測量的框架
接下來,在 start_measurement() 視窗內建立並執行單個確定性的框架。output_memory = Owned 要 求提供已擁有的輸出緩衝區,以便在呼叫後結果保持有效。一個框架就足夠了:如果它成功,則表示管線正在運作;如果它拋出異常,則該異常會包含一份結構化的報告,您可以像 validate() 一樣對其進行分類。
tutorials/012_diagnose_a_pipeline/diagnose_a_pipeline.cpp
// Build a reusable runner and measure the caller-owned workload.
simaai::neat::RunOptions run_opt;
run_opt.output_memory = simaai::neat::OutputMemory::Owned;
auto run = graph.build(std::vector<cv::Mat>{rgb}, run_opt);
simaai::neat::MeasureOptions measure_opt;
measure_opt.title = "tutorial 011 diagnosis";
auto scope = run.start_measurement(measure_opt);
simaai::neat::TensorList out = run.run(std::vector<cv::Mat>{rgb}, /*timeout_ms=*/1000);
if (out.empty())
throw std::runtime_error("missing output tensor");
const simaai::neat::MeasureReport measured = scope.stop();