Rockchip · AI & Linux Hub

AI-инференс

RKNN-Toolkit2 Python API V2.5.0 — Конфигурация модели и параметры квантования

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

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

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

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

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

3 API конфигурации модели

Перед построением модели RKNN настройте её через интерфейс config.

API config
Описание Задать параметры преобразования модели.
Параметр mean_values: Средние значения входа. Формат параметра — список, содержащий один или несколько вложенных списков средних значений. Для модели с несколькими входами задаётся несколько вложенных списков. Длина каждого соответствует числу каналов входа. Например, [[128,128,128]] означает вычитание 128 из значений каждого из трёх каналов одного входа.
По умолчанию None: все средние равны нулю.
Параметр std_values: Значения нормализации входа. Формат — список с одним или несколькими вложенными списками значений нормализации. Для модели с несколькими входами используется несколько вложенных списков. Длина каждого соответствует числу каналов входа. Например, [[128,128,128]] означает, что из значений трёх каналов одного входа сначала вычитается среднее, затем результат делится на 128.
По умолчанию None: все значения std равны единице.
Параметр quant_img_RGB2BGR: Указывает, нужно ли сначала выполнить RGB2BGR при загрузке изображения для квантования. При нескольких входах соответствующие параметры разделяются ‘,’, например [True, True, False]. По умолчанию False.
Этот параметр обычно применяется к моделям Caffe. При обучении большинства моделей Caffe изображения набора данных сначала преобразуются RGB2BGR; в таком случае нужно задать True.
Параметр действует только для изображений квантования формата jpg/png/bmp. При чтении npy он игнорируется. Поэтому, если вход модели имеет формат BGR, данные npy также должны быть в BGR.
Параметр применяется только при чтении изображений на этапе квантования (интерфейс build) или анализа точности квантования (accuracy_analysis) и не записывается в итоговую модель RKNN. Поэтому для модели с входом BGR необходимо обеспечить формат BGR входных данных до вызова inference инструментария или функции run C-API.
Параметр quantized_dtype: Тип квантования. Поддерживаются “w8a8”, “w4a16”, “w8a16” и “w16a16i_dfp”. По умолчанию “w8a8”.
- w8a8: Веса и активации — 8-битное асимметричное квантование. RK2118 не поддерживается.
- w4a16: Веса — 4-битное симметричное квантование, активации — 16-битные числа с плавающей точкой. Поддерживаются свёртки с ‘group=1’ и постоянными весами, а также MatMul с постоянными входами (инструмент преобразует их в эквивалентные свёртки 1x1); остальные операторы не поддерживаются. Только RK3576/RV1126B.
- w8a16: Веса — 8-битное асимметричное квантование, активации — 16-битные числа с плавающей точкой. Только RK3562.
- w16a16i_dfp: Веса и активации — 16-битное квантование с динамической фиксированной точкой. Только RV1103/RV1106.
Параметр quantized_algorithm: Алгоритм вычисления параметров квантования каждого слоя. Поддерживаются normal, mmse, kl_divergence и gdq. По умолчанию normal.
Алгоритм normal отличается быстротой. Обычно рекомендуют примерно 20-100 образцов для квантования; увеличение количества данных не обязательно повышает точность.
Алгоритм mmse медленнее из-за переборного итерационного метода, но обычно точнее normal. Рекомендуется примерно 20-50 образцов. Количество можно увеличить или уменьшить с учётом времени квантования.
Алгоритм kl_divergence требует больше времени, чем normal, но значительно меньше, чем mmse. В некоторых сценариях (при неравномерном распределении признаков) kl_divergence даёт лучший результат. Рекомендуется примерно 20-100 образцов.
Алгоритм gdq действует только для w4a16 и w8a16 и позволяет повысить точность весов этих типов. Рекомендуется более 200 образцов.
Параметр quantized_method: Поддерживаются layer, channel и group{SIZE}. По умолчанию channel.
- layer: для каждого веса используется только один набор параметров квантования.
- channel: каждый канал весов имеет собственный набор параметров квантования. Обычно channel точнее layer.
- group{SIZE}: на основе channel веса каждого выходного канала дополнительно делятся по входному каналу на группы размера {SIZE}. Каждая группа имеет собственный набор параметров квантования. Обычно group{SIZE} точнее channel. {SIZE} — значение, кратное 32, от 32 до 256, например ‘group32’ или ‘group128’. group{SIZE} действует только при quantized_dtype = w4a16.
Параметр float_dtype: Тип данных с плавающей точкой без квантования. Поддерживается float16. По умолчанию float16.
Параметр optimization_level: Уровень оптимизации модели. По умолчанию 3.
Изменение уровня позволяет отключить некоторые или все правила оптимизации при преобразовании. Значение 3 включает все оптимизации. Значение 2 или 1 отключает часть оптимизаций, способных влиять на точность некоторых моделей. Значение 0 отключает все оптимизации.
Параметр target_platform: Целевая платформа RKNN: ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk2118’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’, ‘rk3588’. В сигнатуре по умолчанию None, но None недопустимо: параметр необходимо указать при вызове config.
Параметр custom_string: Добавить пользовательскую строку в модель RKNN для последующего запроса во время выполнения. По умолчанию None.
Параметр remove_weight: Удалить веса и создать подчинённую модель RKNN, которая может совместно использовать веса полной модели RKNN, чтобы уменьшить потребление памяти. По умолчанию False.
Параметр compress_weight: Сжать веса модели, чтобы уменьшить размер модели RKNN. По умолчанию False.
Параметр single_core_mode: Генерировать ли только одноядерную модель; это может уменьшить размер модели RKNN и потребление памяти. По умолчанию False. Действует только для RK3588 / RK3576. По умолчанию False.
Параметр model_pruning: Прореживание модели: для моделей с разреженными весами уменьшает размер и вычислительную нагрузку преобразованной модели RKNN. По умолчанию False.
Параметр op_target: Задаёт цель выполнения каждой операции (NPU/CPU/GPU и т. д.). Формат: {‘op0_output_name’:’cpu’, ‘op1_output_name’:’cpu’, …}; либо по op_type: {‘op_type’:’cpu‘, ‘op0_output_name’:’cpu’….}. Допускается смешение обоих способов, например {‘op_type’:’cpu‘, ‘op0_output_name’:’cpu’….}. По умолчанию None.
‘op0_output_name’ и ‘op1_output_name’ — имена выходных тензоров соответствующих OP, получаемые из результатов accuracy_analysis. ‘cpu’ и ‘npu’ означают выполнение соответствующего этому тензору OP на CPU или NPU. Доступны ‘cpu’ / ‘npu’ / ‘gpu’ / ‘auto’; ‘auto’ автоматически выбирает цель.
op_type также получают из результатов accuracy_analysis. Этот способ задаёт цель для всех OP данного типа в модели, например {‘Add’:’cpu’, ‘Expand’:’cpu’,….}.
Параметр dynamic_input: Имитирует динамический вход по нескольким наборам форм входов, заданным пользователем. Формат: [[input0_shapeA, input1_shapeA, …], [input0_shapeB, input1_shapeB, …], …].
По умолчанию None; экспериментальная функция.
Например, исходная форма входа [1,3,224,224], [1,3,height,width] или [1,3,-1,-1], но развёртываемая модель должна поддерживать три формы: [1,3,224,224], [1,3,192,192] и [1,3,160,160]. Можно задать dynamic_input=[[[1,3,224,224]], [[1,3,192,192]], [[1,3,160,160]]]. После преобразования в RKNN для инференса следует передавать входные данные соответствующей формы.
Примечания:
1. Функцию можно включить только тогда, когда сама исходная модель поддерживает динамический вход, иначе возникнет ошибка.
2. Если исходная форма динамическая, разные значения можно задавать только для динамических осей.
Параметр quantize_weight: Если ‘do_quantization’ в rknn.build равно False, уменьшает размер модели rknn квантованием части весов.
По умолчанию False.
Параметр remove_reshape: Удаляет возможные ‘Reshape’ на входах и выходах модели для повышения производительности выполнения. По умолчанию False.
Примечание: включение может изменить форму входных или выходных узлов. Следите за предупреждениями при преобразовании и учитывайте изменение форм при развёртывании.
Параметр sparse_infer: Разреженный инференс для уже разреженных моделей с целью повышения производительности. Только RK3576/RV1126B. По умолчанию False.
Параметр enable_flash_attention: Включать ли Flash Attention. По умолчанию False.
Примечание: FlashAttention основан на https://arxiv.org/abs/2307.08691; использование кэша внутри цикла позволяет ускорить обработку и снизить расход пропускной способности. Однако размер модели может увеличиться. Выбирайте настройку с учётом конкретной модели и сценария. Подробнее см. описание ‘exSDPAttention’ в ‘RKNN Compiler Support Operator List’.
Параметр auto_hybrid_cos_thresh: Порог косинусного расстояния для автоматического смешанного квантования модели. По умолчанию 0.98.
Параметр auto_hybrid_euc_thresh: Порог евклидова расстояния для автоматического смешанного квантования модели. По умолчанию None, то есть не включён.
Параметр memory_plan_strategy: Схема распределения внутренней памяти при компиляции RKNN, влияющая на потребление памяти при инференсе. Варианты: “BestFit”, “GreedyBySize”, “GreedyByLifetime”, “SlowPeakGrowth”. По умолчанию “BestFit”.
BestFit — задачи сортируются по времени начала, а при равенстве — по убыванию объёма памяти. Адреса выделяются последовательно; среди свободных блоков в уже распределённом пространстве выбирается ближайший по размеру к текущей задаче.
GreedyBySize — сортировка по требуемому объёму памяти, при равенстве раньше выполняется задача с более ранним началом. Память выделяется последовательно с поиском ближайшего по размеру свободного блока в уже распределённом пространстве.
GreedyByLifetime — сортировка по началу, при равенстве приоритет большему объёму. Конечные адреса выделенных блоков и адрес 0 используются как кандидаты; выбирается адрес с наиболее длительным жизненным циклом без конфликта в нижней области. Обход повторяется до завершения распределения.
SlowPeakGrowth — сортировка по началу, при равенстве приоритет большему объёму. Конечные адреса выделенных блоков и адрес 0 используются как кандидаты. Выбираются задача с минимальным ростом пикового потребления и адрес без конфликта в нижней области; обход повторяется до завершения распределения.
Параметр compute_order: Топологический порядок графа при инференсе RKNN. Влияет на внутреннюю память некоторых моделей, особенно с несколькими ветвями. Варианты “WidthFirst” и “DepthFirst”; по умолчанию “WidthFirst”.
Возвращаемое значение 0: Конфигурация успешна.
При недопустимой конфигурации возникает ValueError.

Пример кода:

# model config
rknn.config(mean_values=[[103.94, 116.78, 123.68]],
           std_values=[[58.82, 58.82, 58.82]],
           quant_img_RGB2BGR=True,
           target_platform='rk3566')

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

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

Примечания: журналы с 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

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