Платформа и источник
Статья подготовлена по PDF производителя RKNN V2.5.0 и относится только к перечисленным в нём чипам и интерфейсам. Для платы ArmSoM сначала проверьте SoC, драйвер NPU, Toolkit/Runtime, SDK/BSP и версию ядра. Проверки на оборудовании ArmSoM не проводились; примеры и измерения оригинала не являются тестами ArmSoM.
Навигация по серии
- Среда и жизненный цикл объекта
- Конфигурация модели и параметры квантования
- Загрузка Caffe, TensorFlow, ONNX и PyTorch
- Построение, гибридное квантование и экспорт
- Среда выполнения, регистрация операторов и инференс
- Точность, производительность, память и запросы устройств
- Генерация, сборка и запуск примеров C++
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 и уточняет квантование и стратегии памяти; параметры старой версии не подменяют новый источник.
