Rockchip · AI & Linux Hub

AI-инференс

RKNN-Toolkit2 Python API V2.5.0 — Среда выполнения, регистрация операторов и инференс

RKNN-Toolkit2 Python API V2.5.0 — Среда выполнения, регистрация операторов и инференс | Полные параметры, примеры и ограничения платформ

· ArmSoM · 7 мин чтения

Платформа и источник

Статья подготовлена по PDF производителя RKNN V2.5.0 и относится только к перечисленным в нём чипам и интерфейсам. Для платы ArmSoM сначала проверьте SoC, драйвер NPU, Toolkit/Runtime, SDK/BSP и версию ядра. Проверки на оборудовании ArmSoM не проводились; примеры и измерения оригинала не являются тестами ArmSoM.

Навигация по серии

7 Инициализация среды выполнения и инференс

7.1 Загрузка модели RKNN

API load_rknn
Описание Загрузить модель RKNN.
После загрузки не требуется выполнять настройку модели, загрузку исходной модели и сборку RKNN. Загруженную модель можно использовать только при подключении к аппаратной NPU для инференса или получения данных производительности. Симулятор и анализ точности недоступны.
Параметр path: Путь к файлу модели RKNN.
Возвращаемое значение 0: Загрузка выполнена успешно.
Возвращаемое значение -1: Ошибка загрузки.

Пример кода:

# Load the mobilenet_v1 RKNN model in the current path
ret = rknn.load_rknn(path='./mobilenet_v1.rknn')

7.2 Инициализация среды выполнения

Перед инференсом или оценкой производительности инициализируйте среду выполнения. Интерфейс определяет её тип: аппаратная платформа или программный симулятор.

API init_runtime
Описание Инициализировать среду выполнения.
Параметр target: Целевая аппаратная платформа. Поддерживаются ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’ и ‘rk3588’. По умолчанию “None”: модель работает в симуляторе.
Примечание: при target = None сначала нужно вызвать build или hybrid_quantization.
Параметр device_id: Идентификатор устройства. При подключении нескольких устройств к ПК нужно указать этот параметр; его можно получить через list_devices. По умолчанию None.
Параметр perf_debug: Режим отладки при оценке производительности. В нём можно получить время выполнения каждого слоя; иначе доступно только полное время выполнения модели. По умолчанию False.
Параметр eval_mem: Включить ли режим оценки памяти. При True затем можно вызвать eval_memory для получения потребления памяти при выполнении модели. По умолчанию False.
Параметр async_mode: Использовать ли асинхронный режим. По умолчанию False.
Вызов inference включает установку входного изображения, выполнение модели и получение результата. В асинхронном режиме установка входа текущего кадра выполняется одновременно с инференсом предыдущего. Поэтому, кроме первого кадра, время установки входа каждого следующего кадра скрывается, что повышает производительность. Каждый возвращаемый результат в этом режиме относится к предыдущему кадру. (Пока не поддерживается.)
Параметр core_mask: Выбирает ядра NPU во время выполнения. Поддерживаются RK3588 / RK3576 и следующие конфигурации:
RKNN.NPU_CORE_AUTO: автоматическое планирование, модель выполняется на свободном ядре NPU.
RKNN.NPU_CORE_0: выполнение на NPU0.
RKNN.NPU_CORE_1: выполнение на NPU1.
RKNN.NPU_CORE_2: выполнение на NPU2.
RKNN.NPU_CORE_0_1: одновременное выполнение на NPU0 и NPU1.
RKNN.NPU_CORE_0_1_2: одновременное выполнение на NPU0, NPU1 и NPU2.
RKNN.NPU_CORE_ALL: число используемых ядер определяется платформой.
По умолчанию “RKNN.NPU_CORE_AUTO”.
Примечание: у RK3576 только 2 ядра, поэтому NPU_CORE_2 и NPU_CORE_0_1_2 задавать нельзя.
Параметр fallback_prior_device: Приоритетное резервное устройство для OP, не поддерживаемого NPU. Поддерживаются ‘gpu’ и ‘cpu’; ‘gpu’ действует только на платформах с аппаратной GPU. По умолчанию ‘cpu’.
Возвращаемое значение 0: Среда выполнения инициализирована успешно.
Возвращаемое значение -1: Ошибка инициализации среды выполнения.

Пример кода:

# Initialize the runtime environment
ret = rknn.init_runtime(target='rk3566')

7.3 Регистрация пользовательского оператора

Интерфейс регистрирует пользовательский оператор.

API reg_custom_op
Описание Зарегистрировать пользовательский оператор; поддерживается только для модели ONNX.
Параметр custom_op: Класс пользовательского оператора для создания нового OP вне спецификации операторов ONNX. Рекомендуется начинать op_type нового OP с ‘cst’; пользователь должен реализовать функции shape_infer и compute.
Примечание: класс custom_op используется только при преобразовании модели и генерации моделей RKNN с пользовательскими операторами. Для развёртывания на устройстве также следует обратиться к главе 5.5 ‘RKNN SDK User Guide’.
Возвращаемое значение 0: Успешно.
Возвращаемое значение -1: Ошибка.

Пример кода:

import numpy as np
from rknn.api.custom_op import get_node_attr
class cstSoftmax:
    op_type = 'cstSoftmax'
    def shape_infer(self, node, in_shapes, in_dtypes):
        out_shapes = in_shapes.copy()
        out_dtypes = in_dtypes.copy()
        return out_shapes, out_dtypes
    def compute(self, node, inputs):
        x = inputs[0]
        axis = get_node_attr(node, 'axis')
        x_max = np.max(x, axis=axis, keepdims=True)
        tmp = np.exp(x - x_max)
        s = np.sum(tmp, axis=axis, keepdims=True)
        outputs = [tmp / s]
        return outputs

ret = rknn.reg_custom_op(cstSoftmax)

7.4 Инференс модели RKNN

Интерфейс запускает инференс модели RKNN и получает его результат.

API inference
Описание Выполнить инференс модели с указанными входами и получить результат.
Если при инициализации среды target задан как Rockchip NPU, инференс выполняется на указанной аппаратной платформе. Если target не задан, используется симулятор.
Параметр inputs: Список входов для инференса. Тип объектов — ndarray.
Параметр data_format: Список раскладок входных данных: “nchw” или “nhwc”; действует только для 4-мерных входов. По умолчанию None: все входы имеют раскладку “nhwc”.
Параметр inputs_pass_through: Флаг pass_through. По умолчанию None: все входы передаются без режима pass_through.
Без pass_through инструментарий перед передачей входа драйверу NPU вычитает среднее, делит на дисперсию и т. п.; в режиме pass_through эти операции не выполняются.
Параметр — список. Например, чтобы включить сквозную передачу для input0, но не для input1, задают [1, 0].
Возвращаемое значение results: Результат инференса в формате списка ndarray.

Пример кода:

Для классификационной модели, например mobilenet_v1, пример кода приведён ниже; полный код см. в example/tfilte/mobilenet_v1. Написание tfilte сохранено из исходника.

# Preform inference for a picture with a model and get a top-5 result
outputs = rknn.inference(inputs=[img])
show_outputs(outputs)

Пример результата top-5:

-----TOP 5-----
[ 156] score:0.928223 class:"Shih-Tzu"
[ 155] score:0.063171 class:"Pekinese, Pekingese, Peke"
[ 205] score:0.004299 class:"Lhasa, Lhasa apso"
[ 284] score:0.003096 class:"Persian cat"
[ 285] score:0.000171 class:"Siamese cat, Siamese"

Источник и редакционные примечания

Технические главы разделены по назначению. Код, идентификаторы и параметры сохранены. Китайская версия следует китайскому оригиналу; английская, русская и немецкая — английскому. В главы без иллюстраций вымышленные изображения не добавлены.

Примечания: журналы с SDK 1.5.2 сохранены как исторические примеры, а не измерения V2.5.0. Ячейка Python для Ubuntu20.04 различается: китайский текст 3.8/3.9, английский 3.8/3.8; аналогично для Debian11; в разделе ARM64 Debian всё ещё помечен x64. Значения сохранены; проверяйте фактический установочный пакет. V2.5.0 добавляет главу C++ codegen и уточняет квантование и стратегии памяти; параметры старой версии не подменяют новый источник.

RKNN-Toolkit2 · ArmSoM documentation

Другие статьи по теме → · Учебные маршруты →