RKNN
RKNN є скомпільованим форматом для NPU Rockchip. LibreYOLO експортує проміжний файл ONNX з opset 19, компілює його за допомогою SDK RKNN Toolkit2 і може порівняти скомпільований граф з ONNX Runtime у симуляторі Toolkit2 на хості без плати.
- Прапорець
export(format="rknn", name="rk3588")- Створює
- Один файл .rknn, супровідний файл .rknn.metadata.json і звіт .rknn.parity.json із verify=True
- Додатково
- Нічого в PyPI. rknn-toolkit2 є SDK виробника, який потрібно встановити самостійно.
- Повторне завантаження
- Не через LibreYOLO. Артефакт працює на платі із середовищем виконання Rockchip.
- Форми
- Фіксовані квадратні, батч 1, opset 19. Усі три умови примусово застосовуються.
- Точність
- Збірка з рухомою комою від виробника. half=True та int8=True відхиляються.
- Охоплення
- Чотири варіанти виявлення на RK3588: YOLO9-t, YOLO9-E2E-t, PicoDet-s і YOLO-NAS-s
Встановлення
Для компіляції потрібен RKNN Toolkit2 від Rockchip, який поширюється як SDK
виробника за власною ліцензією Rockchip і не є залежністю LibreYOLO. Додаткового
набору libreyolo[rknn] немає, і для цього формату не існує однорядкової команди
встановлення всього потрібного.
pip install "libreyolo[onnx]"# rknn-toolkit2 є SDK Rockchip з окремою ліцензією. LibreYOLO# не постачає й не встановлює його. Лише x86_64 Linux; у Windows# використовуйте WSL2 або контейнер Linux.## Toolkit2 2.3.2 потребує setuptools<81 і не працює з ONNX 1.19 або новішою,# оскільки його компілятор досі імпортує вилучений модуль onnx.mapping.pip install "setuptools==80.9.0" "onnx==1.18.0" # Потім установіть відповідний пакунок rknn-toolkit2 із власного# репозиторію Rockchip і перевірте імпорт:python -c "import rknn.api; print('rknn-toolkit2 ready')"Плата не потрібна для компіляції або перевірки числового паритету. Плата RK3588 потрібна для вимірювання затримки, потужності й теплових характеристик, але таких вимірювань не записано.
Експорт
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Створює weights/LibreYOLO9t.rknn і weights/LibreYOLO9t.rknn.metadata.jsonpath = model.export(format="rknn", name="rk3588", imgsz=640, verify=True)print(path)libreyolo export --model LibreYOLO9t.pt --format rknn --name rk3588 \ --imgsz 640 --verifymodel.export( format="rknn", name="rk3588", # цільова платформа; target= і target_platform= також працюють imgsz=640, # має відповідати записаному полотну варіанта batch=1, # будь-яке інше значення спричиняє NotImplementedError dynamic=False, # True спричиняє ValueError opset=19, # будь-яке інше значення спричиняє NotImplementedError verify=False, # True запускає симулятор на ПК і перевіряє пороги паритету)Перед компіляцією запит перевіряється за переліком точних варіантів моделей,
також перевіряється полотно. Якщо передати imgsz, відмінний від записаного для
варіанта, виникне помилка замість непомітної компіляції неперевіреної комбінації.
LibreYOLO записує проміжний файл ONNX з opset 19, компілює його, за бажанням
симулює, а потім видаляє проміжний файл.
Метадані зберігаються в супровідному файлі <model>.rknn.metadata.json, оскільки
формат RKNN не має переносного поля метаданих.
verify=True запускає симулятор Toolkit2 на ПК у тому самому сеансі, де
скомпільовано артефакт, порівнює кожен вихід з ONNX Runtime на тому самому вході
та записує <model>.rknn.parity.json із метриками помилок для кожного виходу.
Порогами є косинусна подібність щонайменше 0.9999 і нормалізована RMSE не більше
0.02. Їх застосовано до кожного виходу, який ще не є поелементно близьким. Збірка
виробника з рухомою комою знижує внутрішні тензори до половинної точності, тому
суворе allclose не виконується, навіть коли декодовані рамки стабільні. У разі
невдачі записується <model>.rknn.failed.parity.json, кандидат відкидається, а
попередній успішний експорт за цим шляхом залишається без змін.
Щоб порівняти вже наявний артефакт ONNX без повторного експорту:
import numpy as npfrom libreyolo.export import verify_rknn_simulator_parity input_tensor = np.random.default_rng(0).standard_normal( (1, 3, 640, 640), dtype=np.float32)metrics = verify_rknn_simulator_parity( "weights/LibreYOLO9t.onnx", input_tensor, target_platform="rk3588", rtol=1e-3, atol=1e-4, raise_on_failure=False,)print(metrics)Симулятор Toolkit2 запускає граф у пам'яті, створений за допомогою load_onnx і
build. Він не може повторно завантажити цільовий файл .rknn без плати, тому
verify=True виконує компіляцію, експорт і симуляцію за один сеанс.
Запуск артефакту
У libreyolo/backends немає запису RKNN, тому LibreYOLO() не завантажує файл
.rknn. Скомпільований артефакт розгортається на платі й виконується у власному
середовищі Rockchip. Попередня обробка, декодування, NMS і масштабування координат
там покладаються на застосунок.
<model>.rknn.metadata.json містить назви класів, розмір входу, завдання й
цільову платформу, тобто все потрібне застосунку для відтворення подальшої
обробки LibreYOLO. Постачайте його разом зі скомпільованою моделлю.
Для перевірки на хості без плати збережіть артефакт ONNX із такою самою фіксованою формою й порівняйте його в симуляторі, як показано вище.
Обмеження
Компілюються чотири комбінації, визначені варіантами моделей, а не сімействами:
| Варіант | Завдання | Полотно | Ціль |
|---|---|---|---|
| YOLO9-t | detect | 640 | RK3588 |
| YOLO9-E2E-t | detect | 640 | RK3588 |
| PicoDet-s | detect | 320 | RK3588 |
| YOLO-NAS-s | detect | 640 | RK3588 |
Усе інше відхиляється перед компіляцією з повідомленням, що RKNN у цій версії
обмежено точними варіантами виявлення, перевіреними в симуляторі. Результати
лише компіляції для інших моделей існують, але навмисно не подаються як
підтримувані. У тому самому вимірюванні в RF-DETR залишилися два незнижені вузли
декодера GridSample, а D-FINE, RT-DETR, RT-DETRv2, RT-DETRv4, DEIM, DEIMv2 і EC
скомпілювалися та симулювалися з істотно неправильними декодованими виходами.
Батч 1, статичні форми, opset 19. half=True відхиляється, оскільки RKNN не
надає контракт half бібліотеки LibreYOLO, а int8=True відхиляється, доки не
з'являться результати для репрезентативного калібрування й правильності завдань.
Інші цільові платформи Rockchip відхиляються: rk3588 є єдиною валідованою
платформою.
Повну таблицю сімейств і завдань наведено в матриці експорту. Для однієї комбінації:
libreyolo formats --family yolo9 --task detect