Платформа и источник
Статья подготовлена по PDF производителя RKNN V2.5.0 и относится только к перечисленным в нём чипам и интерфейсам. Для платы ArmSoM сначала проверьте SoC, драйвер NPU, Toolkit/Runtime, SDK/BSP и версию ядра. Проверки на оборудовании ArmSoM не проводились; примеры и измерения оригинала не являются тестами ArmSoM.
Навигация по серии
- Среда и жизненный цикл объекта
- Конфигурация модели и параметры квантования
- Загрузка Caffe, TensorFlow, ONNX и PyTorch
- Построение, гибридное квантование и экспорт
- Среда выполнения, регистрация операторов и инференс
- Точность, производительность, память и запросы устройств
- Генерация, сборка и запуск примеров C++
8 Оценка точности, производительности и памяти API
8.1 Анализ точности квантования
Интерфейс выполняет инференс квантованной модели и формирует выходы каждого слоя для анализа точности квантования.
| API | accuracy_analysis |
|---|---|
| Описание | Выполнить инференс квантованной модели и создать снимок, то есть выгрузить данные тензоров каждого слоя. Для вычисления ошибки квантования выгружаются оба типа данных: fp32 и quant. Примечания: 1. Интерфейс вызывается только после build или hybrid_quantization_step2. 2. Если target равно None, а исходная модель уже квантована (модель QAT), вызов завершится ошибкой. 3. Метод квантования соответствует настройке config. |
| Параметр | inputs: Список путей к изображениям (jpg/png/bmp/npy). |
| Параметр | output_dir: Каталог вывода всех данных снимка. По умолчанию ‘./snapshot’. Если target не задан, в output_dir создаются: - Каталог simulator: результаты каждого слоя симулятора при полном выполнении квантованной модели (выход преобразован в float32). - Каталог golden: результаты каждого слоя симулятора при полном выполнении модели с плавающей точкой. - error_analysis.txt: косинусное расстояние (entire_error и single_error) между результатом каждого слоя квантованной модели в симуляторе и моделью с плавающей точкой в симуляторе при полном вычислении квантованной модели. Различие entire_error/single_error заключается в том, поступает ли вход каждого слоя из квантованной модели или модели с плавающей точкой. Подробнее см. error_analysis.txt. Если target задан, в output_dir дополнительно создаются: - Каталог runtime: результаты каждого слоя при полном выполнении квантованной модели на NPU (выход преобразован в float32). - error_analysis.txt: дополнительно записывается косинусное расстояние (entire_error) между результатами каждого слоя симулятора и NPU при полном вычислении квантованной модели. Подробнее см. error_analysis.txt. |
| Параметр | target: Целевая аппаратная платформа. Поддерживаются ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’ и ‘rk3588’. По умолчанию “None”. Если target задан, получаются выходы каждого слоя NPU и анализируется их точность. |
| Параметр | device_id: Идентификатор устройства. При подключении нескольких устройств к ПК его необходимо указать; значение получают через list_devices. По умолчанию “None “. |
| Возвращаемое значение | 0: Успешно. |
| Возвращаемое значение | -1: Ошибка. |
Пример кода:
# Accuracy analysis
ret = rknn.accuracy_analysis(inputs=['./dog_224x224.jpg'])
8.2 Оценка производительности модели
| API | eval_perf |
|---|---|
| Описание | Оценить производительность модели. Модель должна выполняться на RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588, подключённом к ПК. Если при init_runtime параметр perf_debug равен False, аппаратная информация о производительности содержит только полное время выполнения модели. При perf_debug = True подробно измеряется и время каждого слоя. |
| Параметр | is_print: Выводить ли информацию о производительности. По умолчанию True. |
| Параметр | fix_freq: Фиксировать ли аппаратную частоту. По умолчанию True. |
| Возвращаемое значение | perf_result: Информация о производительности (строки). |
Пример кода:
# Evaluate model performance
perf_detail = rknn.eval_perf()
8.3 Оценка использования памяти
| API | eval_memory |
|---|---|
| Описание | Получить потребление памяти при выполнении модели на аппаратной платформе. Модель должна выполняться на подключённом к ПК RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588. |
| Параметр | is_print: Выводить ли результаты оценки памяти в стандартном формате. По умолчанию True. |
| Возвращаемое значение | memory_detail: Подробные сведения об использовании памяти в формате словаря. Пример данных: { ‘weight_memory’: 3698688, ‘internal_memory’: 1756160, ‘other_memory’: 484352, ‘total_memory’: 5939200, } - ‘weight_memory’ — объём памяти весов модели. - ‘internal_memory’ — память внутренних тензоров модели. - ‘other_memory’ — память других тензоров модели. - ‘total_memory’ — общий объём памяти модели, сумма памяти весов, внутренних тензоров и прочей памяти. |
Пример кода:
# eval memory usage
memory_detail = rknn.eval_memory()
Для примера examples/caffe/mobilenet_v2 ниже показан исходный вывод использования памяти на RK3588. Это данные оригинала, не измерения ArmSoM.
======================================================
Memory Profile Info Dump
======================================================
NPU model memory detail(bytes):
Weight Memory: 3.53 MiB
Internal Tensor Memory: 1.67 MiB
Other Memory: 473.00 KiB
Total Memory: 5.66 MiB
INFO: When evaluating memory usage, we need consider
the size of model, current model size is: 4.09 MiB
======================================================
8.4 Список устройств
| API | list_devices |
|---|---|
| Описание | Перечислить подключённые RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588. Примечание: поддерживаются два режима подключения устройств — ADB и NTB. При подключении нескольких устройств их режимы должны совпадать. |
| Параметр | None. |
| Возвращаемое значение | Возвращает списки adb_devices и ntb_devices. Если к ПК не подключено ни одного устройства, возвращает два пустых списка. |
Пример кода:
rknn.list_devices()
Пример списка устройств:
*************************
all device(s) with adb mode:
VD46C3KM6N
*************************
9 API запроса версии SDK
| API | get_sdk_version |
|---|---|
| Описание | Получить версии API и драйвера используемого SDK. Примечание: перед вызовом необходимо загрузить модель и инициализировать среду выполнения. API применяется только на RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588. |
| Параметр | None. |
| Возвращаемое значение | sdk_version: Версии API и драйвера. Тип данных — строка. |
Пример кода:
# Get SDK version
sdk_version = rknn.get_sdk_version()
print(sdk_version)
Пример вывода версии SDK:
==============================================
RKNN VERSION:
API: 1.5.2 (8babfea build@2023-08-25T02:31:12)
DRV: rknn_server: 1.5.2 (8babfea build@2023-08-25T10:30:12)
DRV: rknnrt: 1.5.3b13 (42cbca6f5@2023-10-27T10:13:21)
==============================================
Источник и редакционные примечания
Технические главы разделены по назначению. Код, идентификаторы и параметры сохранены. Китайская версия следует китайскому оригиналу; английская, русская и немецкая — английскому. В главы без иллюстраций вымышленные изображения не добавлены.
Примечания: журналы с 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 и уточняет квантование и стратегии памяти; параметры старой версии не подменяют новый источник.
