После изучения оборудования Radxa Fogwise Airbox в первой части обзора в прошлом месяце, теперь представилась возможность протестировать AI-бокс на базе SOPHGO SG2300x с предустановленным образом Ubuntu 20.04 Server, содержащим CasaOS, а также контейнеры Stable Diffusion и Llama3.
Вторую часть обзора начнём с проверки предустановленного генератора изображений Stable Diffusion и ИИ-чата Llama3, затем вручную установим в веб-интерфейсе CasaOS поисковую систему imgSearch на базе ИИ, протестируем Python SDK через командную строку и запустим модели компьютерного зрения Resnet50 и YOLOv8.
Установка ОС на Radxa Fogwise Airbox
В прошлом месяце Radxa предоставляла только базовый образ Ubuntu Server 20.04. Сейчас компания улучшила документацию и подготовила два образа для Radxa Fogwise Airbox:
- Базовый образ (1.2 ГБ) – На основе Ubuntu Server 20.04; содержит только Sophon base SDK и backend.
- Полный образ (9.5 ГБ) – Дополнен фронтендом Radxa LLM, CasaOS и демо для распространённых LLM.
Новичкам рекомендуется выбрать второй вариант, несмотря на большее время загрузки, так как он позволяет сразу тестировать систему без дополнительных настроек. Именно этот образ использовался (Radxa Airbox B5 0606), а для записи на карту microSD объёмом 32 ГБ применялся USBImager . После установки карты в Fogwise Airbox процесс контролировался через последовательный консольный интерфейс, как в первой части обзора.
По завершении установки открывается TCP-порт 81 airbox.local, позволяющий получить доступ к панели CasaOS с использованием radxa и radxa в качестве учётных данных.
jaufranc@CNX-LAPTOP-5:~/edev/twentyseventeen-child$ nmap -F Airbox.local
Starting Nmap 7.80 ( https://nmap.org ) at 2024-06-16 16:11 +07
Nmap scan report for Airbox.local (192.168.31.71)
Host is up (0.0012s latency).
rDNS record for 192.168.31.71: Airbox
Not shown: 94 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
81/tcp open hosts2-ns
139/tcp open netbios-ssn
445/tcp open microsoft-ds
8888/tcp open sun-answerbook
Использование Radxa Fogwise Airbox с CasaOS
Интерфейс отображает системную информацию (дополнительно подключён USB-накопитель), но ключевым является наличие предустановленных Stable Diffusion и Llama3. Стоит рассмотреть смену имени пользователя и пароля CasaOS, а также доступ к Linux-терминалу через SSH (логин linaro, пароль linaro) для изменения учётных данных…
Дополнительная системная информация из inxi:
linaro@Airbox:~$ sudo inxi -Fc0
System:
Host: Airbox Kernel: 5.4.217-bm1684-g18c6a7c915a2-dirty aarch64 bits: 64
Console: tty 0 Distro: Ubuntu 20.04 LTS (Focal Fossa)
Machine:
Type: ARM Device System: Radxa AICore BM1684x IO Board details: N/A
CPU:
Topology: 8-Core (2-Die) model: bm1684x variant: cortex-a53 bits: 64
type: MCP MCM
Speed: 2300 MHz min/max: 1150/2300 MHz Core speeds (MHz): 1: 2300 2: 2300
3: 2300 4: 2300 5: 2300 6: 2300 7: 2300 8: 2300
Graphics:
Message: No Device data found.
Display: server: No display server data found. Headless machine?
tty: 80x24
Message: Advanced graphics data unavailable in console for root.
Audio:
Device-1: Realtek type: USB driver: hid-generic,snd-usb-audio,usbhid
Sound Server: ALSA v: k5.4.217-bm1684-g18c6a7c915a2-dirty
Network:
Device-1: ethernet driver: bm_dwmac
Device-2: ethernet driver: bm_dwmac
IF-ID-1: docker0 state: up speed: N/A duplex: N/A mac: 02:42:01:de:71:42
IF-ID-2: dummy0 state: down mac: 7a:fa:cc:19:46:e9
IF-ID-3: eth0 state: up speed: 1000 Mbps duplex: full
mac: 00:e0:4c:05:7b:70
IF-ID-4: eth1 state: down mac: 00:e0:4c:05:7b:71
IF-ID-5: sit0 state: down mac: 00:00:00:00
IF-ID-6: vethbcdc398 state: up speed: 10000 Mbps duplex: full
mac: 9a:a2:52:18:f9:a2
Drives:
Local Storage: total: 989.76 GiB used: 471.56 GiB (47.6%)
ID-1: /dev/mmcblk0 model: CUTB42 size: 58.24 GiB
ID-2: /dev/sda type: USB vendor: Seagate model: ST1000LM024 HN-M101MBB
size: 931.51 GiB
Partition:
ID-1: / size: 5.82 GiB used: 168.3 MiB (2.8%) fs: overlay source: ERR-102
ID-2: /boot size: 117.1 MiB used: 67.4 MiB (57.5%) fs: vfat
dev: /dev/mmcblk0p1
ID-3: /opt size: 1.95 GiB used: 246.5 MiB (12.4%) fs: ext4
dev: /dev/mmcblk0p6
Sensors:
Message: No sensors data was found. Is sensors configured?
Info:
Processes: 219 Uptime: 10m Memory: 2.99 GiB used: 896.1 MiB (29.3%)
Init: systemd runlevel: 5 Shell: bash inxi: 3.0.38
Доступно лишь 2.99 ГБ ОЗУ, несмотря на 16 ГБ в системе. Это обусловлено разделением памяти между NPU (нейропроцессор), VPU (видеопроцессор) и VPP (блок графического ускорения). Настройки проверяются утилитой memory_edit:
linaro@Airbox:~$ memory_edit.sh -p bm1684x_sm7m_v1.2.dtb
Info: use dts file /opt/sophon/memory_edit/output/bm1684x_sm7m_v1.2.dts
Info: chip is bm1684x
Info: =======================================================================
Info: get ddr information ...
Info: ddr12_size 8589934592 Byte [8192 MiB]
Info: ddr3_size 4294967296 Byte [4096 MiB]
Info: ddr4_size 4294967296 Byte [4096 MiB]
Info: ddr_size 16384 MiB
Info: =======================================================================
Info: get max memory size ...
Info: max npu size: 0x1dbf00000 [7615 MiB]
Info: max vpu size: 0xb8000000 [2944 MiB]
Info: max vpp size: 0x100000000 [4096 MiB]
Info: =======================================================================
Info: get now memory size ...
Info: now npu size: 0x1c0000000 [7168 MiB]
Info: now vpu size: 0x80000000 [2048 MiB]
Info: now vpp size: 0xc0000000 [3072 MiB]
Конфигурация оставляет 4096 МБ для системы через device tree. При необходимости параметры изменяются скриптом:
memory_edit.sh -c -npu 7360 -vpu 2360 -vpp 4096 bm1684x_sm7m_v1.2.dtb
sudo cp /opt/sophon/memory_edit/emmcboot.itb /boot/emmcboot.itb && sync
sudo reboot
Текущая конфигурация памяти не менялась, так как она оптимальна для используемых ИИ-моделей.
Тестирование Stable Diffusion
При нажатии на иконку Stable Diffusion в CasaOS требуется время на запуск контейнера (1-2 минуты). Первоначальные попытки подключения через Firefox могут завершаться ошибкой до завершения инициализации.
Веб-интерфейс Stable Diffusion построен на Gradio , что объясняет название окна. На первом этапе выбираются Model и Controlnet с последующим нажатием Load Model , хотя варианты выбора ограничены одним пунктом в каждом меню. После загрузки модели (около 1 минуты) можно использовать текстовый генератор изображений. Тестирование начато с примеров, указанных в нижней части интерфейса, включающих prompt:
1girl, хвостик, белые волосы, фиолетовые глаза, средняя грудь, ключица, цветы и лепестки, пейзаж, фон, роза, абстракция
и негативный промпт:
уродливый, плохая детализация, нарушенная анатомия
плюс различные параметры, включая силу шумоподавления и шкалу CFG (классификаторно-свободного управления) .
Создание изображения заняло около 7 секунд. Затем был опробован собственный текстовый промпт для генерации изображения пингвина, занимающегося серфингом на пляже с пальмами.
Генерация также заняла от 5 до 7 секунд. Добавление входного изображения может быть интересным и позволяет лучше понять параметры силы шумоподавления и шкалы CFG. Вся обработка выполняется локально, нет необходимости беспокоиться о размещении личных фотографий в сети. Для теста было использовано стоковое фото с пожилыми людьми.
Сила шумоподавления установлена на минимум для сохранения большей части исходного изображения, а шкала CFG — на 0 для обеспечения гибкости. Результирующее изображение очень близко к оригиналу.
При увеличении силы шумоподавления и настройке шкалы CFG для достижения приемлемого результата… Stable Diffusion по-прежнему использует входные данные как ориентир, но получает большую свободу при создании фото.
Замечено, что когда люди занимают малую площадь на фото, результаты выглядят неидеально. Попробуем другое изображение.
Так лучше. Увеличение силы шумоподавления создает изображения, всё сильнее отличающиеся от оригинала. Шкала GFC может порождать «монстров» с забавными пальцами и физическими аномалиями. Все тесты завершались за 5–10 секунд.
Llama3 на Fogwise Airbox
Пришло время остановить контейнер Stable Diffusion и запустить Llama3. Интерфейс предоставляет текстовое поле и кнопку отправки внизу страницы. Был задан вопрос, известно ли Llama3 что-либо о CNX Software.
Ответ в основном верно описывает деятельность CNX Software, хотя начальный год указан ошибочно. Как сообщали (в X), не следует ожидать от Llama3 точной информации. Видимо, это своего рода арт-проект 🙂
Веб-интерфейс не отображает метрики производительности, поэтому для демонстрации скорости рендеринга была сделана запись экрана в Ubuntu.
Затем Llama3 попросили перевести относительно короткий текст на английский, но генерация прервалась с предупреждением «достигнута максимальная длина, Llama3 очистит всю историю».
После остановки контейнера ограничения памяти были изменены с 256 до 2048, и Llama3 перезапущена.
Однако проблема повторилась. В Radxa пояснили возможность корректировки:
Текущая реализация Llama3 имеет фиксированную длину ввода из-за архитектуры TPU (512 токенов). Если общий ввод + вывод > 512, модель очищает историю. Для увеличения длины можно скомпилировать версию на 1024+ токена по инструкции: https://github.com/sophgo/LLM-TPU/tree/main/models/Llama3 (на китайском), но это увеличит время вывода. Альтернативно — отключить историю через флаг –enable_history=False.
Данная настройка недоступна в CasaOS, поэтому позже будет опробована через командную строку.
Установка и запуск imgSearch в CasaOS
До сих пор использовались только предустановленные приложения. Но есть возможность установить дополнительные приложения вручную , включая «Radxa whisper», «Radxa ImageSearch» и «Radxa chatdoc». Выбрана реализация поиска изображений imgSearch.
Сначала нажимаем иконку «+» и выбираем «Install a customized app».
Затем указываем параметры Docker-образа:
- Docker Image – radxazifeng278/radxa_imgsearch_app:0.1.0
- Название – Image_Search
- Порт веб-интерфейса – 9007 (можно выбрать любой свободный TCP-порт)
- Порт хоста – 9007
- Порт контейнера – 8501
- Устройства хоста – /dev
- Устройства контейнера – /dev
- Ресурсы CPU – Средние
Нажимаем «Install» для запуска установки, которая занимает несколько секунд.
Появилось новое приложение «Image_Search».
Мы можем запустить приложение, нажав на него, однако при первой попытке оно зациклилось, бесконечно отображая статус «Running».
Проверив журнал в Ubuntu 20.04, видны ошибки нехватки памяти:
[65184.192877] [6] :oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=d696d17bd12939256402639cbda19d9f55995ad0fa2e65f9f39a1f98e716cc58,mems_allowed=0,oom_memcg=/docker/d696d17bd12939256402639cbda19d9f55995ad0fa2e65f9f39a1f98e716cc58,task_memcg=/docker/d696d17bd12939256402639cbda19d9f55995ad0fa2e65f9f39a1f98e716cc58,task=streamlit,pid=171794,uid=0
[65184.192913] [6] :Memory cgroup out of memory: Killed process 171794 (streamlit) total-vm:1573764kB, anon-rss:254604kB, file-rss:17656kB, shmem-rss:0kB, UID:0 pgtables:1176kB oom_score_adj:0
[65184.395643] [1] :docker0: port 1(vethe3b63bc) entered disabled state
[65184.395762] [1] :veth298a23d: renamed from eth0
[65184.472287] [1] :docker0: port 1(vethe3b63bc) entered disabled state
[65184.474744] [1] :device vethe3b63bc left promiscuous mode
[65184.474753] [1] :docker0: port 1(vethe3b63bc) entered disabled state
[65184.541368] [1] :overlayfs: NFS export requires "index=on", falling back to nfs_export=off.
В журнале CasaOS также видно, что процесс постоянно завершается и перезапускается.
Решение заключается в изменении ограничения памяти в настройках приложения. Я установил значение 2048.
После сохранения параметров Docker-контейнер переустанавливается, и на этот раз приложение запускается корректно:
Изначально планировалось выбрать директорию на жестком диске Radxa Fogwise Airbox AI Box, но реализация требует ручной загрузки списка файлов. Как пояснили, фреймворк Steamlit в этой демонстрации не поддерживает виджет загрузки из директории. Тем не менее, создана галерея «Test 1» с тремя тестовыми фото, которые обработались за несколько секунд.
Однако выполнение теста прервалось ошибкой: «could not open ./results/EN/Test 1/index.faiss for reading: No such file or directory».
Проверка директории results/EN в терминале контейнера показала, что папка «Test 1» пуста.
Предположив влияние пробела в названии галереи, имя изменено на «test2». После загрузки нескольких изображений процесс завершился успешно.
При создании галереи «CNXSoftware» с 4000 изображений 2023 года процесс завис. Ограничившись сотней файлов, удалось найти по запросу «block diagram» релевантные результаты.
Тестирование Python Virtual Environment на Fogwise Airbox
Остановив все контейнеры CasaOS, переходим к более гибкой Python Virtual Environment для продолжения работы с Llama3.
Изначальная попытка в корневом разделе (/) вызвала нехватку места.
linaro@Airbox:/data/temp$ df -h
Filesystem Size Used Avail Use% Mounted on
overlay 5.9G 3.4G 2.3G 60% /
devtmpfs 1.5G 0 1.5G 0% /dev
tmpfs 1.5G 0 1.5G 0% /dev/shm
tmpfs 306M 35M 272M 12% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup
/dev/mmcblk0p7 43G 25G 17G 60% /data
/dev/mmcblk0p4 3.3G 3.2G 0 100% /media/root-ro
/dev/mmcblk0p5 5.9G 3.4G 2.3G 60% /media/root-rw
/dev/mmcblk0p6 2.0G 221M 1.7G 12% /opt
/dev/mmcblk0p2 3.0G 51M 2.8G 2% /recovery
/dev/mmcblk0p1 118M 68M 50M 58% /boot
/dev/sda2 241G 89G 140G 39% /data2
tmpfs 306M 0 306M 0% /run/user/1000
Переключение на 25-гигабайтный раздел «data» решило проблему. Для комфортной работы с большими ИИ-моделями рекомендуется установить в Fogwise Airbox SSD M.2 2230 NVMe, чтобы избежать постоянного перемещения файлов.
Загружаем демо Llama3 для Python:
mkdir -p /data/temp
cd /data/temp/
git clone https://github.com/zifeng-radxa/LLM-TPU.git
cd LLM-TPU/models/Llama3/python_demo
Модель Llama3 8B скачивается командой:
wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/llama3/tar_downloader.sh
bash tar_downloader.sh
tar -xvf llama3-8b_int4_1dev_512.tar.gz
Настраиваем окружение и устанавливаем зависимости:
cd ..
python3 -m virtualenv .venv
source .venv/bin/activate
pip3 install --upgrade pip
pip3 install -r requirements.txt
cd python_demo
export LD_LIBRARY_PATH=/data/temp/LLM-TPU/support/lib_soc:$LD_LIBRARY_PATH
cp llama3-8b_int4_1dev_512/*.so .
Запускаем демо Llama3 в терминале (примечание: появление приглашения займет некоторое время):
(.venv) linaro@Airbox:/data/temp/LLM-TPU/models/Llama3/python_demo$ python3 pipeline.py -m ./llama3-8b_int4_1dev_512/llama3-8b_int4_1dev_512.bmodel -t ../token_config/
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
Load ../token_config/ ...
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Device [ 0 ] loading ....
[BMRT][bmcpu_setup:498] INFO:cpu_lib 'libcpuop.so' is loaded.
[BMRT][bmcpu_setup:521] INFO:Not able to open libcustomcpuop.so
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][BMProfileDeviceBase:190] INFO:gdma=0, tiu=0, mcu=0
Model[./llama3-8b_int4_1dev_512/llama3-8b_int4_1dev_512.bmodel] loading ....
[BMRT][load_bmodel:1939] INFO:Loading bmodel from [./llama3-8b_int4_1dev_512/llama3-8b_int4_1dev_512.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1704] INFO:Bmodel loaded, version 2.2+v1.7-20240419
[BMRT][load_bmodel:1706] INFO:pre net num: 0, load net num: 69
[BMRT][load_tpu_module:1802] INFO:loading firmare in bmodel
[BMRT][preload_funcs:2121] INFO: core_id=0, multi_fullnet_func_id=30
[BMRT][preload_funcs:2124] INFO: core_id=0, dynamic_fullnet_func_id=31
Done!
=================================================================
1. If you want to quit, please enter one of [q, quit, exit]
2. To create a new chat session, please enter one of [clear, new]
=================================================================
Question:
Answer: Hello! I'm Llama3, a helpful AI assistant. I'm here to assist you with any questions or tasks you may have. What's on your mind? Do you need help with something specific or just want to chat? I'm all ears (or rather, all text)!
FTL: 0.798 s
TPS: 9.565 token/s
Задаем аналогичный предыдущему тесту вопрос:
Question: What do you know about CNX Software?
Answer: CNX Software is a popular online publication that focuses on embedded systems, IoT, and related technologies. They provide news, articles, tutorials, and reviews on various topics such as:
1. Embedded systems: Microcontrollers, single-board computers, and other embedded devices.
2. IoT (Internet of Things): Connected devices, sensors, and applications.
3. Robotics: Robotics platforms, programming, and automation.
4. Artificial intelligence (AI) and machine learning (ML): Applications and implementations in embedded systems.
5. Linux and open-source operating systems: Tutorials, reviews, and news on Linux and other open-source OSes.
CNX Software is known for its in-depth articles, tutorials, and reviews, which cater to a wide range of audiences, from beginners to experienced professionals. They also feature interviews with industry experts and provide resources for learning and development.
The website is a valuable resource for anyone interested in embedded systems, IoT, and related technologies. It's a great place to stay updated on the latest developments, learn new skills, and explore new projects.
Would you like to know more about a specific topic or aspect of CNX Software?
FTL: 0.722 s
TPS: 9.566 token/s
Скорость генерации AI Box составляет 9.566 токенов/с. Для воспроизведения демо Gradio из CasaOS используем скрипт web_demo.py:
(.venv) linaro@Airbox:/data/temp/LLM-TPU/models/Llama3/python_demo$ python3 web_demo.py -m ./llama3-8b_int4_1dev_512/llama3-8b_int4_1dev_512.bmodel -t ../token_config/
/data/temp/LLM-TPU/models/Llama3/python_demo/.venv/lib/python3.8/site-packages/gradio_client/documentation.py:104: UserWarning: Could not get documentation group for <class 'gradio.mix.Parallel'>: No known documentation group for module 'gradio.mix'
warnings.warn(f"Could not get documentation group for {cls}: {exc}")
/data/temp/LLM-TPU/models/Llama3/python_demo/.venv/lib/python3.8/site-packages/gradio_client/documentation.py:104: UserWarning: Could not get documentation group for <class 'gradio.mix.Series'>: No known documentation group for module 'gradio.mix'
warnings.warn(f"Could not get documentation group for {cls}: {exc}")
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
Load ../token_config/ ...
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Device [ 0 ] loading ....
[BMRT][bmcpu_setup:498] INFO:cpu_lib 'libcpuop.so' is loaded.
[BMRT][bmcpu_setup:521] INFO:Not able to open libcustomcpuop.so
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][BMProfileDeviceBase:190] INFO:gdma=0, tiu=0, mcu=0
Model[./llama3-8b_int4_1dev_512/llama3-8b_int4_1dev_512.bmodel] loading ....
[BMRT][load_bmodel:1939] INFO:Loading bmodel from [./llama3-8b_int4_1dev_512/llama3-8b_int4_1dev_512.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1704] INFO:Bmodel loaded, version 2.2+v1.7-20240419
[BMRT][load_bmodel:1706] INFO:pre net num: 0, load net num: 69
[BMRT][load_tpu_module:1802] INFO:loading firmare in bmodel
[BMRT][preload_funcs:2121] INFO: core_id=0, multi_fullnet_func_id=30
[BMRT][preload_funcs:2124] INFO: core_id=0, dynamic_fullnet_func_id=31
Done!
Running on local URL: http://0.0.0.0:8003
To create a public link, set `share=True` in `launch()`.
IMPORTANT: You are using gradio version 3.39.0, however version 4.29.0 is available, please upgrade.
Работает. Ограничение в 512 байт сохраняется при обоих методах:
Overall, CNX Software is a valuable resource for anyone interested in embedded systems, IoT, and related technologies.
FTL: 0.721 s
TPS: 9.569 token/s
Question: How do you say hello in Thailand language?
Answer: In Thailand, the official language is Thai, and the way to say "hello" is " Sawatdee" (สวัสดี). This is a common greeting used during the day, and it's suitable for most situations.
However, there are a few other ways to greet someone in Thai, depending on the time of day and the level of formality:
* "Sawatdi krap" (สวัสดีค่ะ) - This is a more formal way to say "hello" during the day, and it's often used when speaking to someone you don't know well or when you want to show respect.
* "Sawatdi ka" (สวัสดีคะ) - This
FTL: 0.724 s
TPS: 9.540 token/s
... (reach the maximal length)
Увеличение лимита ответов Llama3
Проверим возможность повышения лимита до 1024 и его влияние на производительность. Изначально инструкции выполнялись на ноутбуке Ubuntu 22.04 (Intel Core i5-13500H, 16 ГБ ОЗУ, 26 ГБ свободного места). Однако в заключении указано:
Генерация bmodel занимает 2+ часа. Требуется 64 ГБ ОЗУ и 200+ ГБ дискового пространства во избежание ошибок OOM или нехватки места.
Данные условия невыполнимы. Но требуемая система найдена — встраиваемый компьютер Cincoze DS-1402 с Intel Core i9-12900E, 64 ГБ DDR5 и 300-гигабайтным разделом Ubuntu. Дальнейшие действия выполняются на этой x86-машине.
Устанавливаем компилятор:
sudo apt install git build-essential cmake python3-virtualenv
git clone https://github.com/sophgo/tpu-mlir
sudo docker pull sophgo/tpuc_dev:latest
sudo docker run --privileged --name myname -v $PWD:/workspace -it sophgo/tpuc_dev:latest
root@e7ce11913e8d:/workspace# cd tpu-mlir/
root@e7ce11913e8d:/workspace/tpu-mlir# source ./envsetup.sh
root@e7ce11913e8d:/workspace# cd tpu-mlir/
root@e7ce11913e8d:/workspace/tpu-mlir# ./build.sh
exit
Запрашиваем доступ к модели Llama3, заполнив форму на https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct/tree/main (ручная модерация занимает ~1 день). Предварительно ставим git-lfs:
sudo apt install curl
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt install git-lfs
git lfs install
Генерируем токен с разрешением «Read access to contents of all public gated repos you can access» и выполняем:
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct
Вводим логин и токен для загрузки. Операция выполнена в корневой директории пользователя.
Попытка использовать Python 3.12 (предустановлен в Ubuntu 24.04) провалилась из-за несовместимости с требуемым Torch-1.12.0. Установлен Python 3.10 через miniconda3:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
~/miniconda3/bin/conda create -n py310 python=3.10
~/miniconda3/bin/conda init
~/miniconda3/bin/conda activate py310
После перезагрузки в приглашении отображается (base), подтверждая использование Python 3.10:
(base) jaufranc@DS-1402-CNX:~$ python --version
Python 3.10.14
Следуя инструкциям Radxa, создаем виртуальное окружение в LLM-TPU/models/Llama3:
cd LLM-TPU/models/Llama3
python3 -m virtualenv .venv2
source .venvs/bin/activate
pip3 install --upgrade pip
pip3 install -r requirements.txt
Теперь скопируйте modeling_llama.py в библиотеку transformers внутри venv2 и установите несколько дополнительных зависимостей (видимо пропущенных в requirements.txt):
cp ./compile/files/Meta-Llama-3-8B-Instruct/modeling_llama.py .venv2/lib/python3.10/site-packages/transformers/models/llama/
pip3 install torch==1.12.0 onnx
Нам потребуется отредактировать compile/files/Meta-Llama-3-8B-Instruct/config.json с выбранной длиной контекста:
"max_position_embeddings": 1024,
и скопировать файл в директорию Llama3 от Huggingface:
cp compile/files/Meta-Llama-3-8B-Instruct/config.json ~/Meta-Llama-3-8B-Instruct/
Теперь сгенерируйте onnx-файл, используя загруженную Llama3 и длину 1024 байта:
cd compile
(.venv2) (base) jaufranc@DS-1402-CNX:~/LLM-TPU/models/Llama3/compile$ time python export_onnx.py --model_path ~/Meta-Llama-3-8B-Instruct/ --seq_length 1024
Этот этап занял чуть более 6 минут:
Loading checkpoint shards: 100%|██████████████████| 4/4 [00:13<00:00, 3.50s/it]
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Layers: 32
Hidden size: 4096
Convert block & block_cache
0%| | 0/32 [00:00<?, ?it/s]/home/jaufranc/LLM-TPU/models/Llama3/.venv2/lib/python3.10/site-packages/transformers/models/llama/modeling_llama.py:154: UserWarning: __floordiv__ is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor').
x1 = x[..., : x.shape[-1] // 2]
/home/jaufranc/LLM-TPU/models/Llama3/.venv2/lib/python3.10/site-packages/transformers/models/llama/modeling_llama.py:155: UserWarning: __floordiv__ is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor').
x2 = x[..., x.shape[-1] // 2 :]
100%|███████████████████████████████████████████| 32/32 [05:53<00:00, 11.04s/it]
Convert embedding
Convert lm_head
Done
real 6m32.229s
user 9m1.998s
sys 4m57.402s
Следующим шагом будет выход из виртуального окружения Python.
deactivate
Теперь можно начать компиляцию. После выхода из Docker и перезагрузки Cincoze DS-1402, компиляция должна выполняться в Docker. Необходимо повторно подключиться, загрузить настройки окружения и запустить компиляцию:
sudo docker ps -a
sudo docker start <CONTAINER_ID>
sudo docker attach <CONTAINER_ID>
cd tpu-mlir
source ./envsetup
cd ../LLM-TPU/models/Llama3/compile/
time ./compile.sh --mode int4 --name llama3-8b --seq_length 1024 # same as int8
Появятся предупреждения о проверке onnx-модели, но их можно проигнорировать:
2024/06/25 10:58:09 - INFO : TPU-MLIR v1.8.beta.0-89-g32b7f39b8-20240623
2024/06/25 10:58:09 - INFO :
_____________________________________________________
| preprocess: |
| (x - mean) * scale |
'-------------------------------------------------------'
config Preprocess args :
resize_dims : same to net input dims
keep_aspect_ratio : False
keep_ratio_mode : letterbox
pad_value : 0
pad_type : center
--------------------------
mean : [0.0, 0.0, 0.0]
scale : [1.0, 1.0, 1.0]
--------------------------
pixel_format : bgr
channel_format : nchw
2024/06/25 10:58:10 - INFO : Input_shape assigned
WARNING: onnx model check failed
2024/06/25 10:58:18 - INFO : ConstantFolding finished
2024/06/25 10:58:18 - INFO : skip_fuse_bn:False
2024/06/25 10:59:08 - INFO : Onnxsim opt finished
WARNING: onnx model check failed
2024/06/25 10:59:15 - INFO : ConstantFolding finished
На моей системе этот этап завершился менее чем за 40 минут:
+ model_tool --combine tmp/embedding/embedding.bmodel tmp/embedding/embedding_cache.bmodel tmp/int4_1dev/lm_head/lm_head.bmodel tmp/int4_1dev/lm_head/greedy_head.bmodel tmp/int4_1dev/lm_head/penalty_sample_head.bmodel tmp/int4_1dev/block/block_0.bmodel tmp/int4_1dev/block/block_cache_0.bmodel tmp/int4_1dev/block/block_1.bmodel tmp/int4_1dev/block/block_cache_1.bmodel tmp/int4_1dev/block/block_2.bmodel tmp/int4_1dev/block/block_cache_2.bmodel tmp/int4_1dev/block/block_3.bmodel tmp/int4_1dev/block/block_cache_3.bmodel tmp/int4_1dev/block/block_4.bmodel tmp/int4_1dev/block/block_cache_4.bmodel tmp/int4_1dev/block/block_5.bmodel tmp/int4_1dev/block/block_cache_5.bmodel tmp/int4_1dev/block/block_6.bmodel tmp/int4_1dev/block/block_cache_6.bmodel tmp/int4_1dev/block/block_7.bmodel tmp/int4_1dev/block/block_cache_7.bmodel tmp/int4_1dev/block/block_8.bmodel tmp/int4_1dev/block/block_cache_8.bmodel tmp/int4_1dev/block/block_9.bmodel tmp/int4_1dev/block/block_cache_9.bmodel tmp/int4_1dev/block/block_10.bmodel tmp/int4_1dev/block/block_cache_10.bmodel tmp/int4_1dev/block/block_11.bmodel tmp/int4_1dev/block/block_cache_11.bmodel tmp/int4_1dev/block/block_12.bmodel tmp/int4_1dev/block/block_cache_12.bmodel tmp/int4_1dev/block/block_13.bmodel tmp/int4_1dev/block/block_cache_13.bmodel tmp/int4_1dev/block/block_14.bmodel tmp/int4_1dev/block/block_cache_14.bmodel tmp/int4_1dev/block/block_15.bmodel tmp/int4_1dev/block/block_cache_15.bmodel tmp/int4_1dev/block/block_16.bmodel tmp/int4_1dev/block/block_cache_16.bmodel tmp/int4_1dev/block/block_17.bmodel tmp/int4_1dev/block/block_cache_17.bmodel tmp/int4_1dev/block/block_18.bmodel tmp/int4_1dev/block/block_cache_18.bmodel tmp/int4_1dev/block/block_19.bmodel tmp/int4_1dev/block/block_cache_19.bmodel tmp/int4_1dev/block/block_20.bmodel tmp/int4_1dev/block/block_cache_20.bmodel tmp/int4_1dev/block/block_21.bmodel tmp/int4_1dev/block/block_cache_21.bmodel tmp/int4_1dev/block/block_22.bmodel tmp/int4_1dev/block/block_cache_22.bmodel tmp/int4_1dev/block/block_23.bmodel tmp/int4_1dev/block/block_cache_23.bmodel tmp/int4_1dev/block/block_24.bmodel tmp/int4_1dev/block/block_cache_24.bmodel tmp/int4_1dev/block/block_25.bmodel tmp/int4_1dev/block/block_cache_25.bmodel tmp/int4_1dev/block/block_26.bmodel tmp/int4_1dev/block/block_cache_26.bmodel tmp/int4_1dev/block/block_27.bmodel tmp/int4_1dev/block/block_cache_27.bmodel tmp/int4_1dev/block/block_28.bmodel tmp/int4_1dev/block/block_cache_28.bmodel tmp/int4_1dev/block/block_29.bmodel tmp/int4_1dev/block/block_cache_29.bmodel tmp/int4_1dev/block/block_30.bmodel tmp/int4_1dev/block/block_cache_30.bmodel tmp/int4_1dev/block/block_31.bmodel tmp/int4_1dev/block/block_cache_31.bmodel -o llama3-8b_int4_1dev_1024.bmodel
Success: combined to [llama3-8b_int4_1dev_1024.bmodel].
real 39m22.181s
user 32m53.199s
sys 22m37.873s
Скопируем новую модель на Fogwise Airbox:
root@e7ce11913e8d:/workspace/LLM-TPU/models/Llama3/compile# scp llama3-8b_int4_1dev_1024.bmodel linaro@192.168.31.71:/data/temp/LLM-TPU/models/Llama3/python_demo/
После завершения задач на Cincoze DS-1402 продолжим работу на Fogwise Airbox. Сначала протестируем модель:
linaro@Airbox:/data/temp/LLM-TPU/models/Llama3/python_demo$ bmrt_test --bmodel llama3-8b_int4_1dev_1024.bmodel
[BMRT][deal_with_options:1446] INFO:Loop num: 1
[BMRT][bmrt_test:723] WARNING:setpriority failed, cpu time might flutuate.
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [llama3-8b_int4_1dev_1024.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 69
[BMRT][show_net_info:1520] INFO: ########################
[BMRT][show_net_info:1521] INFO: NetName: embedding, Index=0
[BMRT][show_net_info:1523] INFO: ---- stage 0 ----
...
[BMRT][bmrt_test:868] INFO:reading input #0, bytesize=8192
[BMRT][bmrt_test:868] INFO:reading input #1, bytesize=4
[BMRT][print_array:706] INFO: --> input_data: < 0 >
[BMRT][bmrt_test:868] INFO:reading input #2, bytesize=2050
[BMRT][bmrt_test:868] INFO:reading input #3, bytesize=2097152
[BMRT][bmrt_test:868] INFO:reading input #4, bytesize=2097152
[BMRT][bmrt_test:1005] INFO:reading output #0, bytesize=8192
[BMRT][bmrt_test:1005] INFO:reading output #1, bytesize=2048
[BMRT][bmrt_test:1005] INFO:reading output #2, bytesize=2048
[BMRT][bmrt_test:1039] INFO:net[block_cache_31] stage[0], launch total time is 4352 us (npu 4259 us, cpu 93 us)
[BMRT][bmrt_test:1042] INFO:+++ The network[block_cache_31] stage[0] output_data +++
[BMRT][bmrt_test:1083] INFO:load input time(s): 0.004372
[BMRT][bmrt_test:1084] INFO:calculate time(s): 0.004358
[BMRT][bmrt_test:1085] INFO:get output time(s): 0.000048
[BMRT][bmrt_test:1086] INFO:compare time(s): 0.000086
Результаты выглядят приемлемо, но можно запустить демо в терминале:
source .venv/bin/activate
export LD_LIBRARY_PATH=LLM-TPU/support/lib_soc:$LD_LIBRARY_PATH
python3 pipeline.py -m ./llama3-8b_int4_1dev_1024.bmodel -t ../token_config/
Функционирует корректно:
(.venv) linaro@Airbox:/data/temp/LLM-TPU/models/Llama3/python_demo$ python3 pipeline.py -m ./llama3-8b_int4_1dev_1024.bmodel -t ../token_config/
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
Load ../token_config/ ...
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Device [ 0 ] loading ....
[BMRT][bmcpu_setup:498] INFO:cpu_lib 'libcpuop.so' is loaded.
[BMRT][bmcpu_setup:521] INFO:Not able to open libcustomcpuop.so
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][BMProfileDeviceBase:190] INFO:gdma=0, tiu=0, mcu=0
Model[./llama3-8b_int4_1dev_1024.bmodel] loading ....
[BMRT][load_bmodel:1939] INFO:Loading bmodel from [./llama3-8b_int4_1dev_1024.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1704] INFO:Bmodel loaded, version 2.2+v1.8.beta.0-89-g32b7f39b8-20240623
[BMRT][load_bmodel:1706] INFO:pre net num: 0, load net num: 69
[BMRT][load_tpu_module:1802] INFO:loading firmare in bmodel
[BMRT][preload_funcs:2121] INFO: core_id=0, multi_fullnet_func_id=30
[BMRT][preload_funcs:2124] INFO: core_id=0, dynamic_fullnet_func_id=31
Done!
=================================================================
1. If you want to quit, please enter one of [q, quit, exit]
2. To create a new chat session, please enter one of [clear, new]
=================================================================
Question:
Answer: Hello! I'm Llama3, a helpful AI assistant. I'm here to assist you with any questions or tasks you may have. What's on your mind? Do you need help with something specific or just want to chat? I'm all ears (or rather, all text)!
FTL: 1.644 s
TPS: 7.193 token/s
Question: what do you know about CNX Software?
Answer: CNX Software is a popular online publication that focuses on embedded systems, IoT, and related technologies. They provide news, articles, tutorials, and reviews on various topics such as:
1. Embedded systems: Microcontrollers, single-board computers, and other embedded devices.
2. IoT (Internet of Things): Connected devices, sensors, and applications.
3. Robotics: Robotics platforms, programming, and automation.
4. Artificial intelligence (AI) and machine learning (ML): Applications and implementations in embedded systems.
5. Linux and open-source operating systems: Tutorials, reviews, and news on Linux and other open-source OSes.
CNX Software is known for its in-depth articles, tutorials, and reviews, which cater to a wide range of audiences, from beginners to experienced professionals. They also feature interviews with industry experts, product reviews, and news on the latest developments in the field.
The website is a valuable resource for anyone interested in embedded systems, IoT, robotics, AI, and related technologies. It's a great place to stay updated on the latest trends, learn new skills, and explore new projects.
Would you like to know more about a specific topic or aspect of CNX Software?
FTL: 1.572 s
TPS: 7.192 token/s
Question: How do you say hello in Thai language?
Answer: In Thai, you can say "hello" as:
* สวัสดี (sawatdee) - This is a formal way of saying "hello" and is often used when greeting someone you don't know well or when showing respect.
* สวัสดีครับ/สวัสดีค่ะ (sawatdee khrap/sawatdee kha) - These are informal ways of saying "hello" and are often used with friends or people you're familiar with. The "ครับ" (khrap) is a masculine ending, and the "ค่ะ" (kha) is a feminine ending.
You can also use other greetings such as:
* ช่วงเช้า (chuang chao) - This means "good morning"
* ช่วงบ่าย (chuang bai) - This means "good afternoon"
* ช่วงเย็น (chuang yen) - This means "good evening"
It's worth noting that in Thai culture, it's customary to use a respectful tone and language when greeting someone, especially if you're not familiar with them. So, even if you're using an informal greeting, it's still a good idea to use a respectful tone and language.
FTL: 1.572 s
TPS: 7.186 token/s
Однако заметно снижение скорости до ~7.2 токенов в секунду. При переводе параграфов на тайском достигается новый предел в 1024 байта, но прогресс есть:
Question: please translate the following in English:
Answer: ^MPlease go ahead and provide the text you'd like me to translate, and I'll do my best to provide an accurate English translation.
FTL: 1.577 s
TPS: 7.223 token/s
Question: นักเรียนไทยสร้างชื่อเสียง บนเวที "แข่งขันคณิตศาสตร์นานาชาติ" คว้าตำแหน่งแชมเปียนเกรด 5 กับรายการ 2024 IMWiC จากเมืองโบกอร์ ประเทศอินโดนีเซีย
เมื่อเวลา 23.50 น. วันที่ 25 มิ.ย. 2567 ผู้สื่อข่าวรายงานว่า บริเวณที่อาคารผู้โดยสาร ชั้น 2 ขาเข้าสนามบินสุวรรณภูมิ นายภูมิเทพ คลังอุไร ประธาน Thai Talent Training พร้อมคณะ รวมทั้งผู้ปกครองเดินทางมารับคณะนักเรียนที่เดินทางกลับถึงประเทศไทย เที่ยวบิน TG 436 เวลา 22.37 น. จากการแข่งขันคณิตศาสตร์นานาชาติ คว้าตำแหน่งแชมเปียนเกรด 5 กับรายการ 2024 IMWiC ณ เมืองโบกอร์ ประเทศอินโดนีเซีย โดยสามารถคว้าตำแหน่งแชมเปียนของเกรด 5 มาครองพร้อมทั้งรางวัลเหรียญทอง 2 รางวัล เหรียญเงิน 2 รางวัล เหรียญทองแดง 3 รางวัล กับอีก 1 รางวัลชมเชย
นายภูมิเทพ คลังอุไร ประธาน Thai Talent Training เผยว่า รายการที่นำนักเรียนไปแข่งขันในรายการ 2024 IMWiC International Mathematics Wizard Challenge ซึ่งในปีที่ผ่านมา มีการแข่งขันที่ประเทศมาเลเซีย สำหรับปีนี้ก็คือ นักเรียนไทยเราเพิ่งกลับมาจากเมืองโบกอร์ อินโดนีเซีย ส่วนผลการแข่งขัน นักเรียนของเราทำผลงานดีพอๆ กับปีที่แล้ว เราได้ทั้งหมด 2 เหรียญทอง 2 เหรียญเงิน 3 เหรียญทองแดง และ 1 รางวัลชมเชย
Answer:
Here's the translation:
"Thai students made a name for themselves on the stage of the "International Mathematics Competition" and won the championship title in Grade 5 and the 2024 IMWiC category from Bogor, Indonesia."
Breakdown:
* นักเรียนไทย (nǎe riǎn thai) - Thai students
* สร้างชื่อเสียง (sǎng chǔe sīng) - made a name for themselves
* บนเวที (bøn wēt) - on the stage
* แข่งขันคณิตศาสตร์นานาชาติ (kǎn kʰǎn kʰnít sǎt sāt nǎnāchāt) - International Mathematics Competition
* คว้าตำแหน่งแชมเปียนเกรด 5 (kwaat tamnæng čhæm pīen kʰrɛt sɛɛ) - won the championship title in Grade 5
* กับรายการ (kǎp rāk sǎt) - and the
* 2024 IMWiC (two thousand twenty-four IMWiC) - 2024 IMWiC (International Mathematical and Science Olympiad for Women and Girls)
* จากเมืองโบกอร์ (jàk mɯeɯŋ bɔk
FTL: 1.575 s
TPS: 7.196 token/s
... (reach the maximal length)
Question:
Answer: Hello! I'm Llama3, a helpful AI assistant. I'm here to assist you with any questions or tasks you may have. What's on your mind? Do you need help with something specific or just want to chat? I'm all ears (or rather, all text)!
FTL: 1.574 s
TPS: 7.201 token/s
Question:
Answer: It seems like you're sharing a news article about a notable event. Here's a summary:
On June 25, 2024, at 23:50, a news report stated that at the arrival hall, 2nd floor, Suvarnabhumi Airport, Mr. Phumitep Klungurai, President of Thai Talent Training, along with his team and guardians, arrived to pick up students returning to Thailand. They had traveled on flight TG 436, which departed at 22:37, after participating in the 2024 International Mathematical Olympiad (IMWiC) in Bogor, Indonesia. The Thai team won several awards, including:
* 2 Gold Medals
* 2 Silver Medals
* 3 Bronze Medals
* 1 Special Award
Congratulations to the Thai team on their impressive achievements!
FTL: 1.572 s
TPS: 7.199 token/s
Radxa Model Zoo – Resnet50 и YOLOV8
Для финального теста следуя инструкциям установил Radxa Model Zoo и запустил 8-битную целочисленную модель Resnet50 (INT8) (также доступны INT16 и FP32). Возвращаемся в терминал Fogwise Airbox:
git clone https://github.com/zifeng-radxa/Radxa-Model-Zoo.git
cd Radxa-Model-Zoo/sample/ResNet
wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/model-zoo/resnet50_int8_1b.bmodel
mkdir images && cd images
wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/model-zoo/grace_hopper.bmp

Снова настраиваем виртуальное окружение Python и устанавливаем зависимости:
cd ..
python3 -m virtualenv .venv
source .venv/bin/activate
pip3 install --upgrade pip
pip3 install numpy
pip3 install https://github.com/radxa-edge/TPU-Edge-AI/releases/download/v0.1.0/sophon_arm-3.7.0-py3-none-any.whl
Предоставлены два примера: с использованием OpenCV и SAIL API , а также с SAIL и обработкой «BMVC». Запустим демо с OpenCV:
export LD_LIBRARY_PATH=/opt/sophon/libsophon-current/lib:$LD_LIBRARY_PATH
export PYTHONPATH=$PYTHONPATH:/opt/sophon/sophon-opencv-latest/opencv-python/
python3 python/resnet_opencv.py --input ./images --bmodel ./resnet50_int8_1b.bmodel
Вывод:
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [./resnet50_int8_1b.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 1
INFO:root:filename: ./images/grace_hopper.bmp, res: (457, 0.12794505059719086)
INFO:root:result saved in ./results/resnet50_int8_1b.bmodel_images_opencv_python_result.json
INFO:root:------------------ Inference Time Info ----------------------
INFO:root:decode_time(ms): 32.21
INFO:root:preprocess_time(ms): 38.65
INFO:root:inference_time(ms): 4.23
INFO:root:postprocess_time(ms): 0.35
Время вывода составило 4.23 мс (236 кадр/с), общее время — 75.44 мс. Результаты в JSON-файле:
(.venv) linaro@Airbox:~/Radxa-Model-Zoo/sample/ResNet$ cat ./results/resnet50_int8_1b.bmodel_images_opencv_python_result.json
[
{
"filename": "./images/grace_hopper.bmp",
"prediction": 457,
"score": 0.12794505059719086
}
Функционирует, но вывод не читаем для человека… Попробуем сегментацию объектов Yolov8 в том же окружении:
cd ../YOLOv8_seg/
wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/model-zoo/yolov8s_int8_1b.bmodel
mkdir images && cd images
wget https://github.com/radxa-edge/TPU-Edge-AI/releases/download/model-zoo/dog_bike_car.jpg
cd ..
pip3 install pycocotools
Также доступны два примера, продолжим с OpenCV:
python3 python/yolov8_opencv.py --input ./images --bmodel ./yolov8s_int8_1b.bmodel
Вывод:
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [./yolov8s_int8_1b.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 1
INFO:root:load ./yolov8s_int8_1b.bmodel success!
INFO:root:1, img_file: ./images/dog_bike_car.jpg
sampleFactor=6, cinfo->num_components=3 (1x2, 1x1, 1x1)
Open /dev/jpu successfully, device index = 0, jpu fd = 23, vpp fd = 24
INFO:root:result saved in ./results/yolov8s_int8_1b.bmodel_images_opencv_python_result.json
INFO:root:------------------ Predict Time Info ----------------------
INFO:root:decode_time(ms): 29.25
INFO:root:preprocess_time(ms): 33.29
INFO:root:inference_time(ms): 16.18
INFO:root:postprocess_time(ms): 164.70
all done.
Время вывода — 16.18 мс (61.8 кадр/с), общее время — 246.72 мс.
JSON-файл остаётся нечитаемым, но демо генерирует изображение (или несколько) с описаниями и контурами объектов.
(.venv) linaro@Airbox:~/Radxa-Model-Zoo/sample/YOLOv8_seg$ ls -l results/images/
total 108
-rw-rw-r-- 1 linaro linaro 110168 Jun 23 17:16 res_bmcv_dog_bike_car.jpg
Добавил большее тестовое изображение (1920×1080) с увеличенным числом объектов:
(.venv) linaro@Airbox:~/Radxa-Model-Zoo/sample/YOLOv8_seg$ python3 python/yolov8_opencv.py --input ./images --bmodel ./yolov8s_int8_1b.bmodel
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [./yolov8s_int8_1b.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 1
INFO:root:load ./yolov8s_int8_1b.bmodel success!
INFO:root:1, img_file: ./images/dog_bike_car.jpg
sampleFactor=6, cinfo->num_components=3 (1x2, 1x1, 1x1)
Open /dev/jpu successfully, device index = 0, jpu fd = 23, vpp fd = 24
INFO:root:2, img_file: ./images/people-street.jpg
sampleFactor=10, cinfo->num_components=3 (2x2, 1x1, 1x1)
INFO:root:result saved in ./results/yolov8s_int8_1b.bmodel_images_opencv_python_result.json
INFO:root:------------------ Predict Time Info ----------------------
INFO:root:decode_time(ms): 54.78
INFO:root:preprocess_time(ms): 28.08
INFO:root:inference_time(ms): 14.53
INFO:root:postprocess_time(ms): 3634.29
all done.
Вывод остаётся быстрым, но постобработка требует времени. Результирующее изображение достаточно качественное.
Попробуем пример с BMCV для сравнения скорости:
(.venv) linaro@Airbox:~/Radxa-Model-Zoo/sample/YOLOv8_seg$ python3 python/yolov8_bmcv.py --input ./images --bmodel ./yolov8s_int8_1b.bmodel
[BMRT][bmcpu_setup:406] INFO:cpu_lib 'libcpuop.so' is loaded.
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init
[BMRT][load_bmodel:1084] INFO:Loading bmodel from [./yolov8s_int8_1b.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:1023] INFO:pre net num: 0, load net num: 1
INFO:root:1, img_file: ./images/dog_bike_car.jpg
sampleFactor=6, cinfo->num_components=3 (1x2, 1x1, 1x1)
Open /dev/jpu successfully, device index = 0, jpu fd = 42, vpp fd = 43
INFO:root:2, img_file: ./images/people-street.jpg
sampleFactor=10, cinfo->num_components=3 (2x2, 1x1, 1x1)
INFO:root:result saved in ./results/yolov8s_int8_1b.bmodel_images_bmcv_python_result.json
INFO:root:------------------ Predict Time Info ----------------------
INFO:root:decode_time(ms): 57.77
INFO:root:preprocess_time(ms): 4.90
INFO:root:inference_time(ms): 11.61
INFO:root:postprocess_time(ms): 3439.02
all done.
Предобработка через BMCV значительно быстрее OpenCV. Пример декодирует через SAIL, сохраняя сопоставимую с OpenCV скорость. Поскольку в обоих случаях вывод обрабатывается SAIL, различия вероятно вызваны вариативностью тестов.
Потребление энергии и шум вентилятора Radxa Fogwise Airbox
При первоначальном тестировании Aibox Fogwise со 100-ваттным GaN-адаптером потребление в режиме простоя составляло ~30 Вт. После получения адаптера от Radxa этот показатель снизился до ~28 Вт. Значение всё ещё высокое. При ответах Llama3 потребление возрастает до 39 Вт, а при генерации изображений Stable Diffusion достигает ~49 Вт. Потребление варьируется в зависимости от сложности изображения.
Вентилятор работает постоянно с заметным шумом. Для пользовательского мини-ПК это было бы проблемой, но поскольку система автономная, её можно разместить в отдельном помещении с вентиляцией и Ethernet-подключением.
Заключение
Radxa Fogwise Airbox представляет собой отличный компактный headless-бокс для офлайн/локальной обработки ИИ, совместимый с генеративными ИИ-системами, включая LLM и генераторы текст-в-изображение, а также моделями компьютерного зрения, такими как Resnet50 или YOLOv8. Благодаря предустановленному образу Ubuntu + CasaOS с контейнерами Stable Diffusion и Llama3, обеспечивающими plug-and-play функциональность, начать работу предельно просто. Также доступен Python SDK для кастомизации моделей или создания собственных.
Документация достаточно качественная, хотя часто требовалось выполнять дополнительные команды для успешной работы; в одном случае (перекомпиляция Llama3) процесс не увенчался успехом с первого раза, и для решения задачи потребовалось активное взаимодействие со специалистами Radxa. Тем не менее, Radxa Fogwise Airbox остается интересным решением для экспериментов с on-device генеративным ИИ и компьютерным зрением, а также для интеграции в проекты. Потребление энергии может вызывать вопросы, но 32 TOPS ИИ-бокс следует сравнивать с аналогами, например, модулями NVIDIA Jetson.
Благодарим Radxa за предоставленный для обзора ИИ-бокс Fogwise Airbox. Тестируемая модель с 16 ГБ RAM и 64 ГБ флэш-памяти eMMC, но без SSD и Wi-Fi может быть приобретён на Aliexpress за $331 плюс доставка Исходный текст отсутствует. Готов выполнить перевод технического контента по электронике и embedded-системам с соблюдением всех указанных требований.
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.