Как стать автором
Обновить

AI, FreeRTOS и Linux в кармане: возможности LicheeRV Nano

Уровень сложностиСредний
Время на прочтение63 мин
Количество просмотров11K
Всего голосов 31: ↑31 и ↓0+34
Комментарии64

Комментарии 64

Во-первых, как обычно, очень мощная работа и статья! Спасибо!

Первое впечатление - столько ядер и ОС, а памяти всего 256Мб на всё. Без возможности расширить. И на них 2 ОС с ИИ крутить?

После изучения LuckFox Pico и LicheeRV Nano можете их сравнить?

Да, памяти действительно мало, но мне кажется, что это очередная попытка китайцев сэкономить. Теперь о сравнении:

  • WiFi на плате LicheeRV Nano - однозначно плюс, потому что к Luckfox Pico адекватно добавить поддержку WiFi можно только через самодельный шилд/hat. А это не так удобно

  • Производительность CPU примерно одинаковая у обоих, но возможность выбора ARM/RISC-V под Linux я считаю бесполезной, лучше бы под Linux было 2 ядра и 1 под RTOS

  • Производительность NPU: у LicheeRV Nano оно быстрее в 2 раза, но что тоже интересно - LicheeRV Nano поддерживает BF16 (пока не завёлся, но я решу эту проблему).

  • Разработка под NPU. NPU решает очень узкий набор задач, поэтому необходимо портировать модель под него. У LicheeRV Nano TDL SDK опенсурсный, поэтому потенциально есть возможность портировать любую модель (конечно, это только на словах легко). RKNN Toolkit - закрытый, если он не поддерживает какой - то слой/функцию, то кастомную модель придётся переделывать. YOLO и набор основных SOTA нейронок портирован на обоих фреймворках, но портирование кастомных моделей может вызывать трудности (но это в целом проблема всех NPU, заявленная поддержка ONNX моделей не означает, что любую модель можно запустить).

  • Камеры. У Luckfox Pico "нестандартный" CSI разъём. У LicheeRV Nano хотя бы разъём подходит под камеры Raspberry PI, но с софтом/драйверами пока есть проблемы. На обоих платах сложно завести камеру не от производителя платы. Хотя Luckfox Pico судя по тексту из документации не планируют заниматься поддержкой других камер.

  • Документация. У LicheeRV Nano она намного хуже (мало тем рассмотрено), чем у Luckfox Pico

  • Поддержка FreeRTOS на втором ядре однозначно плюс для LicheeRV Nano

  • GPIO пины: LicheeRV Nano с включенным WiFi фактически не имеет аппаратных SPI и I2C, что очень неприятно

В общем, LicheeRV Nano мне кажется более перспективной платой для более сложных проектов, но маленький объём оперативки и всего одно ядро под Linux - две основные проблемы.

LuckFox pico max, вроде, на RV 1106G3 и тоже даёт 1TOPS, как и LeechRV. И тоже 256Mb RAM DDR3L. А если ей хирургически отрезать эзернет разъём, то и размер будет на четверть меньше

В общем я заказал LuckFox pico max 256 с 1106G3, внятного даташита я не нашёл (не совсем понятно точно ли там 1 TOPS на int8, проверю экспериментально). И если там действительно 1 TOPS, то можно будет провести интересный эксперимент: при одинаковой базовой YOLO модели и входных данных сравнить скорость инференса на разных платах (LicheeRV Nano и LuckFox pico max 256). Всё-таки у Rockchip и SOPHGO разные NPU и SDK под них, интересно есть ли разница в "качестве их софта" или, например, обвязка вокруг SoC'а может влиять на скорость работы.

используйте Radxa zero 3 на rk3566. Стоит 2500р, сильно быстрее и лучше. 4 ядра Cortex-A55, 1 или 2 или 4 или 8 GB. Нет геморроя со сборкой в docker (когда забудете сделать save config), кросс-компилятор buildroot (а еще свой старый debian, и новый armbian на последнем ядре). И главное - поддерживает множество сенсоров камер c isp.

У milk-v duo не завезли V4L2. Вот совсем. Обещали прошлым летом, was и ныне tam.

Спасибо! Попробую потестировать Radxa. Судя по характеристикам, действительно, очень интересная плата

Luckfox видимо ещё сами не решили какая производительность у NPU на RV1106G3. В одном месте написано 0.5 для всей линейки:

На странице плат с RV1106 упоминается 1 TOPS:

В итоге, приехала мне LuckFox Pico Max, процессор RV1106G3 и на Yolov8 с изображениями 640x640 он выдаёт 14 FPS (чуть больше, чем Luckfox Pico, у которой 11 FPS). К сожалению, это явно не 1 TOPS...

Мощная статья.

Нубский вопрос: в начале в разделе "Энергопотребление", чем вы его меряли и делали такие красивые скрины?

Китайский USB тестер (примерно как на скриншоте ниже). У меня версия с Bluetooth и для него есть приложение под android, которое графики и рисует (и даже в csv вроде может экспортировать), ну и потом я скриншоты немного в GIMP'е обрабатывал (обрезал, текст подписывал) и всё.

Из графиков не понял как определить потребление в ваттах. Синяя линия - это ток по правой оси. А жёлтая - напряжение? Почему тогда 0.1в?

Не хватает легенды.

Жёлтая - мощность в Ватах. Синяя - ток. Слева ось для напряжения, но так как там 5 Вольт, то её нормально не видно. Но соглашусь, что графики не сразу понятны.

Использование Python на этой плате нецелесообразно, ввиду ограниченности ресурсов.

Что конкретно помешает нормальной работе сетевых приложений под python?

Маленькое количество оперативной памяти, сам интерпретатор заберёт достаточно много. Так же сам процесс получения из кадра итогового массива объектов, обнаруженных через YOLO состоит из нескольких шагов. Инференс происходит на NPU и тут Python сильно не проиграет по скорости, но далее результаты с NPU пост-обрабатываются ещё на процессоре (NMS фильтр). Тут Python сильно тормозит

А если рассматривать плату для сервера на python? Без обработки изображений.

Можете ли порекомендовать более подходящую плату подобного формата?

Где - то выше предлагали Radxa zero 3, она чуть больше, но гораздо более производительная. В целом, Python сервер можно и на LicheeRV Nano запустить, работать будет, но тут вопрос в том, какая будет нагрузка

В репозитории Sipeed я открыл issue, касающееся этой камеры, и планируется вести обсуждение поддержки камеры там

Есть шанс запустить камеру?
После такой роскошной статьи захотелось тоже попробовать, но покупать дорогую не очень стандартную родную камеру не хотелось бы, от малинки стоит всего пару баксов и переходник меньше бакса.

Пока считать кадр с камеры не удалось. Недавно в issue писал человек, что смог заставить плату "увидеть" камеру, отпаяв 2 подтягивающих резистора. Но у меня от этого никаких изменений не произошло. Но в любом случае пока, к сожалению, она не запустилась.

В общем, пока не понятно, вроде шансы есть (так как все исходники есть), но почему - то ничего не работает. Ну и со стороны Sipeed, к сожалению, никакой помощи нет.

Жалко не вышло. Я читал затихшую переписку на гитхабе и решил, что раз нет интереса у других, пропал и у вас. Может с LuckFox pico max 256 заработает, хотя даже даташит на вариант 1106G3 не ищется и параметры неясны, да и сопроцессор там непонятен. В SG2002 заинтересовала дешевая возможность попробовать одновременно линукс, FreeRTOS и ИИ.

У меня интерес к этой камере есть, но много времени на отладку надо (причём некоторые моменты "в слепую"). На RV1106G3 я тоже полноценного даташита не нашёл.

I tried the sd img on Milk-v Duo 256m, but i am getting problem, infinte loop

Can you help me ?

You try to run LicheeRV SD image on Milk V Duo?

I can try to reproduce the other day. Yes, they have same SG2002 SoC, but maybe they have difference in SD card initialization or some other low-level differences. But, anyway, I will try

Thank you so much!
Yes, some SD card problem initialization! Thank you so much again. Believe, i spent hours to try before ask for your help!

Thanks again!

On Colab

If possible, send us the step / tips that you follow it...and share your images used to the train...:)

I trained model without some params tuning, just base yolo config, trained 50 epochs. Dataset you can find here.

[root@milkv-duo]~# ./sample_yolov8 ./yolov8n_cv181x_int8_sym.cvimodel ./bus_640
.jpg
[ 9792.491457] vb has already inited, set_config cmd has no effect
---------------------openmodel-----------------------version: 1.4.0
yolov8n Build at 2025-03-05 23:09:23 For platform cv181x
Max SharedMem size:385024
open model failed with 0xc0010102!
[root@milkv-duo]~#

because i am having always this erros for the cvimodels that i got when training to new objects

Is yolov8n_cv181x_int8_sym.cvimodel your custom trained and exported model or it is base COCO model? Do you check MODEL_CLASS_CNT define in code?

custom trainned...

what mean MODEL_CLASS_CNT ?

In sample_yolov8 source code there is a line:

#define MODEL_CLASS_CNT 80

You need to change 80 to number of classes, that your model detects

this maybe make sense..

because in the past, i remember that i was not getting success to train more that 2 objects (class) on monkeys and persons

Iot Smartcore: MILK-V - CRIANDO DATASET DO ZERO - BUGGIO

i remember that works only with two class monkey...

i will verify tomorrow the source code of sample_yolov8.cpp

On colab

After unzip your ZIP file...

I executed the batch

from ultralytics import YOLO

model = YOLO('yolov8n.pt')

results = model.train(data=f"data.yaml", epochs=100, imgsz=640)

I got best.pt

then

from ultralytics import YOLO
import types
import sys

def forward2(self, x):
x_reg = [self.cv2i for i in range(self.nl)]
x_cls = [self.cv3i for i in range(self.nl)]
return x_reg + x_cls

model_path = './best.pt'
model = YOLO(model_path)
model.model.model[-1].forward = types.MethodType(forward2, model.model.model[-1])
model.export(format='onnx', opset=11, imgsz=640)

then i got best.onnx

model_transform.py
--model_name yolov8n
--model_def best.onnx
--input_shapes [[1,3,640,640]]
--mean 0.0,0.0,0.0
--scale 0.0039216,0.0039216,0.0039216
--pixel_format "rgb"
--keep_aspect_ratio
--test_input /workspace/tpu-mlir/regression/image/test.jpg
--test_result yolov8n_top_outputs.npz
--mlir yolov8n.mlir

then i got yolov8n.mlir

run_calibration.py yolov8n.mlir
--dataset /workspace/tpu-mlir/regression/dataset/<folder with your train image>
-o yolov8n_cali_table

then i got yolov8n_cali_table

model_deploy.py
--mlir yolov8n.mlir
--quantize INT8
--calibration_table ./yolov8n_cali_table
--chip cv181x
--test_input /workspace/tpu-mlir/regression/image/test.jpg
--test_reference yolov8n_top_outputs.npz
--compare_all
--tolerance 0.96,0.72
--fuse_preprocess
--model yolov8n_int8_fuse.cvimodel

then i got yolov8n_int8_fuse.cvimodel

transfered to milk-v 256

got

[root@milkv-duo]~# ./sample_yolov8 ./yolov8n_cv181x_int8_sym.cvimodel ./bus_640
.jpg
[ 9792.491457] vb has already inited, set_config cmd has no effect
---------------------openmodel-----------------------version: 1.4.0
yolov8n Build at 2025-03-05 23:09:23 For platform cv181x
Max SharedMem size:385024
open model failed with 0xc0010102!
[root@milkv-duo]~# ^C
[root@milkv-duo]~#

Do you run export LD_LIBRARY_PATH=/root/libs_patch/lib:/root/libs_patch/middleware_v2:/root/libs_patch/middleware_v2_3rd:/root/libs_patch/tpu_sdk_libs:/root/libs_patch:/root/libs_patch/opencv before run sample_yolov8?

for your cvimodels trainned works nice!

i am doing something wrong during the process from best.pt to cvimodel conversion...

Hi :)

Still tryng o solve the error...

Can you send me your CVIMODEL trainned for the TARGET ?

And on COLAB, your model base used to train and create the best.pt was yolov8n.pt ?

For custom object detection model I used yolo11n.pt base model, because it little faster than yolov8. But there is no difference in inference/run source code (you can just use sample_yolov8 program to run Yolo11 models).

You can find my custom yolo11 cvimodels here

Stephen

In your side detected something ?

[root@milkv-duo]~# ./sample_yolov8 ./yolo11n_320_int8_2_class.cvimodel ./blue_ci
rcle_mat_mp4-0129_jpg.rf.248f6b4aecdc00b275f4a6ca63794d25.jpg
[169309.974946] vb has already inited, set_config cmd has no effect
enter CVI_TDL_Get_YOLO_Preparam...
asign val 0
asign val 1
asign val 2
setup yolov8 param
enter CVI_TDL_Get_YOLO_Preparam...
setup yolov8 algorithm param
yolov8 algorithm parameters setup success!
version: 1.4.0
yolo11n_320 Build at 2025-01-25 17:10:07 For platform cv181x
Max SharedMem size:588800
image read,width:640
image read,hidth:640

Detection FPS: 1487.707814
Detected objects cnt: 0

Detected objects:
[root@milkv-duo]~#

It is very strange, that you have such high FPS (1487), do you use proper libraries?

i am executing on MILK-V DUO 256 your bin files...

better is me wait for the module that i order from ALIEXPRESS:(

But in you side, detected, right ?

Yes, some time ago I tested model inference on Milk V Duo 256. I just take sample_yolov8 binary, test image, exported model and so libraries (same as I used for LicheeRV Nano). And it works without (as I remember) problems or special tuning

It is very good)

Is this the sequence that you you use to convert MLIR to CVIMODEL ?

you use to convert MLIR to CVIMODEL ?
you use to convert MLIR to CVIMODEL ?

Yes

Big progress here!

Stepher, have you a Whatsupp number ? i want to add you! And a friend from china too!

Or, telegram ?

You can write to my telegram t.me/Rtyrdv

aborted this link

Very good blog

Статья поразительно шикарная! Правда, я не сильно в этой теме разбираюсь, но устройство мне очень понравилось. Интересно, насколько вообще реально и сложно будет на этой штуке запустить openwrt? В openwrt имеется какая-никакая поддержка risc-v. Ну и по железу этой операционной системе, мне кажется, будет вполне комфортно на этой железке.

Я с openwrt никогда не работал, поэтому не могу сказать насколько просто его будет запустить. Но в целом, скорее всего это возможно

Прикольная маленькая ОС для роутеров с соответствующим (зачастую минималистичным, но и с хорошим веб интерфейсом) софтом. Кстати, там мне там удаётся запускать бинарники, собранные под linux для нужной архитектуры. Прям вообще не вижу смысла в какой-то другой ОС, несмотря на размер openwrt в несколько мегабайт.

Есть может быть каике-то другие мелкие linux, где убрано всё лишнее, а если что-то и нужно, то можно добавить как в конструкторе? Просто мой путь знакомства с linux начался с openwrt. Может какой-то другой подобный linux имеется под эту мини-платку?

Под эту плату из официального только buildroot, но он наверное даже ещё меньше openwrt должен быть. Тут главная проблема в том, чтобы всякие драйверы для работы со специфичными аппаратными возможностями завелись (в оф. образе они работают, но переносить в другие дистрибутивы, наверное, не очень просто будет). В целом, в buildroot не сложно добавлять кастомные пакеты. Но всё-таки buildroot это не дистрибутив, а просто система сборки

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации