Crate menoh[][src]

Rust binding for Menoh

Example

extern crate menoh;

fn main() -> Result<(), menoh::Error> {
    let mut model = menoh::Builder::from_onnx("MLP.onnx")?
        .add_input::<f32>("input", &[2, 3])?
        .add_output::<f32>("fc2")?
        .build("mkldnn", "")?;

    {
        let (in_dims, in_buf) = model.get_variable_mut::<f32>("input")?;
        in_buf.copy_from_slice(&[0., 1., 2., 3., 4., 5.]);
        println!("in:");
        println!("    dims: {:?}", in_dims);
        println!("    buf: {:?}", in_buf);
    }

    model.run()?;

    let (out_dims, out_buf) = model.get_variable::<f32>("fc2")?;
    println!("out:");
    println!("    dims: {:?}", out_dims);
    println!("    buf: {:?}", out_buf);
    Ok(())
}

Usage

1. Build a Model.

let mut model = menoh::Builder::from_onnx("MLP.onnx")?
// register `"input"` as input
// and specify its type (`f32`) and shape (`&[2, 3]`).
    .add_input::<f32>("input", &[2, 3])?
// register `"fc2"` as output
// and specify its type (`f32`).
    .add_output::<f32>("fc2")?
// specify backend (`"mkldnn"`) and its configuration (`""`).
    .build("mkldnn", "")?;

Instead of Builder, we can use a combination of some low-level APIs.

let mut model_data = menoh::ModelData::from_onnx("MLP.onnx")?;

let mut vpt_builder = menoh::VariableProfileTableBuilder::new()?;
vpt_builder.add_input::<f32>("input", &[2, 3])?;
vpt_builder.add_output::<f32>("fc2")?;
let vpt = vpt_builder.build(&model_data)?;

model_data.optimize(&vpt)?;
let model_builder = menoh::ModelBuilder::new(&vpt)?;
let mut model = model_builder.build(model_data, "mkldnn", "")?;

2. Set data to input variable(s).

// fetch a read/write view of a variable.
let (in_dims, in_buf) = model.get_variable_mut::<f32>("input")?;
// set data to the variable.
in_buf.copy_from_slice(&[0., 1., 2., 3., 4., 5.]);

Note: The lifetime of views has to end before executing Model::run. Blocks will be required to limit the lifetime.

This example deliberately fails to compile
// NG: `in_buf` lives after `model.run()`.
let (in_dims, in_buf) = model.get_variable_mut::<f32>("input")?;
in_buf.copy_from_slice(&[0., 1., 2., 3., 4., 5.]);
model.run()?;
// OK: the lifetime of `in_buf` is limited by a block.
{
    let (in_dims, in_buf) = model.get_variable_mut::<f32>("input")?;
    in_buf.copy_from_slice(&[0., 1., 2., 3., 4., 5.]);
}
model.run()?;

3. Execute computation.

model.run()?;

4. Fetch the result(s).

// fetch a read-only view of a variable.
let (out_dims, out_buf) = model.get_variable::<f32>("fc2")?;
// use the data (e.g. print them).
println!("{:?}", out_buf);

Structs

Builder

Helper to build Model.

Model

Model, which executes computation.

ModelBuilder

Builder for Model.

ModelData

Container of operators and values of constant variables.

VariableProfileTable

Container of variable profiles (type, shape and flag of input/output).

VariableProfileTableBuilder

Builder for VariableProfileTable.

Enums

Error

Traits

Dtype

Representation of scalar types supported by Menoh.