Rockchip · AI & Linux Hub

AI-инференс

RKNN2 SDK V2.5.0 · Инференс, оценка точности, производительности и памяти

RKNN2 SDK V2.5.0 · Инференс, оценка точности, производительности и памяти · Полная серия руководства разработчика

· ArmSoM Editorial · Rockchip source documentation · 8 мин чтения

Справочник платформы по руководству Rockchip RKNN2 SDK V2.5.0. Рассматриваются только перечисленные в исходном документе SoC, Linux/Android Runtime и Toolkit. Возможности действуют при указанных в каждом разделе условиях для чипа, SDK, драйвера и ядра и не означают поддержку всех плат ArmSoM. Перед развёртыванием проверьте BSP, драйвер NPU, Runtime и версию модели конкретной платы. Проверка на оборудовании ArmSoM не проводилась; журналы, показатели и примеры взяты из оригинала.

Источники и вычитка: китайская версия следует китайскому V2.5.0 (182 страницы), английская, русская и немецкая — английскому V2.5.0 (208 страниц). Различия оригиналов сохранены; сведения старой версии не выдаются за новые. Китайские рисунки взяты из китайского PDF, остальные — из английского, включая отдельно извлечённые векторные схемы. Номера разделов и формул сохранены. Некоторые ссылки используют старую нумерацию; примеры динамической формы содержат «1224+140=264», утверждения о TP_NORM противоречат друг другу, а init()/rknn.val_perf() отличаются от последующих описаний API. Эти сомнения сохранены: перед выполнением проверьте реальные заголовки и справочник V2.5.0. Код и параметры сохранены, разрывы PDF и продолжения таблиц восстановлены.

Rockchip RKNN2 SDK V2.5.0

RKNN2 SDK V2.5.0 · 6/22

1. Программный стек и основные понятия

2. Среда разработки, версии и подключение платы

3. Процесс разработки и выбор интерфейса

4. Преобразование моделей и редактирование ONNX

5. Квантование, гибридное квантование и QAT

Инференс, оценка точности, производительности и памяти

7. Жизненный цикл Runtime, размещение данных и память

8. Нулевое копирование и ограничения входов/выходов

9. Развёртывание через C API и генерация кода

10. Развёртывание Python через Toolkit Lite2

11. Matmul API и размещение матриц

12. Многоядерная настройка NPU и производительность

13. Модели с динамической формой и развёртывание

14. Многопакетный инференс

15. SRAM NPU RK3588/RK3576

16. Согласованность кэша и разреженный инференс

17. Пользовательские операторы: Python и C API

18. Развёртывание зашифрованных моделей

19. Диагностика точности

20. Анализ производительности и оптимизация сети

21. Анализ, совместное использование и повторное использование памяти

22. Вопросы, обработка ошибок и справочные ресурсы

2.3 Оценка модели

2.3.1 Инференс модели

После преобразования исходной модели в RKNN можно выполнить инференс в симуляторе или на плате и проверить результаты после постобработки. Если они неверны, выполните анализ точности квантованной модели и проверьте предобработку и постобработку. Основные параметры интерфейсов инференса описаны ниже.

Интерфейс инициализации rknn.init_runtime() принимает следующие параметры:

target: целевая аппаратная платформа. По умолчанию None — используется симулятор. Для получения реальных результатов на плате задайте соответствующую платформу: RK3562 / RK3566 / RK3568 / RK3588 / RK3576 / RV1103 / RV1103B / RV1106 / RV1106B / RV1126B.

device_id: идентификатор устройства, по умолчанию None. Если задан target, выбирается единственное подключённое устройство. При нескольких подключённых устройствах нужно указать нужный идентификатор. Для сетевого подключения через ADB сначала вручную выполните adb connect [IP], затем укажите идентификатор, обычно [IP] или [IP:Port]. Команда adb devices показывает все подключённые устройства.

perf_debug: включает отладочный режим оценки производительности; по умолчанию False. Исходный текст указывает вызов rknn.val_perf(), возвращающий общее время модели. При True можно получить время каждого слоя; на RV1103, RV1103B, RV1106 и RV1106B это не поддерживается.

eval_mem: включает режим оценки памяти; по умолчанию False. После установки True можно вызвать rknn.eval_memory(), чтобы получить потребление памяти моделью во время выполнения.

Интерфейс rknn.inference() принимает следующие параметры:

inputs: список входов для инференса в формате ndarray.

data_format: список форматов размещения входных данных; действует только для четырёхмерных входов. Допустимы NCHW и NHWC. По умолчанию None: все входы имеют формат NHWC.

Пример кода:

ret = rknn.init_runtime(target=platform, device_id='515e9b401c060c0b')

# Preprocess
image_src = cv2.imread(IMG_PATH)
img = preprocess(image_src)

# Inference
outputs = rknn.inference(inputs=[img])

# Postprocess
outputs = postprocess(outputs)

Примечания: 1. Если на RV1103 / RV1106 возникает ошибка “E RKNN: failed to allocate fd, ret: -1, errno: 12”, перед инференсом на подключённой плате можно выполнить в её терминале RkLunch-stop.sh, чтобы закрыть другие приложения, потребляющие память. Обновление rknn_server до 2.1.0 также может уменьшить эту проблему.

  1. В версии ARM64 для rknn.init_runtime() параметр device_id не требуется.

2.3.2 Анализ точности модели

При проблемах с результатами инференса квантованной модели используйте rknn.accuracy_analysis() для анализа точности каждого слоя операторов.

Интерфейс rknn.accuracy_analysis() принимает следующие параметры:

inputs: список путей к входным файлам форматов jpg, png, bmp или npy.

output_dir: каталог сохранения результатов анализа; по умолчанию ‘./snapshot’.

target: целевая аппаратная платформа. По умолчанию None — анализ выполняется в симуляторе. Если задана платформа RK3562 / RK3566 / RK3568 / RK3588 / RK3576 / RV1103 / RV1103B / RV1106 / RV1106B / RV1126B, получаются результаты каждого слоя при выполнении на ней и проводится анализ точности.

device_id: идентификатор устройства, по умолчанию None. Если задан target, выбирается единственное устройство. При нескольких устройствах задайте нужный идентификатор. Для сетевого ADB-подключения сначала выполните adb connect [IP], затем укажите идентификатор, обычно [IP] либо [IP]:[Port].

Примечания:

  1. Анализ может завершиться ошибкой, если модель слишком велика и на плате недостаточно места. Проверьте свободное место командой df -h в терминале платы. При необходимости удалите ненужные файлы, чтобы раздел с output_dir вмещал файлы результатов.

  2. После загрузки модели через rknn.load_rknn() анализ точности недоступен, поскольку в RKNN-модели отсутствуют сведения исходной модели.

  3. В версии ARM64 rknn.accuracy_analysis() не требует device_id; эта версия не поддерживает анализ на другом устройстве, подключённом через ADB.

Пример кода:

ret = rknn.accuracy_analysis(inputs=[img_path], target=platform, device_id='515e9b401c060c0b')

Результаты анализа точности показаны ниже.

Рисунок 2-8. Результаты анализа точности

Рисунок 2-8. Результаты анализа точности

Полный анализ включает результаты симулятора и платы. Каждый из них содержит сравнение инференса всей цепочки и послойное сравнение. Подробности:

simulator_error:

entire: косинусное и евклидово расстояния между результатом симулятора и эталоном для цепочки от входного до текущего слоя.

single: косинусное и евклидово расстояния между результатом симулятора и эталоном, когда текущему слою подан эталонный вход.

runtime_error:

entire: косинусное и евклидово расстояния между реальным результатом на плате и эталоном для цепочки от входного до текущего слоя.

single: косинусное и евклидово расстояния между результатом текущего слоя на плате и эталоном при эталонном входе этого слоя.

2.3.3 Оценка производительности модели

rknn.eval_perf() выводит текущие аппаратные частоты и результаты оценки производительности. Параметр fix_freq определяет, следует ли пытаться зафиксировать частоты CPU/NPU/DDR: True включает фиксацию, False отключает; по умолчанию True. Если при инициализации rknn.init_runtime() задан perf_debug=True, выводятся время каждого слоя и общее время. При False выводится только общее время.

Примечание:

  1. RV1103 / RV1103B / RV1106 / RV1106B не поддерживают perf_debug=True и выводят только общее время модели.

Пример кода:

ret = rknn.init_runtime(target=platform, perf_debug=True)
perf_detail = rknn.eval_perf()

Ниже для RK3588 показаны частоты, выводимые eval_perf; поддерживаемые частоты зависят от прошивки. У CPU RK3588 архитектура big.LITTLE, поэтому для CPU выводится несколько значений в KHz, а частоты NPU и DDR приведены в Hz.

CPU Current Frequency List:
  - 1800000
  - 2256000
  - 2304000
NPU Current Frequency List:
  - 1000000000
DDR Current Frequency List:
  - 2112000000

Результаты оценки производительности:

Рисунок 2-9. Результаты оценки производительности

Рисунок 2-9. Результаты оценки производительности

Поля результатов описаны в следующей таблице:

Таблица 2-2. Поля результатов оценки производительности

Поле Описание
ID Идентификатор оператора
OpType Тип оператора
DataType Тип входных данных
Target Аппаратура выполнения оператора (CPU/NPU/GPU)
InputShape Форма входа
OutputShape Форма выхода
DDRCycles Число тактов чтения/записи DDR
NPUCycles Число вычислительных тактов NPU
MaxCycles Максимум из DDRCycles и NPUCycles
Time(us) Время вычисления оператора (us)
MacUsage(%) Использование MAC
WorkLoad(0/1/2) Нагрузка ядер 0/1/2, только RK3588
WorkLoad(0/1) Нагрузка ядер 0/1, только RK3576
TaskNumber Число задач NPU
RW(KB) Общий объём прочитанных и записанных данных (KB)
FullName Полное имя оператора
Total Operator Elapsed Per Frame Time(us) Общее время инференса одного кадра модели
Total Memory Read/Write Per Frame Size(KB) Общий объём обмена с памятью на кадр инференса модели
CallNumber Число выполнений оператора в одном кадре
CPUTime(us) Общее время оператора на CPU в одном кадре
GPUTime(us) Общее время оператора на GPU в одном кадре
NPUTime(us) Общее время оператора на NPU в одном кадре
TotalTime(us) Общее время оператора в одном кадре
TimeRatio(%) Доля общего времени оператора в общем времени одного кадра

2.3.4 Оценка использования памяти моделью

rknn.eval_memory() получает результаты оценки памяти модели. Если при инициализации rknn.init_runtime() задан eval_mem=True, выводится потребление памяти каждой частью.

Пример кода:

ret = rknn.init_runtime(target=platform, eval_mem=True)
memory_detail = rknn.eval_memory()

Результаты оценки памяти:

======================================================
      Memory Profile Info Dump
======================================================
NPU model memory detail(bytes):
  Weight Memory: 8.67 MiB
  Internal Tensor Memory: 7.42 MiB
  Other Memory: 3.03 MiB
  Total Memory: 19.12 MiB

INFO: When evaluating memory usage, we need consider
the size of model, current model size is: 11.86 MiB
======================================================

Описание полей результатов оценки памяти:

Таблица 2-3. Поля результатов оценки памяти

Поле Описание
Total Weight Memory Память весов модели (MB)
Total Internal Tensor Memory Память промежуточных тензоров (MB)
Other Memory Прочая память, например конфигурация регистров, входные и выходные тензоры (MB)
Total Memory Общая память модели (MB)

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