Skip to main content

ModelSpec

Struct ModelSpec 

Source
pub struct ModelSpec {
Show 15 fields pub id: &'static str, pub name: &'static str, pub stage: ModelStage, pub status: WeightStatus, pub origin: Framework, pub description: &'static str, pub paper: &'static str, pub source: &'static str, pub license: &'static str, pub files: &'static [WeightFile], pub inputs: &'static [&'static str], pub outputs: &'static [&'static str], pub size_divisor: u32, pub tile_bytes_per_voxel: Option<u64>, pub memory: NetworkMemory,
}
Expand description

A deep-learning QSM model and everything needed to obtain and run it.

Fields§

§id: &'static str

Stable identifier, e.g. "bfrnet", "qsmnet". Used by find_model and as the env-var suffix $QSM_MODEL_DIR.

§name: &'static str

Human-readable name, e.g. "BFRnet".

§stage: ModelStage

Reconstruction stage this model implements.

§status: WeightStatus

Whether the weights are hosted and ready.

§origin: Framework

Framework the weights came from (before ONNX export).

§description: &'static str

One-line description of the method.

§paper: &'static str

Reference (citation / DOI / arXiv).

§source: &'static str

Upstream code repository.

§license: &'static str

License / redistribution note for the weights.

§files: &'static [WeightFile]

ONNX weight file(s) required at inference time.

§inputs: &'static [&'static str]

ONNX graph input tensor name(s), in the order the runner feeds them.

§outputs: &'static [&'static str]

ONNX graph output tensor name(s).

§size_divisor: u32

Spatial dimensions must be zero-padded to a multiple of this before inference (0/1 = no constraint). Fully-convolutional nets with pooling need e.g. 8 or 16.

§tile_bytes_per_voxel: Option<u64>

Heap one tile of this network holds while it runs, in bytes per voxel of its padded patch, for the networks QSM-Core runs tiled (None for the rest).

Covers the tile’s activations and everything else its wrapper allocates per tile (the input and output patches, and for the unrolled networks their FFT buffers), as measured in WASM, fragmentation included: the slope of the heap’s high-water against patch voxels, one tile in flight (the browser_memory::tile_cost_* cases in tests/wasm_pipeline.rs; examples/tile_memory_footprint.rs measures the same natively by counting allocations). What a run holds once whatever the number of tiles (the parsed model and its plan, the full-volume buffers) is not in it, except for the networks whose wrapper loads the network inside every patch (LPCNN, MoDL-QSM, NeXtQSM): each of their tiles in flight holds its own parsed model, so their figure is a whole 64³ tile’s heap per voxel, which over-counts larger patches slightly.

inversion::tile_bytes turns it into a tile’s bytes for a config, and it is what inversion::tile_concurrency budgets with on WASM, so a host estimating a tiled run’s memory should use this same figure.

§memory: NetworkMemory

Heap the network takes in tract: the parsed model, and one inference as a function of its input shape. See ModelSpec::inference_bytes and the module docs.

Implementations§

Source§

impl ModelSpec

Source

pub fn tile_cost(&self) -> Option<TileCost>

The cost of one tile of this network, for the networks QSM-Core runs tiled. The tiled wrappers budget with it, and a host estimating a tiled run’s memory should use it too (inversion::tile_bytes, inversion::wasm_tiles_in_flight).

Source

pub fn inference_bytes(&self, shape: [usize; 3]) -> u64

Native peak heap of one inference of this network at input spatial shape shape, above the resident model (Self::resident_bytes), in bytes: NetworkMemory::inference_fixed_bytes + voxels · NetworkMemory::inference_bytes_per_voxel.

shape is the spatial shape of the tensor the network itself sees: a tile’s or window’s patch, or for a whole-volume run the volume after the wrapper’s padding (to Self::size_divisor; for HD-BET to multiples of 16×32×32 in its (z, y, x) order, see crate::bet::hd_bet_network_input). Only its number of voxels matters. Pass the spatial shape even for networks with several input channels (χ-separation, MoDL-QSM) or inputs (iQSM): those are counted. Fixed-shape networks (RS2-Net, AutoQSM, QSMGAN) always see their patch; pass that.

It covers the plan tract builds for the shape (its copy of the weights and per-shape tables), the input and output tensors, the activations and tract’s scratch, both for a plan built per call (onnx::OnnxModel::run) and for one built once and reused (onnx::OnnxModel::plan_for). A wrapper’s own buffers (the padded volume, overlap accumulators, test-time flips, pre- and post-processing) come on top, as do further tiles in flight. Measured single-threaded: with the parallel feature, 8–16 threads added 1–13 MB (0.1–0.6 %) for HD-BET, SynthSeg and xQSM.

Source

pub fn resident_bytes(&self) -> u64

Heap the parsed model holds while loaded, in bytes (NetworkMemory::resident_bytes).

Source

pub fn peak_bytes(&self, shape: [usize; 3], heap: Heap) -> u64

Peak heap of loading this network and running it once at input spatial shape shape (as for Self::inference_bytes), in bytes: what one inference needs besides the caller’s own buffers and the weight file’s bytes.

Source

pub fn is_available(&self) -> bool

true if every weight file has a non-empty URL and hash (i.e. hosted).

Trait Implementations§

Source§

impl Clone for ModelSpec

Source§

fn clone(&self) -> ModelSpec

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ModelSpec

Source§

impl Debug for ModelSpec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Serialize for ModelSpec

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneAny for T
where T: Any + Clone,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Source§

fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.