The macOS ladder was the CPU provider alone, with CoreML listed as a gap. It is now CoreML, then the CPU, then tract — unmeasured, since nobody here has a Mac, and safe to ship unmeasured because the probe's clock rejects a CoreML slower than the CPU and `attempt` refuses one that crashes. - `Rung::CoreMl`, a compiling rung like TensorRT: an ML Program with every compute unit allowed, falling back to the CPU until each model's program is built. The embedder stays on the CPU, as on the Hexagon (§7). - The cache is one directory per model and runtime version. CoreML keys a model committed from memory on its input and node names, not its weights (ONNX Runtime 1.29, coreml_execution_provider.cc), so two exports of one architecture would otherwise share a program. - The fingerprint on macOS is the chip and the OS release, which ships CoreML. - The desktop looks for the runtime in the bundle's Contents/Frameworks and Homebrew's prefixes; fetch-desktop-runtime.sh on a Mac downloads ONNX Runtime 1.29.0 for Apple silicon, which carries CoreML. docs/dev/macos.md says what exists, how to build it, and which log lines to ask a Mac user for.
58 lines
2.4 KiB
TOML
58 lines
2.4 KiB
TOML
[package]
|
|
name = "dr-inference-engine"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
|
|
# The one crate that names a runtime, a provider, a vendor library or a
|
|
# device (docs/dev/inference.md §8). `dr-face` and `dr-segment` ask it for a
|
|
# session by role and never see which of these answered.
|
|
|
|
[dependencies]
|
|
thiserror.workspace = true
|
|
log.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
|
|
# `ort` is the API; what supplies it is decided once per process (§3):
|
|
# `libonnxruntime` found on disk, or `tract`. Both are behind
|
|
# `alternative-backend`, so nothing here links C on any target.
|
|
ort = { workspace = true }
|
|
ort-tract = { workspace = true, optional = true }
|
|
# dlopen, and the C types of the table it fetches. Both pure Rust;
|
|
# `libloading` is already in the tree through wgpu.
|
|
libloading = { version = "0.8", optional = true }
|
|
ort-sys = { version = "2.0.0-rc.13", default-features = false, features = ["disable-linking"], optional = true }
|
|
|
|
# The NVIDIA rungs exist on the desktop only. These features add `ort`'s
|
|
# option builders and nothing else — no linking under `alternative-backend` —
|
|
# but an Android binary has no business carrying even the option names, and
|
|
# the packaging must never be tempted to (§2, §3.1). The AMD rung needs no
|
|
# feature: MIGraphX is registered through the runtime's generic key/value
|
|
# entry point (`session::migraphx`), because `ort`'s own builder cannot
|
|
# name the compiled-program cache.
|
|
[target.'cfg(not(target_os = "android"))'.dependencies]
|
|
ort = { workspace = true, features = ["cuda", "tensorrt"] }
|
|
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
ort = { workspace = true, features = ["qnn"] }
|
|
|
|
# The Apple rung: CoreML's option builder, which fills the runtime's generic
|
|
# key/value map. `ort-sys`'s `coreml` feature is empty; nothing links.
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
ort = { workspace = true, features = ["coreml"] }
|
|
|
|
[features]
|
|
# The floor: `tract` supplies the API table when no runtime file is found, or
|
|
# always, in a build without `native`. Tests want this and nothing else.
|
|
default = ["tract"]
|
|
tract = ["dep:ort-tract"]
|
|
# Look for `libonnxruntime` on disk and hand its table to `ort`.
|
|
native = ["dep:libloading", "dep:ort-sys"]
|
|
|
|
[dev-dependencies]
|
|
# The `ep_probe` example prints the provider's own diagnostics, which is most
|
|
# of what a failed rung tells you.
|
|
env_logger.workspace = true
|