wasi-nn: update openvino crate, use external CI action (#4383)

* ci: replace OpenVINO installer action

To test wasi-nn, we currently use an OpenVINO backend. The Wasmtime CI
must install OpenVINO using a custom GitHub action. This CI action has
not been updated in some time and in the meantime OpenVINO (and the
OpenVINO crates) have released several new versions.
https://github.com/abrown/install-openvino-action is an external action
that we plan to keep up to date with the latest releases. This change
replaces the current CI action with that one.

* wasi-nn: upgrade openvino dependency to v0.4.1

This eliminates a `lazy_static` dependency and changes a few parameters
to pass by reference. Importantly, it enables support for the latest
versions of OpenVINO (v2022.*) in wasi-nn.

* ci: update wasi-nn script to source correct env script

* ci: really use the correct path for the env script

Also, clarify which directory OpenVINO is installed in (the symlink may
not be present).
This commit is contained in:
Andrew Brown
2022-07-05 11:50:50 -07:00
committed by GitHub
parent 371ae80ac3
commit 558a9273e9
9 changed files with 14 additions and 86 deletions

View File

@@ -1,2 +0,0 @@
CHECKSUM
GPG-PUB-KEY*

View File

@@ -1,8 +0,0 @@
# install-openvino
A GitHub action to install OpenVINO from a package repository. This is only necessary for `wasi-nn` support but there
are enough steps here to package the functionality separately and avoid cluttering the CI.
Future improvements:
- make this installer work for different OS/distributions (e.g. https://docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_windows.html)
- it would be nice to output the install directory (i.e. `/opt/intel/openvino`)

View File

@@ -1,13 +0,0 @@
name: 'Install OpenVINO'
description: 'Install OpenVINO binaries from a package repository; this is significantly faster than building from source'
inputs:
version:
description: 'The release version of OpenVINO to install'
required: false
runs:
using: composite
steps:
- run: ${{ github.action_path }}/install.sh ${{ inputs.version }}
shell: bash

View File

@@ -1,40 +0,0 @@
#!/bin/bash
set -e
# Determine the OpenVINO version to install from the first parameter. Also, split out the parts of
# this version; `${version_parts[0]}` should contain the year. E.g.:
# version=2021.4.752
# version_year=2021
if [ "$#" -ne 1 ]; then
version="2021.4.752"
else
version="$1"
fi
IFS='.' read -ra version_parts <<< "$version"
version_year="${version_parts[0]}"
# Determine the OS name and version (Linux-specific for now). E.g.:
# os_name=ubuntu
# os_version=20.04
# os_version_year=20
eval $(source /etc/os-release; echo os_name="$ID"; echo os_version="$VERSION_ID";)
IFS='.' read -ra os_version_parts <<< "$os_version"
os_version_year="${os_version_parts[0]}"
# Determine the directory of this script. E.g.:
# script_dir=/some/directory
scriptdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# Retrieve the OpenVINO checksum.
curl -sSL https://apt.repos.intel.com/openvino/$version_year/GPG-PUB-KEY-INTEL-OPENVINO-$version_year > $scriptdir/GPG-PUB-KEY-INTEL-OPENVINO-$version_year
echo "5f5cff8a2d26ba7de91942bd0540fa4d $scriptdir/GPG-PUB-KEY-INTEL-OPENVINO-$version_year" > $scriptdir/CHECKSUM
md5sum --check $scriptdir/CHECKSUM
# Add the OpenVINO repository (DEB-specific for now).
sudo apt-key add $scriptdir/GPG-PUB-KEY-INTEL-OPENVINO-$version_year
echo "deb https://apt.repos.intel.com/openvino/$version_year all main" | sudo tee /etc/apt/sources.list.d/intel-openvino-$version_year.list
sudo apt update
# Install the OpenVINO package.
sudo apt install -y intel-openvino-runtime-$os_name$os_version_year-$version

View File

@@ -310,7 +310,7 @@ jobs:
submodules: true submodules: true
- uses: ./.github/actions/install-rust - uses: ./.github/actions/install-rust
- run: rustup target add wasm32-wasi - run: rustup target add wasm32-wasi
- uses: ./.github/actions/install-openvino - uses: abrown/install-openvino-action@v3
- run: ./ci/run-wasi-nn-example.sh - run: ./ci/run-wasi-nn-example.sh
env: env:
RUST_BACKTRACE: 1 RUST_BACKTRACE: 1

25
Cargo.lock generated
View File

@@ -441,15 +441,6 @@ dependencies = [
"os_str_bytes", "os_str_bytes",
] ]
[[package]]
name = "cmake"
version = "0.1.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "component-macro-test" name = "component-macro-test"
version = "0.1.0" version = "0.1.0"
@@ -1899,9 +1890,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]] [[package]]
name = "openvino" name = "openvino"
version = "0.3.3" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61670c4f1f1fbd3889b97d3772462f6f81d959859a9031c5603850b5dfe93a61" checksum = "d9627908ea4af5766040aa191c8607479af7f70b45fdf6e999b450069fea851a"
dependencies = [ dependencies = [
"openvino-sys", "openvino-sys",
"thiserror", "thiserror",
@@ -1909,9 +1900,9 @@ dependencies = [
[[package]] [[package]]
name = "openvino-finder" name = "openvino-finder"
version = "0.3.3" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83a50d2e3f93a32f4b384583c1623f15eec4268a299ff86228b04c475744b5c6" checksum = "213893e484dcf3db4af79d498a955f7c4c209d06e7020779cda68fca779c2578"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"log", "log",
@@ -1919,14 +1910,14 @@ dependencies = [
[[package]] [[package]]
name = "openvino-sys" name = "openvino-sys"
version = "0.3.3" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a35a2728ef9dd1663ed6640fbe329d7c5f334f5867796d4f6840a921b1f40604" checksum = "e2ba37c26ad2591acc48abee5350d65daa263bf0ab7a79d2ab6999d4b20130ec"
dependencies = [ dependencies = [
"cmake",
"lazy_static",
"libloading", "libloading",
"once_cell",
"openvino-finder", "openvino-finder",
"pretty_env_logger",
] ]
[[package]] [[package]]

View File

@@ -20,10 +20,10 @@ fi
# Inform the environment of OpenVINO library locations. Then we use OPENVINO_INSTALL_DIR below to avoid building all of # Inform the environment of OpenVINO library locations. Then we use OPENVINO_INSTALL_DIR below to avoid building all of
# OpenVINO from source (quite slow). # OpenVINO from source (quite slow).
source /opt/intel/openvino_2021/bin/setupvars.sh source /opt/intel/openvino_2022/setupvars.sh
# Build Wasmtime with wasi-nn enabled; we attempt this first to avoid extra work if the build fails. # Build Wasmtime with wasi-nn enabled; we attempt this first to avoid extra work if the build fails.
OPENVINO_INSTALL_DIR=/opt/intel/openvino cargo build -p wasmtime-cli --features wasi-nn OPENVINO_INSTALL_DIR=/opt/intel/openvino_2022 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 $FIXTURE/mobilenet.bin --output-document=$TMP_DIR/model.bin wget --no-clobber $FIXTURE/mobilenet.bin --output-document=$TMP_DIR/model.bin

View File

@@ -17,7 +17,7 @@ anyhow = "1.0"
wiggle = { path = "../wiggle", version = "=0.40.0" } wiggle = { path = "../wiggle", version = "=0.40.0" }
# These dependencies are necessary for the wasi-nn implementation: # These dependencies are necessary for the wasi-nn implementation:
openvino = { version = "0.3.3", features = ["runtime-linking"] } openvino = { version = "0.4.1", features = ["runtime-linking"] }
thiserror = "1.0" thiserror = "1.0"
[build-dependencies] [build-dependencies]

View File

@@ -87,10 +87,10 @@ impl BackendExecutionContext for OpenvinoExecutionContext {
// should not have to default to NHWC. // should not have to default to NHWC.
let desc = TensorDesc::new(Layout::NHWC, &dimensions, precision); let desc = TensorDesc::new(Layout::NHWC, &dimensions, precision);
let data = tensor.data.as_slice()?; let data = tensor.data.as_slice()?;
let blob = openvino::Blob::new(desc, &data)?; let blob = openvino::Blob::new(&desc, &data)?;
// Actually assign the blob to the request. // Actually assign the blob to the request.
self.1.set_blob(&input_name, blob)?; self.1.set_blob(&input_name, &blob)?;
Ok(()) Ok(())
} }