MemoizingDynamicInferer

Struct MemoizingDynamicInferer 

Source
pub struct MemoizingDynamicInferer { /* private fields */ }
Expand description

The dynamic memoizing batch inferer generates execution plans to fit each batch perfectly, achieving near-perfect performance no matter how much data you have - with a hefty up-front cost for each new batch size.

The dynamic batcher has the highest potential throughput when the amount of data isn’t known. By dynamically generating execution plans to fit the exact amount of elements in each batch, it will give tract optimal knowledge for execution each time. The downside of this is that setting up a new plan is fairly costly, so doing this for a batch size that is only seen once will waste memory and compute resources.

While plans are cached; this still means that if your expected batch size is can vary greatly, you’ll end up with noticeable spikes each time a new plan is generated. If you know you’ll have one or a few batch sizes - but not the exact size - this batcher will end up providing good value and inform tuning for a fixed batcher later.

If you know some batch sizes but not all, you can preload the batcher with those plans to avoid having to build them at runtime.

§Pros

  • Optimal amortized performance without tuning
  • Requires no tuning for good results

§Cons

  • For small amounts of data and large models the spikes can offset amortized gains significantly

Implementations§

Source§

impl MemoizingDynamicInferer

Source

pub fn from_model( model: InferenceModel, preloaded_sizes: &[usize], ) -> TractResult<Self>

Create an inferer for the provided inference model.

§Errors

Will only forward errors from the tract_core::model::Graph optimization and graph building steps.

Source

pub fn from_typed( model: TypedModel, preloaded_sizes: &[usize], ) -> TractResult<Self>

Create an inferer for the provided typed model.

§Errors

Will only forward errors from the tract_core::model::Graph optimization and graph building steps.

Trait Implementations§

Source§

impl Inferer for MemoizingDynamicInferer

Source§

fn select_batch_size(&self, max_count: usize) -> usize

Query the inferer for how many elements it can deal with in a single batch.
Source§

fn infer_raw(&self, pad: &mut ScratchPadView<'_>) -> Result<(), Error>

Execute the model on the provided pre-batched data.
Source§

fn raw_input_shapes(&self) -> &[(String, Vec<usize>)]

Retrieve the name and shapes of the model inputs.
Source§

fn raw_output_shapes(&self) -> &[(String, Vec<usize>)]

Retrieve the name and shapes of the model outputs.
Source§

fn begin_agent(&self, _id: u64)

Source§

fn end_agent(&self, _id: u64)

Source§

fn input_shapes(&self) -> &[(String, Vec<usize>)]

Retrieve the name and shapes of the model inputs. This API only contains the external API, so code-based transforms outside the model are hidden.
Source§

fn output_shapes(&self) -> &[(String, Vec<usize>)]

Retrieve the name and shapes of the model outputs. This API only contains the external API, so code-based transforms outside the model are hidden.
Source§

impl IntoStateful for MemoizingDynamicInferer

Source§

fn into_stateful<WrapStack: InfererWrapper>( self, wrapper_stack: WrapStack, ) -> StatefulInferer<WrapStack, Self>

Construct a StatefulInferer by wrapping this concrete inferer with the given wrapper stack.

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
Source§

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

Source§

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

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

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

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

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

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

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

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

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

Source§

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

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> InfererExt for T
where T: Inferer,

Source§

fn with_default_epsilon(self, key: &str) -> Result<EpsilonInjector<Self>>

Add an epsilon injector using the default noise kind.
Source§

fn with_epsilon<G: NoiseGenerator>( self, generator: G, key: &str, ) -> Result<EpsilonInjector<Self, G>>

Add an epsilon injector with a specific noise generator.
Source§

fn into_batched(self) -> Batched<Self>

Wrap in a batching interface.
Source§

fn infer( &mut self, observations: HashMap<u64, State<'_>>, ) -> Result<HashMap<u64, Response<'_>>, Error>

👎Deprecated since 0.3.0: Please use the more explicit ‘infer_batch’ instead.
Execute the model on the provided batch of elements.
Source§

fn infer_batch<'this>( &'this self, batch: HashMap<u64, State<'_>>, ) -> Result<HashMap<u64, Response<'this>>, Error>

Execute the model on the provided pre-batched data.
Source§

fn infer_single<'this>( &'this self, input: State<'_>, ) -> Result<Response<'this>, Error>

Execute the model on the provided pre-batched data.
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
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V