85 lines
2.3 KiB
Markdown
85 lines
2.3 KiB
Markdown
|
|
# VSI NBG Runner Python Binding
|
||
|
|
|
||
|
|
This project is a python package that wraps OpenVX API using pybind11. It provides simple python API to load, query and run model NBG.
|
||
|
|
|
||
|
|
## Installation
|
||
|
|
|
||
|
|
```cmake
|
||
|
|
cmake -B build -DVIVANTE_SDK_DIR=${VIV_SDK_INSTALL_PATH}
|
||
|
|
cmake --build build
|
||
|
|
```
|
||
|
|
|
||
|
|
The built python binding lib can be found at
|
||
|
|
`build/src/_nbg_runner.cpython-{python_version}-{platform}.so`. Place the lib into `python/nbg_runner/_binding/`.
|
||
|
|
|
||
|
|
## Usage
|
||
|
|
|
||
|
|
### Tensor Info
|
||
|
|
|
||
|
|
| Field | Type | Value Sample |
|
||
|
|
|:-----------------:|:-----------------:|:-------------:|
|
||
|
|
| rank | int | 4 |
|
||
|
|
| shape | Tuple[int, ...] | (1,3,224,224) |
|
||
|
|
| dtype | str | "uint8" |
|
||
|
|
| qtype | str | "affine" |
|
||
|
|
| scale | float | 0.007874 |
|
||
|
|
| zero_point | int | 128 |
|
||
|
|
| fixed_point_pos | int | 0 |
|
||
|
|
|
||
|
|
- `shape` is in C-style row major order, which is consistent with NumPy.
|
||
|
|
|
||
|
|
### Set Environment Vars
|
||
|
|
|
||
|
|
```shell
|
||
|
|
# Set HW target If the driver is compiled with vsimulator.
|
||
|
|
VSIMULATOR_CONFIG=VIP9000ULSI_PID0XBA
|
||
|
|
# Locate the OVX driver.
|
||
|
|
VIVANTE_SDK_DIR=${VIV_SDK_INSTALL_PATH}
|
||
|
|
LD_LIBRARY_PATH=${VIVANTE_SDK_DIR}/[lib|lib64|drivers]
|
||
|
|
# Set PYTHONPATH to the dir containing nbg_runner module.
|
||
|
|
PYTHONPATH=${workspaceFolder}/python
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example
|
||
|
|
|
||
|
|
See detailed examples in `examples/*.py`
|
||
|
|
|
||
|
|
```python
|
||
|
|
from nbg_runner import OVXExecutor
|
||
|
|
|
||
|
|
# Load a model NBG file.
|
||
|
|
executor = OVXExecutor("path/to/model.nbg")
|
||
|
|
|
||
|
|
# Query model I/O tensors count.
|
||
|
|
num_inputs = executor.get_num_inputs()
|
||
|
|
num_outputs = executor.get_num_outputs()
|
||
|
|
|
||
|
|
# Get I/O tensor info by index.
|
||
|
|
input_info = executor.get_input_info(0)
|
||
|
|
output_info = executor.get_output_info(0)
|
||
|
|
|
||
|
|
# Or get all I/O tensors infos at once.
|
||
|
|
input_infos = executor.get_input_infos()
|
||
|
|
output_infos = executor.get_output_infos()
|
||
|
|
|
||
|
|
# Prepare inputs.
|
||
|
|
input_tensors: List[NDArray] = ...
|
||
|
|
|
||
|
|
# Set input tensor by index.
|
||
|
|
for i, input_tensor in enumerate(input_tensors):
|
||
|
|
executor.set_input(i, input_tensor)
|
||
|
|
|
||
|
|
# Or set all input tensors at once.
|
||
|
|
executor.set_inputs(input_tensors)
|
||
|
|
|
||
|
|
# Run inference.
|
||
|
|
executor.run()
|
||
|
|
|
||
|
|
# Get output tensor by index.
|
||
|
|
for i in range(num_outputs):
|
||
|
|
output_tensor = executor.get_output(i)
|
||
|
|
|
||
|
|
# Or get all output tensors at once.
|
||
|
|
output_tensors = executor.get_outputs()
|
||
|
|
```
|