diff --git a/core/dr-inference-engine/src/session.rs b/core/dr-inference-engine/src/session.rs index fa36f9f..0314b80 100644 --- a/core/dr-inference-engine/src/session.rs +++ b/core/dr-inference-engine/src/session.rs @@ -19,6 +19,9 @@ pub fn build(rung: Rung, role: Role, bytes: &[u8], cfg: &Config) -> ort::Result< // `stack_tensors`) — a panic across the C API, which is an abort. The // app never asked tract for that and does not start now. let mut b = Session::builder()?.with_intra_threads(threads(cfg))?; + if crate::api::runtime().is_native() { + b = with_runtime_log(b)?; + } // A Hexagon session loads the compiled context when there is one and // compiles it from the model when there is not; the engine thread is // what makes the second case rare (§6). @@ -37,6 +40,39 @@ pub fn build(rung: Rung, role: Role, bytes: &[u8], cfg: &Config) -> ort::Result< } } +/// Send the runtime's own messages for this session to `log`, under the +/// target `onnxruntime`, instead of to ONNX Runtime's stdio logger. +/// +/// Its stderr is nowhere once the app is launched from a menu, and what a +/// provider says while it partitions a graph — how many nodes it took, which +/// operator it declined, the library it failed to load — is most of what a +/// failed rung tells you (docs/dev/inference.md §4). The level follows the +/// filter: warnings always, `debug` adds the runtime's info lines (the +/// partition counts), `trace` its verbose ones (every node placement). +fn with_runtime_log( + b: ort::session::builder::SessionBuilder, +) -> ort::Result { + use ort::logging::LogLevel; + let level = if log::log_enabled!(target: "onnxruntime", log::Level::Trace) { + LogLevel::Verbose + } else if log::log_enabled!(target: "onnxruntime", log::Level::Debug) { + LogLevel::Info + } else { + LogLevel::Warning + }; + let forward = |level: LogLevel, _category: &str, _id: &str, location: &str, message: &str| { + let level = match level { + LogLevel::Verbose => log::Level::Trace, + LogLevel::Info => log::Level::Debug, + LogLevel::Warning => log::Level::Warn, + LogLevel::Error | LogLevel::Fatal => log::Level::Error, + }; + log::log!(target: "onnxruntime", level, "{message} ({location})"); + }; + Ok(b.with_logger(std::sync::Arc::new(forward))? + .with_log_level(level)?) +} + /// The intra-op pool: what the config says, else the cores less two for /// the compositor and the decoder (§9). tract ignores it. fn threads(cfg: &Config) -> usize { diff --git a/docs/dev/traceability.md b/docs/dev/traceability.md index 1085970..81858cd 100644 --- a/docs/dev/traceability.md +++ b/docs/dev/traceability.md @@ -145,7 +145,7 @@ _None._ | FR-PLAT-LIN-2 | [`platform/dr-plat/src/display.rs:1`](../../platform/dr-plat/src/display.rs#L1), [`platform/dr-plat/src/display/wayland.rs:1`](../../platform/dr-plat/src/display/wayland.rs#L1), [`platform/dr-plat/src/display/x11.rs:1`](../../platform/dr-plat/src/display/x11.rs#L1) | | FR-PLAT-WIN-1 | [`platform/dr-plat/src/dirs.rs:1`](../../platform/dr-plat/src/dirs.rs#L1) | | FR-PLAT-WIN-2 | [`apps/darkroom-desktop/build.rs:1`](../../apps/darkroom-desktop/build.rs#L1), [`apps/darkroom-desktop/src/main.rs:6`](../../apps/darkroom-desktop/src/main.rs#L6), [`ui/dr-ui/src/launch_ui.rs:937`](../../ui/dr-ui/src/launch_ui.rs#L937) | -| FR-PLAT-WIN-3 | [`apps/darkroom-desktop/src/main.rs:19`](../../apps/darkroom-desktop/src/main.rs#L19) | +| FR-PLAT-WIN-3 | [`apps/darkroom-desktop/src/main.rs:35`](../../apps/darkroom-desktop/src/main.rs#L35) | | FR-RAW-1 | [`core/dr-decode/src/lib.rs:250`](../../core/dr-decode/src/lib.rs#L250), [`core/dr-types/src/lib.rs:132`](../../core/dr-types/src/lib.rs#L132), [`core/dr-types/src/lib.rs:203`](../../core/dr-types/src/lib.rs#L203) | | FR-RAW-2 | [`core/dr-decode/src/decoder.rs:1`](../../core/dr-decode/src/decoder.rs#L1), [`core/dr-decode/src/decoder.rs:26`](../../core/dr-decode/src/decoder.rs#L26), [`core/dr-decode/src/decoder.rs:59`](../../core/dr-decode/src/decoder.rs#L59), [`core/dr-decode/src/decoder.rs:95`](../../core/dr-decode/src/decoder.rs#L95), [`ui/dr-ui/src/decoder_seam.rs:183`](../../ui/dr-ui/src/decoder_seam.rs#L183), [`ui/dr-ui/src/decoder_seam.rs:1`](../../ui/dr-ui/src/decoder_seam.rs#L1), [`ui/dr-ui/src/decoder_seam.rs:214`](../../ui/dr-ui/src/decoder_seam.rs#L214), [`ui/dr-ui/src/decoder_seam.rs:255`](../../ui/dr-ui/src/decoder_seam.rs#L255), [`ui/dr-ui/src/export.rs:1096`](../../ui/dr-ui/src/export.rs#L1096), [`ui/dr-ui/src/export.rs:850`](../../ui/dr-ui/src/export.rs#L850), [`ui/dr-ui/src/import.rs:96`](../../ui/dr-ui/src/import.rs#L96), [`ui/dr-ui/src/library/sweep.rs:301`](../../ui/dr-ui/src/library/sweep.rs#L301), [`ui/dr-ui/src/library/sweep.rs:624`](../../ui/dr-ui/src/library/sweep.rs#L624), [`ui/dr-ui/src/library/thumbnails_gen.rs:101`](../../ui/dr-ui/src/library/thumbnails_gen.rs#L101), [`ui/dr-ui/src/merge.rs:113`](../../ui/dr-ui/src/merge.rs#L113), [`ui/dr-ui/src/repairs.rs:243`](../../ui/dr-ui/src/repairs.rs#L243) | | FR-RAW-3 | [`core/dr-decode/src/lib.rs:146`](../../core/dr-decode/src/lib.rs#L146), [`core/dr-decode/src/lib.rs:537`](../../core/dr-decode/src/lib.rs#L537), [`core/dr-decode/src/locate.rs:1435`](../../core/dr-decode/src/locate.rs#L1435), [`core/dr-gpu/src/demosaic.rs:1182`](../../core/dr-gpu/src/demosaic.rs#L1182), [`core/dr-gpu/src/demosaic.rs:749`](../../core/dr-gpu/src/demosaic.rs#L749), [`core/dr-gpu/tests/hot_pixels.rs:1`](../../core/dr-gpu/tests/hot_pixels.rs#L1) |