Отчёт: настройка виртуальной машины и сборка компонентов ASR для RK3562
1. Общая схема работы
Виртуальная машина с Lubuntu использовалась как среда разработки. На ней выполнялись три ключевые задачи: конвертация нейросетевых моделей распознавания речи в формат RKNN, кросс-компиляция исполняемых файлов под aarch64, патчинг исходного кода под конкретные модели. Готовые артефакты переносились на плату RK3562 через
FTP.
2. Базовое окружение виртуальной машины
Операционная система: Lubuntu.
Тулчейн для кросс-компиляции: Buildroot 2024.02 для RK3562.
Путь к тулчейну: /home/user/src/buildroot-2024.02-rk3562-sk/output/host/bin
Кросс-компилятор: aarch64-linux-gcc версии 12.3.0.
Sysroot: /home/user/src/buildroot-2024.02-rk3562-sk/output/host/aarch64-buildroot-linux-gnu/sysroot
Менеджер окружений: Miniforge3.
Путь: /home/user/miniforge3
Причины использования Miniforge: изоляция Python-окружений из-за конфликтов зависимостей. Компоненты rknn-toolkit2 и sherpa-onnx требуют разных версий numpy, protobuf и onnx, поэтому их нельзя ставить в одну среду.
3. Окружения Python в виртуальной машине
Созданы два изолированных окружения.
3.1. Окружение rknn
Назначение: конвертация ASR-моделей Whisper и T-one в формат rknn.
Создание:
conda create -n rknn python=3.10 -y
Версия RKNN-Toolkit2: сначала 2.2.0, затем обновлена до 2.3.2.
Установка RKNN-Toolkit2 2.2.0:
pip install rknn-toolkit2/rknn-toolkit2/packages/rknn_toolkit2-2.2.0-cp310-cp310-manylinux-2-17-x86-64.manylinux2014-x86-64.whl
Обновление до 2.3.2:
pip install rknn-toolkit2-2.3.2/rknn-toolkit2/packages/x86-64/rknn_toolkit2-2.3.2-cp310-cp310-manylinux-2-17-x86-64.manylinux2014-x86-64.whl
Дополнительные пакеты:
onnx 1.16.1 (RKNN 2.3.2 требует именно эту версию или выше)
onnxoptimizer 0.2.7
onnxsim 0.7.3
soundfile 0.14.0
setuptools версии младше 81 (иначе pkg_resources удалён и RKNN не стартует)
Важный нюанс: setuptools 84.0.0 не работает с RKNN-Toolkit2. Решение:
pip install setuptools меньше 81
3.2. Базовое окружение base
Использовалось для скачивания моделей через утилиту hf, работы с git и lftp.
Ключевые утилиты:
huggingface_hub с командой hf
lftp для передачи файлов на плату
git для клонирования репозиториев
Переменные для работы с зеркалом Hugging Face:
HF_ENDPOINT указывается как
https://hf-mirror.com
HF_HUB_DISABLE_XET указывается как 1
4. Установка RKNN-Toolkit2 в виртуальной машине
Использовался репозиторий rknn-toolkit2 с GitHub.
Клонирование:
git clone
https://github.com/airockchip/rknn-toolkit2.git
Переключение на тег:
git checkout v2.2.0
Структура пакетов внутри репозитория:
rknpu2/runtime/Linux/librknn-api/include/rknn-api.h
rknpu2/runtime/Linux/librknn-api/aarch64/librknnrt.so
Эти файлы использовались для компиляции C++ демо и линковки sherpa-onnx и rknn-whisper-demo.
5. Кросс-компиляция исполняемых файлов
Все C++ компоненты собирались через Buildroot-тулчейн. Ниже — по компонентам.
5.1. sherpa-onnx для Zipformer
Источник: k2-fsa/sherpa-onnx.
Клонирование:
git clone
https://github.com/k2-fsa/sherpa-onnx.git
Для указания путей к RKNN использовались переменные окружения. Приводим их без символов доллара, чтобы избежать проблем с копированием.
Первая переменная — путь к RKNN-Toolkit2. В реальном имени переменной используются символы подчёркивания:
SHERPA (подчёркивание) ONNX (подчёркивание) RKNN (подчёркивание) TOOLKIT2 (подчёркивание) PATH равно /home/user/npu/rknn-toolkit2
Вторая переменная — путь к библиотеке librknnrt.so:
SHERPA (подчёркивание) ONNX (подчёркивание) RKNN (подчёркивание) TOOLKIT2 (подчёркивание) LIB (подчёркивание) DIR равно /home/user/npu/rknn-toolkit2/rknpu2/runtime/Linux/librknn-api/aarch64
Третья переменная — путь к заголовкам rknn-api.h:
CPLUS (подчёркивание) INCLUDE (подчёркивание) PATH равно /home/user/npu/rknn-toolkit2/rknpu2/runtime/Linux/librknn-api/include
Записать все три переменные перед запуском cmake, каждая в отдельной строке:
export SHERPA-ONNX-RKNN-TOOLKIT2-PATH=/home/user/npu/rknn-toolkit2
export SHERPA-ONNX-RKNN-TOOLKIT2-LIB-DIR=/home/user/npu/rknn-toolkit2/rknpu2/runtime/Linux/librknn-api/aarch64
export CPLUS-INCLUDE-PATH=/home/user/npu/rknn-toolkit2/rknpu2/runtime/Linux/librknn-api/include
Внимание: в реальных именах переменных вместо дефисов должны стоять символы подчёркивания.
Команда конфигурации CMake (одной строкой):
cmake .. -DCMAKE-TOOLCHAIN-FILE=/home/user/src/buildroot-2024.02-rk3562-sk/output/host/share/buildroot/toolchainfile.cmake -DCMAKE-SYSTEM-NAME=Linux -DCMAKE-SYSTEM-PROCESSOR=aarch64 -DCMAKE-INSTALL-PREFIX=./install -DCMAKE-BUILD-TYPE=Release -DBUILD-SHARED-LIBS=OFF -DSHERPA-ONNX-ENABLE-RKNN=ON -DSHERPA-ONNX-ENABLE-PORTAUDIO=OFF -DSHERPA-ONNX-ENABLE-TESTS=OFF -DSHERPA-ONNX-ENABLE-PYTHON=OFF -DSHERPA-ONNX-ENABLE-CHECK=OFF -DSHERPA-ONNX-ENABLE-JNI=OFF -DSHERPA-ONNX-ENABLE-WEBSOCKET=OFF
Скачивание ONNX Runtime для aarch64 выполнено вручную (иначе CMake падал по SSL):
файл onnxruntime-linux-aarch64-static-lib-1.28.2-glibc2-17.zip
положить в /home/user/Downloads
Контрольная сумма SHA256 этого файла:
fba13fa68dbc9305512869bfa74f53a15e7af983c44ba8a9cbecbce5c21b33b3
Сборка:
make -j4
Результат:
bin/sherpa-onnx размером 32 МБ, статический, в зависимостях только librknnrt.so.
Особенность: сборка статическая, на плате не нужны libstdc++ и другие разделяемые библиотеки.
5.2. Демо rknn-whisper-demo для Whisper
Источник: airockchip/rknn-model-zoo.
Клонирование и выбор версии:
git clone
https://github.com/airockchip/rknn-model-zoo.git
git checkout v2.3.2
Патч CMakeLists.txt для устранения ошибки компоновки libfftw3f.a (собрана без флага PIC). Добавлены три строки после project(rknn-whisper-demo):
set(CMAKE-C-FLAGS с добавлением -fno-pie)
set(CMAKE-CXX-FLAGS с добавлением -fno-pie)
set(CMAKE-EXE-LINKER-FLAGS с добавлением -no-pie)
Команды сборки:
cd /home/user/npu/rknn-model-zoo
export GCC-COMPILER=/home/user/src/buildroot-2024.02-rk3562-sk/output/host/bin/aarch64-linux
./build-linux.sh -t rk356x -a aarch64 -d whisper
Готовые компоненты для платы:
install/rk356x-linux-aarch64/rknn-whisper-demo/rknn-whisper-demo
install/rk356x-linux-aarch64/rknn-whisper-demo/lib/librknnrt.so
install/rk356x-linux-aarch64/rknn-whisper-demo/lib/librga.so
5.3. Собственные тесты ASR
Написаны вручную для отладки T-one.
test-tone.cpp — простой тест загрузки RKNN-модели.
diag-compare.cpp — сравнение выходов ONNX и RKNN на одном входе.
diag-multi.cpp — пошаговая диагностика по всем чанкам.
test-ru.cpp — тест ASR T-one с разными масштабами входа.
Сборка (пример для test-ru):
export PATH равный /home/user/src/buildroot-2024.02-rk3562-sk/output/host/bin плюс существующий PATH
aarch64-linux-gcc test-ru.cpp -o test-ru -I/home/user/npu/rknn-toolkit2/rknpu2/runtime/Linux/librknn-api/include -L/home/user/npu/rknn-toolkit2/rknpu2/runtime/Linux/librknn-api/aarch64 -lrknnrt
6. Конвертация моделей
6.1. Whisper-base в формат rknn
Исходные модели: whisper-encoder-base-20s.onnx размером 78 МБ и whisper-decoder-base-20s.onnx размером 299 МБ.
Источник: официальный скрипт download-model.sh из rknn-model-zoo.
Скачивание:
cd /home/user/npu/rknn-model-zoo/examples/whisper/model
chmod +x download-model.sh
./download-model.sh
Скрипт конвертации: rknn-model-zoo/examples/whisper/python/convert.py
Команды:
cd ../python
python convert.py ../model/whisper-encoder-base-20s.onnx rk3562
python convert.py ../model/whisper-decoder-base-20s.onnx rk3562
Результат:
whisper-encoder-base-20s.rknn размером 41 МБ
whisper-decoder-base-20s.rknn размером 152 МБ
Режим квантизации по умолчанию: FP16.
6.2. T-one в формат rknn — неудачная попытка
Источник: t-tech/T-one на Hugging Face.
Скачанные файлы:
model.safetensors размером 274 МБ
model.onnx размером 138 МБ
config.json, vocab.json и другие
Этапы подготовки ONNX-модели:
Первый этап — фиксация динамических размеров через onnxsim. Скрипт patch-fixed.py. Результат: model-fixed.onnx с числом нод 1617 вместо 3028.
Второй этап — патч Clip. Скрипт patch-clip.py. Устранение ошибки Type Error, связанной с типами INT32 и INT64 в операторе Clip.
Третий этап — замена Min и Max на Identity. Скрипт patch-min.py. Обход ошибки swap-transpose-expand в RKNN-Toolkit2.
Четвёртый этап — приведение INT32 к FP32. Скрипт patch-int32.py. Результат: model-fp32.onnx.
Пятый этап — константные маски. Скрипт patch-mask-v2.py. Замена цепочки Expand, GreaterOrEqual, Not и Slice на константы. Результат: model-mask-const.onnx.
Скрипты конвертации:
convert-tone.py — базовая конвертация FP16
convert-w8a8.py — квантизация w8a8
convert-w16.py — квантизация w16a16i, провал из-за отсутствия поддержки
Все конфигурации квантизации оказались нерабочими для RK3562.
7. Патчинг Python-скриптов для русского языка
Для Whisper добавлена поддержка русского языка. Все патчи делались в виртуальной машине.
7.1. Скрипт whisper-ru.py
Заменяет блок обработки задач. Добавляет task-code равный 50263 (токен начала русского языка). Использует файл vocab-en.txt как полный многоязычный словарь.
Запуск:
python whisper-ru.py
Результат: файл whisper-ru-patched.py.
7.2. Скрипт patch-bpe.py
Добавляет в whisper-ru-patched.py:
функцию bytes-to-unicode для обратного преобразования байтов
функцию decode-bpe для декодирования кириллицы
патч блока обработки результата с применением decode-bpe для task-code равного 50263
Запуск:
python patch-bpe.py
7.3. Патч C++ файла whisper.cc
Добавлены:
функция build-byte-decoder — карта декодирования byte-level BPE
функция decode-bpe-ru — декодирование UTF-8 в кириллицу
подключение заголовков map и string
патч блока обработки результата в функции inference-decoder-model
Запуск патча:
cd /home/user/npu/rknn-model-zoo/examples/whisper/cpp/rknpu2
python patch-ru-bpe.py
7.4. Патч main.cc
Добавлена опция ru в парсинг задач:
vocab-path равен ./model/vocab-en.txt
task-code равен 50263
8. Вспомогательные утилиты
Для подготовки тестовых данных:
prep-wav.py — конвертирует WAV в 8 кГц mono float32.
Команда: python prep-wav.py my-ru.wav my-ru-8k.raw
Для диагностики T-one:
find-int32.py — поиск операций INT32 в ONNX-графе.
analyze-expand.py — анализ узлов Expand.
trace-chain.py — трассировка цепочки потребителей тензора.
extract-all-masks.py — извлечение константных масок внимания.
9. Передача файлов на плату
Все артефакты передавались через
FTP. На плате настроен FTP-сервер с адресом 192.168.0.136.
Утилита: lftp.
Пример загрузки одного файла:
lftp -u root,root 192.168.0.136
set xfer:clobber on
cd /root/voice/whisper-demo
put rknn-whisper-demo -o rknn-whisper-demo
bye
Особенность: обязательно использовать команду set xfer:clobber on, иначе lftp не перезаписывает существующие файлы.
10. Специфические артефакты для платы
После всех сборок и патчей на плату перенесены следующие файлы.
Для Whisper:
whisper-encoder-base-20s.rknn размером 41 МБ
whisper-decoder-base-20s.rknn размером 152 МБ
rknn-whisper-demo размером 1 МБ
librknnrt.so размером 7.7 МБ
librga.so размером 197 КБ
vocab-en.txt, vocab-zh.txt
mel-80-filters.txt
Для Zipformer russian, работающего на CPU:
encoder.onnx размером 86 МБ
decoder.onnx размером 2 МБ
joiner.onnx размером 1 МБ
tokens.txt
бинарник sherpa-onnx-alsa из сборки sherpa-onnx-v1.12.18-rknn-linux-aarch64-static
Для VAD:
silero-vad.onnx размером 629 КБ
бинарник sherpa-onnx-vad-alsa
11. Итоговая схема работы в виртуальной машине
Шаг 1. Скачивание исходной модели через утилиту hf или wget.
Шаг 2. Патчинг ONNX: onnxsim для фиксации размеров, замена неподдерживаемых операторов.
Шаг 3. Конвертация в RKNN через соответствующее окружение.
Шаг 4. Кросс-компиляция C++ демо через Buildroot-тулчейн.
Шаг 5. Передача артефактов на плату через lftp.
Шаг 6. Запуск на плате с настройкой переменной LD-LIBRARY-PATH.
Каждый этап выполнен для двух моделей:
Whisper-base (ASR) — конвертация в RKNN, успешно
T-one (ASR) — конвертация в RKNN, неудачно из-за архитектурных ограничений