onnxruntime/js/react_native
Yulong Wang e5ca3f3dcb
[js/api] introducing IO binding for tensor (#16452)
[//]: # (## Work In Progress. Feedbacks are welcome!)

### Description
This PR adds a few properties, methods and factories to Tensor type to
support IO-binding feature. This will allow user to create tensor from
GPU/CPU bound data without a force transferring of data between CPU and
GPU.

This change is a way to resolve #15312

### Change Summary
1. Add properties to `Tensor` type:
a. `location`: indicating where the data is sitting. valid values are
`cpu`, `cpu-pinned`, `texture`, `gpu-buffer`.
b. `texture`: sit side to `data`, a readonly property of `WebGLTexture`
type. available only when `location === 'texture'`
c. `gpuBuffer`: sit side to `data`, a readonly property of `GPUBuffer`
type. available only when `location === 'gpu-buffer'`

2. Add methods to `Tensor` type (usually dealing with inference
outputs):
- async function `getData()` allows user to download data from GPU to
CPU manually.
- function `dispose()` allows user to release GPU resources manually.

3. Add factories for creating `Tensor` instances:
    a. `fromTexture()` to create a WebGL texture bound tensor data
    b. `fromGpuBuffer()` to create a WebGPUBuffer bound tensor data
    c. `fromPinnedBuffer()` to create a tensor using a CPU pinned buffer

### Examples:

create tensors from texture and pass to inference session as inputs
```js
// when create session, specify we prefer 'image_output:0' to be stored on GPU as texture
const session = await InferenceSession.create('./my_model.onnx', {
  executionProviders: [ 'webgl' ],
  preferredOutputLocation: { 'image_output:0': 'texture' }
});

...

const myImageTexture = getTexture(); // user's function to get a texture
const myFeeds = { input0: Tensor.fromTexture(myImageTexture, { width: 224, height: 224 }) }; // shape [1, 224, 224, 4], RGBA format.
const results = await session.run(myFeeds);
const myOutputTexture = results['image_output:0'].texture;
```
2023-08-29 12:58:26 -07:00
..
android [js/rn] Add test for validating "executionProvider" options (#16651) 2023-07-12 14:55:47 -07:00
e2e [js] enable formatter for more file types (#16888) 2023-07-28 15:46:58 -07:00
ios [js/rn] Add test for validating "executionProvider" options (#16651) 2023-07-12 14:55:47 -07:00
lib [js/api] introducing IO binding for tensor (#16452) 2023-08-29 12:58:26 -07:00
scripts [js/rn] fix CI packaging for react native E2E test (#11463) 2022-05-09 18:09:52 -07:00
.gitignore [js/react_native] Create ONNX Runtime React Native pipeline (#10474) 2022-02-09 21:37:05 -08:00
app.plugin.js [js/rn] add expo config plugin support (#11556) 2022-05-25 11:55:35 -07:00
babel.config.js [js] enable formatter for more file types (#16888) 2023-07-28 15:46:58 -07:00
onnxruntime-react-native.podspec [js/rn] Package dependency change to manage ort-extensions for react_native app (#15641) 2023-04-29 00:07:12 -07:00
package.json [rn] Update expo/config-plugins to 7.2.4 due to security warning with current version (#16977) 2023-08-03 10:13:43 -07:00
README.md [js] enable formatter for more file types (#16888) 2023-07-28 15:46:58 -07:00
test_types_models.readme.md Use full ORT package for onnxruntime-react-native. (#13037) 2022-09-23 07:20:03 +10:00
tsconfig.build.json [js/react_native] Create ONNX Runtime React Native pipeline (#10474) 2022-02-09 21:37:05 -08:00
tsconfig.json [js] release pipeline for web and react native (#10656) 2022-03-01 21:38:33 -08:00
tsconfig.scripts.json ONNX Runtime React Native Library (#7564) 2021-05-11 10:34:40 -07:00
unimodule.json [js] enable formatter for more file types (#16888) 2023-07-28 15:46:58 -07:00
yarn.lock [rn] Update expo/config-plugins to 7.2.4 due to security warning with current version (#16977) 2023-08-03 10:13:43 -07:00

onnxruntime-react-native

ONNX Runtime React Native provides a JavaScript library for running ONNX models in a React Native app.

Why ONNX models

The Open Neural Network Exchange (ONNX) is an open standard for representing machine learning models. The biggest advantage of ONNX is that it allows interoperability across different open source AI frameworks, which itself offers more flexibility for AI frameworks adoption.

Why ONNX Runtime React Native

With ONNX Runtime React Native, React Native developers can score pre-trained ONNX models directly in React Native apps by leveraging ONNX Runtime, so it provides a light-weight inference solution for Android and iOS.

Installation

yarn add onnxruntime-react-native

Usage

import { InferenceSession } from "onnxruntime-react-native";

// load a model
const session: InferenceSession = await InferenceSession.create(modelPath);
// input as InferenceSession.OnnxValueMapType
const result = session.run(input, ['num_detection:0', 'detection_classes:0'])

Refer to ONNX Runtime JavaScript examples for samples and tutorials. The ONNX Runtime React Native library does not currently support the following features:

  • Tensors with unsigned data types, with the exception of uint8 on Android devices
  • Model loading using ArrayBuffer

Operator and type support

ONNX Runtime React Native version 1.13 supports both ONNX and ORT format models, and includes all operators and types.

Previous ONNX Runtime React Native packages use the ONNX Runtime Mobile package, and support operators and types used in popular mobile models. See here for the list of supported operators and types.

License

License information can be found here.