RKNN
RKNN adalah format NPU terkompilasi milik Rockchip. LibreYOLO mengekspor ONNX perantara opset-19, mengompilasinya dengan SDK RKNN Toolkit2, dan dapat membandingkan graf hasil kompilasi dengan ONNX Runtime di simulator host Toolkit2 tanpa perlu board.
- Flag
export(format="rknn", name="rk3588")- Menulis
- Satu berkas .rknn, satu sidecar .rknn.metadata.json, dan satu laporan .rknn.parity.json saat verify=True
- Ekstra
- Tidak ada di PyPI. rknn-toolkit2 adalah SDK vendor yang dipasang sendiri.
- Dimuat kembali
- Tidak lewat LibreYOLO. Artefaknya berjalan di board dengan runtime milik Rockchip.
- Bentuk
- Persegi tetap, batch 1, opset 19. Ketiganya diwajibkan.
- Presisi
- Build floating milik vendor. half=True dan int8=True ditolak.
- Cakupan
- Empat varian deteksi di RK3588: YOLO9-t, YOLO9-E2E-t, PicoDet-s dan YOLO-NAS-s
Instalasi
Kompilasi membutuhkan RKNN Toolkit2 milik Rockchip, yang didistribusikan sebagai
SDK vendor di bawah lisensi Rockchip sendiri dan bukan dependensi LibreYOLO. Tidak
ada ekstra libreyolo[rknn], dan tidak ada bagian dari format ini yang terpasang
lewat satu baris perintah.
pip install "libreyolo[onnx]"# rknn-toolkit2 adalah SDK Rockchip dengan lisensi terpisah. LibreYOLO# tidak membundelnya maupun memasangnya. Hanya untuk Linux x86_64; di# Windows pakai WSL2 atau container Linux.## Toolkit2 2.3.2 membutuhkan setuptools<81 dan gagal pada ONNX 1.19 atau# lebih baru, yang menghapus onnx.mapping padahal compiler-nya masih# mengimpornya.pip install "setuptools==80.9.0" "onnx==1.18.0" # Lalu pasang wheel rknn-toolkit2 yang sesuai dari repository wheel milik# Rockchip sendiri, dan pastikan wheel itu bisa diimpor:python -c "import rknn.api; print('rknn-toolkit2 ready')"Board tidak diperlukan untuk mengompilasi maupun memeriksa paritas numerik. Board RK3588 diperlukan untuk pengukuran latensi, daya dan termal, dan tidak satu pun dari pengukuran itu yang sudah dicatat.
Ekspor
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Menulis weights/LibreYOLO9t.rknn dan 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 platform; target= dan target_platform= juga bisa imgsz=640, # harus cocok dengan kanvas yang tercatat untuk varian itu batch=1, # nilai lain memunculkan NotImplementedError dynamic=False, # True memunculkan ValueError opset=19, # nilai lain memunculkan NotImplementedError verify=False, # True menjalankan simulator PC dan menjadikan paritas gerbang)Permintaan divalidasi terhadap daftar varian model yang persis sebelum apa pun
dikompilasi, dan kanvasnya juga divalidasi: memberikan imgsz selain nilai yang
tercatat untuk varian tersebut akan memunculkan error alih-alih diam-diam
mengompilasi sesuatu yang belum diuji. LibreYOLO menulis ONNX perantara opset-19,
mengompilasinya, secara opsional menyimulasikannya, lalu menghapus berkas
perantara itu setelahnya.
Metadata ditulis sebagai sidecar bernama <model>.rknn.metadata.json, karena
format RKNN tidak punya field metadata yang portabel.
verify=True menjalankan simulator PC Toolkit2 di dalam sesi yang sama dengan
sesi yang mengompilasi artefaknya, membandingkan setiap output dengan ONNX Runtime
pada input yang sama, lalu menulis <model>.rknn.parity.json berisi metrik error
per output. Gerbangnya adalah cosine similarity minimal 0.9999 dan RMSE
ternormalisasi maksimal 0.02, yang diterapkan pada output mana pun yang belum
dekat secara elementwise; build floating milik vendor menurunkan tensor internal ke
half precision, sehingga allclose yang ketat tidak terpenuhi bahkan ketika box
hasil decoding sudah stabil. Run yang gagal menulis
<model>.rknn.failed.parity.json, membuang kandidatnya, dan membiarkan hasil
ekspor sukses sebelumnya di path itu tetap utuh.
Untuk membandingkan artefak ONNX yang sudah ada, tanpa mengekspor ulang:
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)Simulator Toolkit2 menjalankan graf in-memory yang dihasilkan load_onnx dan
build. Simulator itu tidak bisa memuat ulang berkas .rknn yang spesifik untuk
satu target tanpa board, dan itulah sebabnya verify=True melakukan kompilasi,
ekspor dan simulasi dalam satu sesi.
Menjalankan artefak
Tidak ada entri RKNN di libreyolo/backends, jadi LibreYOLO() tidak memuat
berkas .rknn. Artefak hasil kompilasi diterapkan ke board dan dijalankan oleh
runtime milik Rockchip sendiri, dan di sana preprocessing, decoding, NMS serta
penskalaan ulang koordinat menjadi tanggung jawab aplikasi.
<model>.rknn.metadata.json membawa nama kelas, ukuran input, task dan target
platform, yaitu apa yang dibutuhkan sebuah aplikasi untuk mereproduksi
postprocessing LibreYOLO. Kirimkan berkas itu bersama model hasil kompilasi.
Untuk pemeriksaan di sisi host yang tidak membutuhkan board, simpan artefak ONNX dengan bentuk tetap yang sama lalu bandingkan di simulator, seperti di atas.
Batasan
Empat kombinasi bisa dikompilasi, dan semuanya adalah varian model, bukan family:
| Varian | Task | Kanvas | Target |
|---|---|---|---|
| YOLO9-t | detect | 640 | RK3588 |
| YOLO9-E2E-t | detect | 640 | RK3588 |
| PicoDet-s | detect | 320 | RK3588 |
| YOLO-NAS-s | detect | 640 | RK3588 |
Selain itu semuanya ditolak sebelum kompilasi, dengan pesan bahwa RKNN pada versi
ini terbatas pada varian deteksi yang persis diuji di simulator. Hasil yang hanya
sampai tahap kompilasi untuk model lain memang ada, tetapi sengaja tidak disajikan
sebagai dukungan: pada run pengukuran yang sama, RF-DETR menyisakan dua node
GridSample di decoder tanpa lowering, sedangkan D-FINE, RT-DETR, RT-DETRv2,
RT-DETRv4, DEIM, DEIMv2 dan EC berhasil dikompilasi dan disimulasikan tetapi
dengan output hasil decoding yang salah secara signifikan.
Batch 1, bentuk statis, opset 19. half=True ditolak, karena RKNN tidak
mengekspos kontrak half milik LibreYOLO, dan int8=True ditolak sampai ada
kalibrasi yang representatif beserta hasil akurasi per task.
Target Rockchip lainnya ditolak: rk3588 adalah satu-satunya platform yang
tervalidasi.
Untuk grid family dan task selengkapnya, lihat matriks ekspor. Untuk satu kombinasi:
libreyolo formats --family yolo9 --task detect