mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-07 07:25:12 +00:00
e53ab91439
Initial integration of WASI-NN based on #1225: - Implement the library core/iwasm/libraries/wasi-nn - Support TensorFlow, CPU, F32 at the first stage - Add cmake variable `-DWAMR_BUILD_WASI_NN` - Add test case based on Docker image and update document Refer to #1573
133 lines
3.9 KiB
C
133 lines
3.9 KiB
C
/*
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*/
|
|
|
|
#ifndef WASI_NN_WASM_H
|
|
#define WASI_NN_WASM_H
|
|
|
|
#include "wasi_nn_common.h"
|
|
|
|
/**
|
|
* Following definition from:
|
|
* [Aug 10th, 2022]
|
|
* https://github.com/WebAssembly/wasi-nn/blob/e5e1a6c31f424c7cd63026cd270e9746775675a0/wasi-nn.wit.md
|
|
*/
|
|
|
|
/* The graph initialization data. */
|
|
|
|
// This consists of an array of buffers because implementing backends may encode
|
|
// their graph IR in parts (e.g., OpenVINO stores its IR and weights
|
|
// separately).
|
|
typedef struct {
|
|
uint8_t *buf;
|
|
uint32_t size;
|
|
} graph_builder;
|
|
|
|
typedef struct {
|
|
graph_builder *buf;
|
|
uint32_t size;
|
|
} graph_builder_array;
|
|
|
|
/* The dimensions of a tensor. */
|
|
|
|
// The array length matches the tensor rank and each element in the array
|
|
// describes the size of each dimension.
|
|
typedef struct {
|
|
uint32_t *buf;
|
|
uint32_t size;
|
|
} tensor_dimensions;
|
|
|
|
/* The tensor data. */
|
|
|
|
// Initially conceived as a sparse representation, each empty cell would be
|
|
// filled with zeros and the array length must match the product of all of the
|
|
// dimensions and the number of bytes in the type (e.g., a 2x2 tensor with
|
|
// 4-byte f32 elements would have a data array of length 16). Naturally, this
|
|
// representation requires some knowledge of how to lay out data in
|
|
// memory--e.g., using row-major ordering--and could perhaps be improved.
|
|
typedef uint8_t *tensor_data;
|
|
|
|
/* A tensor. */
|
|
|
|
typedef struct {
|
|
// Describe the size of the tensor (e.g., 2x2x2x2 -> [2, 2, 2, 2]). To
|
|
// represent a tensor containing a single value, use `[1]` for the tensor
|
|
// dimensions.
|
|
tensor_dimensions *dimensions;
|
|
// Describe the type of element in the tensor (e.g., f32).
|
|
tensor_type type;
|
|
// Contains the tensor data.
|
|
tensor_data data;
|
|
} tensor;
|
|
|
|
/**
|
|
* @brief Load an opaque sequence of bytes to use for inference.
|
|
*
|
|
* @param builder Model builder.
|
|
* @param encoding Model encoding.
|
|
* @param target Execution target.
|
|
* @param graph Graph.
|
|
* @return error Execution status.
|
|
*/
|
|
error
|
|
load(graph_builder_array *builder, graph_encoding encoding,
|
|
execution_target target, graph *graph)
|
|
__attribute__((export_module("wasi_nn")))
|
|
__attribute__((import_module("wasi_nn")));
|
|
|
|
/**
|
|
* @brief Create an execution instance of a loaded graph.
|
|
*
|
|
* @param graph Graph.
|
|
* @param ctx Execution context.
|
|
* @return error Execution status.
|
|
*/
|
|
error
|
|
init_execution_context(graph graph, graph_execution_context *ctx)
|
|
__attribute__((export_module("wasi_nn")))
|
|
__attribute__((import_module("wasi_nn")));
|
|
|
|
/**
|
|
* @brief Define the inputs to use for inference.
|
|
*
|
|
* @param ctx Execution context.
|
|
* @param index Input tensor index.
|
|
* @param tensor Input tensor.
|
|
* @return error Execution status.
|
|
*/
|
|
error
|
|
set_input(graph_execution_context ctx, uint32_t index, tensor *tensor)
|
|
__attribute__((export_module("wasi_nn")))
|
|
__attribute__((import_module("wasi_nn")));
|
|
|
|
/**
|
|
* @brief Compute the inference on the given inputs.
|
|
*
|
|
* @param ctx Execution context.
|
|
* @return error Execution status.
|
|
*/
|
|
error
|
|
compute(graph_execution_context ctx) __attribute__((export_module("wasi_nn")))
|
|
__attribute__((import_module("wasi_nn")));
|
|
|
|
/**
|
|
* @brief Extract the outputs after inference.
|
|
*
|
|
* @param ctx Execution context.
|
|
* @param index Output tensor index.
|
|
* @param output_tensor Buffer where output tensor with index `index` is
|
|
* copied.
|
|
* @param output_tensor_size Pointer to `output_tensor` maximum size.
|
|
* After the function call it is updated with the
|
|
* copied number of bytes.
|
|
* @return error Execution status.
|
|
*/
|
|
error
|
|
get_output(graph_execution_context ctx, uint32_t index,
|
|
tensor_data output_tensor, uint32_t *output_tensor_size)
|
|
__attribute__((export_module("wasi_nn")))
|
|
__attribute__((import_module("wasi_nn")));
|
|
|
|
#endif
|