wasi-nn: use the MobileNet model instead of AlexNet

The MobileNet model is significantly smaller in size (14MB) than the AlexNet model (233MB); this change should reduce bandwidth used during CI.
This commit is contained in:
Andrew Brown
2021-04-13 12:16:15 -07:00
parent 27b3162f87
commit e9e4afe2c7
2 changed files with 14 additions and 11 deletions

View File

@@ -7,7 +7,7 @@
# executed with the Wasmtime CLI. # executed with the Wasmtime CLI.
set -e set -e
WASMTIME_DIR=$(dirname "$0" | xargs dirname) WASMTIME_DIR=$(dirname "$0" | xargs dirname)
FIXTURE=https://github.com/intel/openvino-rs/raw/main/crates/openvino/tests/fixtures/alexnet FIXTURE=https://github.com/intel/openvino-rs/raw/main/crates/openvino/tests/fixtures/mobilenet
if [ -z "${1+x}" ]; then if [ -z "${1+x}" ]; then
# If no temporary directory is specified, create one. # If no temporary directory is specified, create one.
TMP_DIR=$(mktemp -d -t ci-XXXXXXXXXX) TMP_DIR=$(mktemp -d -t ci-XXXXXXXXXX)
@@ -26,9 +26,9 @@ source /opt/intel/openvino/bin/setupvars.sh
OPENVINO_INSTALL_DIR=/opt/intel/openvino cargo build -p wasmtime-cli --features wasi-nn OPENVINO_INSTALL_DIR=/opt/intel/openvino cargo build -p wasmtime-cli --features wasi-nn
# Download all necessary test fixtures to the temporary directory. # Download all necessary test fixtures to the temporary directory.
wget --no-clobber --directory-prefix=$TMP_DIR $FIXTURE/alexnet.bin wget --no-clobber $FIXTURE/mobilenet.bin --output-document=$TMP_DIR/model.bin
wget --no-clobber --directory-prefix=$TMP_DIR $FIXTURE/alexnet.xml wget --no-clobber $FIXTURE/mobilenet.xml --output-document=$TMP_DIR/model.xml
wget --no-clobber --directory-prefix=$TMP_DIR $FIXTURE/tensor-1x3x227x227-f32.bgr wget --no-clobber $FIXTURE/tensor-1x224x224x3-f32.bgr --output-document=$TMP_DIR/tensor.bgr
# Now build an example that uses the wasi-nn API. # Now build an example that uses the wasi-nn API.
pushd $WASMTIME_DIR/crates/wasi-nn/examples/classification-example pushd $WASMTIME_DIR/crates/wasi-nn/examples/classification-example

View File

@@ -3,10 +3,10 @@ use std::fs;
use wasi_nn; use wasi_nn;
pub fn main() { pub fn main() {
let xml = fs::read_to_string("fixture/alexnet.xml").unwrap(); let xml = fs::read_to_string("fixture/model.xml").unwrap();
println!("Read graph XML, first 50 characters: {}", &xml[..50]); println!("Read graph XML, first 50 characters: {}", &xml[..50]);
let weights = fs::read("fixture/alexnet.bin").unwrap(); let weights = fs::read("fixture/model.bin").unwrap();
println!("Read graph weights, size in bytes: {}", weights.len()); println!("Read graph weights, size in bytes: {}", weights.len());
let graph = unsafe { let graph = unsafe {
@@ -24,10 +24,10 @@ pub fn main() {
// Load a tensor that precisely matches the graph input tensor (see // Load a tensor that precisely matches the graph input tensor (see
// `fixture/frozen_inference_graph.xml`). // `fixture/frozen_inference_graph.xml`).
let tensor_data = fs::read("fixture/tensor-1x3x227x227-f32.bgr").unwrap(); let tensor_data = fs::read("fixture/tensor.bgr").unwrap();
println!("Read input tensor, size in bytes: {}", tensor_data.len()); println!("Read input tensor, size in bytes: {}", tensor_data.len());
let tensor = wasi_nn::Tensor { let tensor = wasi_nn::Tensor {
dimensions: &[1, 3, 227, 227], dimensions: &[1, 3, 224, 224],
r#type: wasi_nn::TENSOR_TYPE_F32, r#type: wasi_nn::TENSOR_TYPE_F32,
data: &tensor_data, data: &tensor_data,
}; };
@@ -42,7 +42,7 @@ pub fn main() {
println!("Executed graph inference"); println!("Executed graph inference");
// Retrieve the output. // Retrieve the output.
let mut output_buffer = vec![0f32; 1000]; let mut output_buffer = vec![0f32; 1001];
unsafe { unsafe {
wasi_nn::get_output( wasi_nn::get_output(
context, context,
@@ -60,10 +60,13 @@ pub fn main() {
// Sort the buffer of probabilities. The graph places the match probability for each class at the // Sort the buffer of probabilities. The graph places the match probability for each class at the
// index for that class (e.g. the probability of class 42 is placed at buffer[42]). Here we convert // index for that class (e.g. the probability of class 42 is placed at buffer[42]). Here we convert
// to a wrapping InferenceResult and sort the results. // to a wrapping InferenceResult and sort the results. It is unclear why the MobileNet output
// indices are "off by one" but the `.skip(1)` below seems necessary to get results that make sense
// (e.g. 763 = "revolver" vs 762 = "restaurant")
fn sort_results(buffer: &[f32]) -> Vec<InferenceResult> { fn sort_results(buffer: &[f32]) -> Vec<InferenceResult> {
let mut results: Vec<InferenceResult> = buffer let mut results: Vec<InferenceResult> = buffer
.iter() .iter()
.skip(1)
.enumerate() .enumerate()
.map(|(c, p)| InferenceResult(c, *p)) .map(|(c, p)| InferenceResult(c, *p))
.collect(); .collect();