После изучения оборудования 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 в качестве учётных данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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. При необходимости параметры изменяются скриптом:
1 2 3 |
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, видны ошибки нехватки памяти:
1 2 3 4 5 6 7 8 |
[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.
Изначальная попытка в корневом разделе (/) вызвала нехватку места.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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:
1 2 3 4 |
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 скачивается командой:
1 2 3 |
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 |
Настраиваем окружение и устанавливаем зависимости:
1 2 3 4 5 6 7 8 |
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 в терминале (примечание: появление приглашения займет некоторое время):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
(.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 |
Задаем аналогичный предыдущему тесту вопрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
(.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 байт сохраняется при обоих методах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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-машине.
Устанавливаем компилятор:
1 2 3 4 5 6 7 8 9 |
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:
1 2 3 4 |
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» и выполняем:
1 |
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:
1 2 3 4 5 |
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:
1 2 |
(base) jaufranc@DS-1402-CNX:~$ python --version Python 3.10.14 |
Следуя инструкциям Radxa, создаем виртуальное окружение в LLM-TPU/models/Llama3:
1 2 3 4 5 |
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):
1 2 |
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 с выбранной длиной контекста:
1 |
"max_position_embeddings": 1024, |
и скопировать файл в директорию Llama3 от Huggingface:
1 |
cp compile/files/Meta-Llama-3-8B-Instruct/config.json ~/Meta-Llama-3-8B-Instruct/ |
Теперь сгенерируйте onnx-файл, используя загруженную Llama3 и длину 1024 байта:
1 2 |
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 минут:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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.
1 |
deactivate |
Теперь можно начать компиляцию. После выхода из Docker и перезагрузки Cincoze DS-1402, компиляция должна выполняться в Docker. Необходимо повторно подключиться, загрузить настройки окружения и запустить компиляцию:
1 2 3 4 5 6 7 |
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-модели, но их можно проигнорировать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 минут:
1 2 3 4 5 6 |
+ 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:
1 |
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. Сначала протестируем модель:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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 |
Результаты выглядят приемлемо, но можно запустить демо в терминале:
1 2 3 |
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/ |
Функционирует корректно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
(.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 байта, но прогресс есть:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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:
1 2 3 4 5 |
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 и устанавливаем зависимости:
1 2 3 4 5 6 |
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:
1 2 3 |
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 |
Вывод:
1 2 3 4 5 6 7 8 9 10 11 12 |
[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-файле:
1 2 3 4 5 6 7 |
(.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 в том же окружении:
1 2 3 4 5 6 |
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:
1 |
python3 python/yolov8_opencv.py --input ./images --bmodel ./yolov8s_int8_1b.bmodel |
Вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[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-файл остаётся нечитаемым, но демо генерирует изображение (или несколько) с описаниями и контурами объектов.
1 2 3 |
(.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) с увеличенным числом объектов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(.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 для сравнения скорости:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
(.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.
Оригинал статьи вы можете прочитать здесь.