TIM-VX/samples/nbg_runner_pybind
Yunshan 394cedcfe6
Add NBG runner python binding (#677)
Co-authored-by: Xiaoran Weng <xiaoran.weng@verisilicon.com>
2024-01-10 16:31:28 +08:00
..
cmake/modules Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
examples Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
python/nbg_runner Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
src Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
.clang-format Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
.clang-tidy Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
.gitignore Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
CMakeLists.txt Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00
README.md Add NBG runner python binding (#677) 2024-01-10 16:31:28 +08:00

README.md

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 -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

# 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

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()