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