Обзор Particle Tachyon – одноплатный компьютер на Qualcomm QCM6490 для Edge AI с 5G, протестированный с Ubuntu

В данном обзоре рассматривается одноплатный компьютер Particle Tachyon , разработанный для высокопроизводительных приложений edge AI, IoT и систем связи. Плата основана на платформе Qualcomm QCM6490 с восьмиядерным процессором Kryo, графическим ускорителем Adreno и DSP Hexagon. Плата также интегрирует robust-опции беспроводной связи, включая 5G, Wi-Fi 6E и Bluetooth 5.2.

The Particle Tachyon.
Particle Tachyon.

Particle Tachyon использует форм-фактор Raspberry Pi и предоставляет различные интерфейсы ввода-вывода, такие как 40-контактный GPIO-заголовок, совместимый с Raspberry Pi HAT, а также опции расширения для сенсоров и периферии. Также присутствуют коннектор Qwiic для интеграции с продуктами SparkFun и Adafruit, а также коннекторы MIPI-CSI/DSI для камер и дисплеев.

Распаковка Particle Tachyon

Посылка была отправлена из Гонконга и прибыла со всеми ожидаемыми компонентами. Внутри упаковки были обнаружены литий-полимерный аккумулятор 3.7 В с 3-контактным JST-PH коннектором, основная плата Tachyon, небольшая приветственная карточка и дополнительная плата с микрофоном.

Received package.
Полученная посылка.

На следующем фото показано сравнение плат Particle Tachyon, BeagleY-AI , Raspberry Pi 5 и Raspberry Pi 4 Model B.

Size comparison of the Particle Tachyon, BeagleY-AI, Raspberry Pi 5, and Raspberry Pi 4 Model B boards

Сравнение размеров плат Particle Tachyon, BeagleY-AI, Raspberry Pi 5 и Raspberry Pi 4 Model B

Настройка устройства

Для настройки устройства были выполнены шаги с официальной страницы Setting up your Tachyon . Сначала был подключен Li-Po аккумулятор к JST-коннектору на плате, затем плата была подключена к ноутбуку с помощью кабеля USB Type-C. Красный светодиод сразу загорелся, подтверждая корректное питание платы. После этого был установлен инструмент Particle CLI на ноутбук и обновлен командой particle update-cli . Запуск particle --version подтвердил установку, показав версию 3.38.1. Следующим шагом был вход в режим программирования путем нажатия и удержания основной кнопки примерно три секунды, пока светодиод не начал мигать желтым. Затем был установлен USB-драйвер с помощью инструмента Zadig , как рекомендовано.

Сначала была опробована настройка десктопной версии путем запуска CLI-команды particle tachyon setup и следования guided-процессу. На этапе выбора ПО был выбран вариант desktop, который включает полную графическую среду. Согласно официальной документации , поддерживаются как Ubuntu 20.04 (устаревшая поддержка), так и Ubuntu 24.04 (текущая разработка). На момент обзора инструмент установки установил Ubuntu 20.04. Загрузка и установка ОС завершились без проблем менее чем за 20 минут.

===================================================================================
                          Particle Tachyon Setup Command
===================================================================================

Welcome to the Particle Tachyon setup! This interactive command:

- Flashes your Tachyon device
- Configures it (password, WiFi credentials etc...)
- Connects it to the internet and the Particle Cloud!

What you'll need:

1. Your Tachyon device
2. The Tachyon battery
3. A USB-C cable

Important:
- This tool requires you to be logged into your Particle account.
- For more details, check out the documentation at: https://part.cl/setup-tachyon
===================================================================================
Step 1:
Okay—first up! Checking if you're logged in...
...All set! You're logged in as xxxxxxxx@xxxxxxxx and ready to go!
===================================================================================

Step 2:
Now let's get the device info
Starting Process. See logs at: \Users\kumpe\.particle\logs\tachyon_flash_xxxxxxx.log
Device info:
 -  Device ID: xxxxxxxx
 -  Region: RoW
 -  OS Version: Ubuntu 20.04
 -  USB Version: 3.0
===================================================================================
Step 3:
Now let's capture some information about how you'd like your device to be configured when it first boots.
First, pick a password for the root account on your Tachyon device.
This same password is also used for the "particle" user account.
? Enter a password for the root and particle accounts: [hidden]
? Re-enter the password for the root and particle accounts: [hidden]

...
...
===================================================================================
Step 11:
All done! Your Tachyon device is now booting into the operating system and will automatically connect to Wi-Fi.
It will also:
  - Activate the built-in 5G modem
  - Connect to the Particle Cloud
  - Run all system services, including battery charging
For more information about Tachyon, visit our developer site at: https://developer.particle.io!
View your device on the Particle Console at: https://console.particle.io/testproduct-xxxx/devices/yyyyyy

После перезагрузки устройства и повторного подключения клавиатуры и мыши система загрузилась в диалог «Welcome to Tachyon». Шаги с 1 по 3 прошли гладко, но шаг 4 никогда не завершался, несмотря на многократные попытки. При проверке Particle Console идентификатор устройства корректно отображался на странице Devices, но процесс handshake так и не завершался.

Welcome to Tachyon dialog.
Диалог Welcome to Tachyon.
Organize your Particle device step.
Шаг организации Particle устройства.
The Particle Console was waiting for the device to connect.
Particle Console ожидал подключения устройства.

Основываясь на отзывах сообщества , предлагавших использовать headless-настройку вместо GUI-десктопа, следующим шагом была опробована опция headless. Эта установка также завершилась успешно, и основной светодиод перешел с мигающего зеленого на пурпурный, указывая на установление Wi-Fi соединения. Однако светодиод так и не стал голубым, что должно указывать на успешное сотовое соединение. Тем не менее, на этот раз Particle Console успешно завершил handshake и установил соединение с платой.

Wi-Fi connection was established.
Wi-Fi соединение было установлено.

Далее были протестированы некоторые удаленные командные операции, такие как удаленный запуск htop из панели Terminal без каких-либо проблем. На следующих изображениях показаны дополнительные тесты с использованием Particle Console для проверки статуса устройства.

The Particle Console successfully completed the handshake with the Tachyon.
Particle Console успешно завершил handshake с Tachyon.
Remote execution of the htop command.
Удаленное выполнение команды htop.
Viewing network status in the Particle Console.
Просмотр статуса сети в Particle Console.
Checking eSIMs status in the Particle Console.
Проверка статуса eSIM в Particle Console.

Проверка информации о плате Particle Tachyon с помощью inxi

Лог inxi с платы Particle Tachyon показывает, что она работает под управлением Ubuntu 20.04.6 LTS (Focal Fossa) с ядром 5.4.219 на ARM-совместимом SoC от Qualcomm. CPU идентифицирован как 8-ядерный кластер Kryo с частотой от 300 МГц до 2.7 ГГц, что соответствует заявленной платформе Qualcomm QCM6490, используемой в Tachyon. Графический вывод осуществляется через драйвер msm-dai-q6-hdmi с разрешением 1920×1080 @ 60 Гц, но рендеринг выполняется через llvmpipe (LLVM 12, Mesa 21.2.6) вместо прямого ускорения на GPU Adreno. Мониторинг аккумулятора работает как ожидалось, температурные показатели были стабильными с температурой CPU 28 °C.

Что касается connectivity, лог перечисляет интерфейс Wi-Fi Qualcomm CNSS PCI с активным wlan0, а также несколько виртуальных и сотовых интерфейсов. Локальное хранилище указано как eMMC модуль KM8L9001JM-B624 на 116 ГБ. Использование памяти показывает 3.96 ГБ из 7.1 ГБ ОЗУ. В целом, лог подтверждает, что заявленное железо соответствует официальным спецификациям Tachyon, хотя графическая поддержка в настоящее время по умолчанию использует программный рендеринг, а не задействует GPU Adreno через драйверы.

System:
  Host: tachyon-7c1f4061 Kernel: 5.4.219 aarch64 bits: 64 
  Desktop: Gnome 3.36.9 Distro: Ubuntu 20.04.6 LTS (Focal Fossa) 
Machine:
  Type: ARM Device System: Particle Tachyon details: N/A 
Battery:
  ID-1: battery charge: 94% condition: N/A 
CPU:
  Topology: 8-Core (3-Die) model: N/A variant: kryo bits: 64 type: MCP MCM 
  Speed: 806 MHz min/max: 300:691:806/1958:2400:2707 MHz Core speeds (MHz): 
  1: 691 2: 691 3: 691 4: 691 5: 691 6: 691 7: 691 8: 806 
Graphics:
  Device-1: msm-dai-q6-hdmi driver: msm_dai_q6_hdmi v: N/A 
  Display: wayland server: X.Org 1.20.13 driver: msm_dai_q6_hdmi 
  resolution: 1920x1080~60Hz 
  OpenGL: renderer: llvmpipe (LLVM 12.0.0 128 bits) v: 4.5 Mesa 21.2.6 
Audio:
  Device-1: msm-audio-apr driver: audio_apr 
  Device-2: msm-dai-q6-hdmi driver: msm_dai_q6_hdmi 
  Device-3: audio-ref-clk driver: audio_ref_clk 
  Device-4: audio-ref-clk driver: audio_ref_clk 
  Device-5: audio-ref-clk driver: audio_ref_clk 
  Device-6: audio-ref-clk driver: audio_ref_clk 
  Device-7: usb-audio-qmi-dev driver: uaudio_qmi 
  Device-8: audio-ref-clk driver: audio_ref_clk 
  Device-9: audio-ref-clk driver: audio_ref_clk 
  Device-10: audio-ref-clk driver: audio_ref_clk 
  Device-11: audio-ref-clk driver: audio_ref_clk 
  Device-12: msm-audio-ion-cma driver: msm_audio_ion 
  Device-13: msm-audio-ion driver: msm_audio_ion 
  Device-14: q6core-audio driver: q6core_audio 
  Sound Server: ALSA v: k5.4.219 
Network:
  Device-1: Qualcomm driver: cnss_pci 
  IF: p2p0 state: down mac: ea:8d:a6:f1:4d:e3 
  Device-2: ipa-smmu-wlan-cb driver: ipa 
  IF-ID-1: bridge0 state: down mac: 22:2c:6a:1e:74:21 
  IF-ID-2: docker0 state: down mac: 02:42:f6:6c:a2:0e 
  IF-ID-3: dummy0 state: down mac: 76:12:a9:e6:01:75 
  IF-ID-4: erspan0 state: down mac: 00:00:00:00:00:00 
  IF-ID-5: gre0 state: down mac: 00:00:00:00 
  IF-ID-6: gretap0 state: down mac: 00:00:00:00:00:00 
  IF-ID-7: ip6_vti0 state: down 
  mac: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 
  IF-ID-8: ip6gre0 state: down 
  mac: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 
  IF-ID-9: ip6tnl0 state: down 
  mac: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 
  IF-ID-10: ip_vti0 state: down mac: 00:00:00:00 
  IF-ID-11: rmnet_data0 state: down mac: N/A 
  IF-ID-12: rmnet_data1 state: down mac: N/A 
  IF-ID-13: rmnet_data10 state: down mac: N/A 
  IF-ID-14: rmnet_data11 state: down mac: N/A 
  IF-ID-15: rmnet_data12 state: down mac: N/A 
  IF-ID-16: rmnet_data13 state: down mac: N/A 
  IF-ID-17: rmnet_data14 state: down mac: N/A 
  IF-ID-18: rmnet_data15 state: down mac: N/A 
  IF-ID-19: rmnet_data16 state: down mac: N/A 
  IF-ID-20: rmnet_data2 state: down mac: N/A 
  IF-ID-21: rmnet_data3 state: down mac: N/A 
  IF-ID-22: rmnet_data4 state: down mac: N/A 
  IF-ID-23: rmnet_data5 state: down mac: N/A 
  IF-ID-24: rmnet_data6 state: down mac: N/A 
  IF-ID-25: rmnet_data7 state: down mac: N/A 
  IF-ID-26: rmnet_data8 state: down mac: N/A 
  IF-ID-27: rmnet_data9 state: down mac: N/A 
  IF-ID-28: rmnet_ipa0 state: unknown speed: N/A duplex: N/A mac: N/A 
  IF-ID-29: sit0 state: down mac: 00:00:00:00 
  IF-ID-30: tailscale0 state: unknown speed: 10 Mbps duplex: full mac: N/A 
  IF-ID-31: tunl0 state: down mac: 00:00:00:00 
  IF-ID-32: wlan0 state: up mac: e8:8d:a6:6b:4d:e3 
Drives:
  Local Storage: total: 118.88 GiB used: 10.77 GiB (9.1%) 
  ID-1: /dev/sda model: KM8L9001JM-B624 size: 116.73 GiB 
  ID-2: /dev/sdb model: KM8L9001JM-B624 size: 8.0 MiB 
  ID-3: /dev/sdc model: KM8L9001JM-B624 size: 8.0 MiB 
  ID-4: /dev/sdd model: KM8L9001JM-B624 size: 128.0 MiB 
  ID-5: /dev/sde model: KM8L9001JM-B624 size: 128.0 MiB 
  ID-6: /dev/sdf model: KM8L9001JM-B624 size: 144.0 MiB 
  ID-7: /dev/sdg model: KM8L9001JM-B624 size: 1.75 GiB 
Partition:
  ID-1: / size: 110.21 GiB used: 10.57 GiB (9.6%) fs: ext4 dev: /dev/sda11 
Sensors:
  System Temperatures: cpu: 28.0 C mobo: N/A 
  Fan Speeds (RPM): N/A 
Info:
  Processes: 519 Uptime: 11m Memory: 7.13 GiB used: 3.96 GiB (55.6%) 
  Shell: bash inxi: 3.0.38

Бенчмаркинг с sbc-bench

Вкратце, при попытке запустить sbc-bench произошел сбой, так как скрипт постоянно возвращал ошибку failed to set pid xxxx's affinity: Invalid argument, как показано в логе ниже. Тем не менее, удалось запустить sbc-bench -m для мониторинга некоторой информации о CPU и базовой системе, как показано в следующем логе. Был создан issue на GitHub , но оперативно найти решение не удалось. Поскольку не было времени анализировать ошибку и хотелось перейти к тестированию других функций Particle Tachyon, тестирование sbc-bench на этом этапе было прекращено.

Starting to examine hardware/software for review purposes...
WARNING: dmesg output does not contain early boot messages which
help in identifying hardware details.

It is recommended to reboot now and then execute the benchmarks.
Press [ctrl]-[c] to stop or [enter] to continue.

Average load and/or CPU utilization too high (too much background activity). Waiting...

...
sbc-bench v0.9.72
Installing needed tools: apt-get -f -qq -y install sysstat links mmc-utils smartmontools stress-ng p7zip, tinymembench, ramlat, mhz.., cpufetch (can't build cpuminer) Done.
Checking cpufreq OPP...taskset: failed to set pid 26174's affinity: Invalid argument
taskset: failed to set pid 26176's affinity: Invalid argument
taskset: failed to set pid 26198's affinity: Invalid argument
taskset: failed to set pid 26200's affinity: Invalid argument
taskset: failed to set pid 26220's affinity: Invalid argument
...
 Done.
Executing tinymembench. Done.
Executing RAM latency tester...taskset: failed to set pid 28505's affinity: Invalid argument
taskset: failed to set pid 28514's affinity: Invalid argument
 Done.
Executing OpenSSL benchmark. Done.
Executing 7-zip benchmark. Done.
Throttling test: heating up the device, 5 more minutes to wait. Done.
Checking cpufreq OPP again...taskset: failed to set pid 34832's affinity: Invalid argument
taskset: failed to set pid 34834's affinity: Invalid argument
taskset: failed to set pid 34866's affinity: Invalid argument
taskset: failed to set pid 34868's affinity: Invalid argument
 Done (13 minutes elapsed).

./sbc-bench.sh: line 4595: 100 * MeasuredClockspeedStart / 0 : division by 0 (error token is "0 ")
./sbc-bench.sh: line 1: kill: (32094) - No such process

Это результат команды sbc-bench -m .

Snapdragon 497 rev 1.0, Kernel: aarch64, Userland: arm64
 
CPU sysfs topology (clusters, cpufreq members, clockspeeds)
                  cpufreq   min    max
CPU    cluster  policy   speed  speed   core type
 0        0        0      300    1958   Cortex-A55 / r2p0
 1        0        0      300    1958   Cortex-A55 / r2p0
 2        0        0      300    1958   Cortex-A55 / r2p0
 3        0        0      300    1958   Cortex-A55 / r2p0
 4        1        4      691    2400   Cortex-A78 / r1p1
 5        1        4      691    2400   Cortex-A78 / r1p1
 6        1        4      691    2400   Cortex-A78 / r1p1
 7        2        7      806    2707   Cortex-A78 / r1p1

Time       cpu0/cpu4/cpu7    load %cpu %sys %usr %nice %io %irq   Temp
10:33:56: 1958/2400/2707MHz  2.07  11%   1%   9%   0%   0%   0%      °C  
10:34:01: 1958/2400/2707MHz  2.14   2%   1%   0%   0%   0%   0%      °C  
10:34:06: 1958/2400/2707MHz  2.21   2%   1%   0%   0%   0%   0%      °C  
10:34:11: 1958/2400/2707MHz  2.27   1%   1%   0%   0%   0%   0%      °C

Тестирование производительности сети с iperf

Были протестированы скорости беспроводной связи с использованием  iperf3 в диапазонах 2.4 ГГц и 5 ГГц Wi-Fi, подключение осуществлялось через домашний роутер. Все следующие результаты были получены без какой-либо оптимизации; другие устройства, такие как телевизоры и мобильные телефоны, могли использовать Wi-Fi одновременно. Роутер находился на расстоянии около 6–7 метров.

Для тестовой настройки ноутбук с Windows 11 был настроен как сервер с помощью команды iperf -s . Результаты iperf3 между Particle Tachyon и хост-компьютером показывают четкую разницу в производительности между Wi-Fi 2.4 ГГц и 5 ГГц, как показано ниже.

Тестирование скорости передачи данных по Wi-Fi 2.4 ГГц

Отправка:

iperf3 -c 192.168.1.8 -t 60 -i 10
Connecting to host 192.168.1.8, port 5201
[  5] local 192.168.1.11 port 39964 connected to 192.168.1.8 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-10.00  sec  15.2 MBytes  12.7 Mbits/sec   16   33.9 KBytes       
[  5]  10.00-20.00  sec  17.5 MBytes  14.7 Mbits/sec   12   33.9 KBytes       
[  5]  20.00-30.00  sec  14.1 MBytes  11.8 Mbits/sec   20   28.3 KBytes       
[  5]  30.00-40.00  sec  14.3 MBytes  12.0 Mbits/sec   18   43.8 KBytes       
[  5]  40.00-50.00  sec  17.1 MBytes  14.3 Mbits/sec   14   46.7 KBytes       
[  5]  50.00-60.00  sec  17.8 MBytes  14.9 Mbits/sec   14   90.5 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  96.0 MBytes  13.4 Mbits/sec   94             sender
[  5]   0.00-60.02  sec  95.4 MBytes  13.3 Mbits/sec                  receiver

iperf Done.

Прием:

iperf3 -c 192.168.1.8 -t 60 -i 10 -R
Connecting to host 192.168.1.8, port 5201
Reverse mode, remote host 192.168.1.8 is sending
[  5] local 192.168.1.11 port 38422 connected to 192.168.1.8 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  18.5 MBytes  15.5 Mbits/sec                  
[  5]  10.00-20.00  sec  19.9 MBytes  16.7 Mbits/sec                  
[  5]  20.00-30.00  sec  28.8 MBytes  24.2 Mbits/sec                  
[  5]  30.00-40.00  sec  28.6 MBytes  24.0 Mbits/sec                  
[  5]  40.00-50.00  sec  36.3 MBytes  30.4 Mbits/sec                  
[  5]  50.00-60.00  sec  36.4 MBytes  30.5 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-60.02  sec   169 MBytes  23.6 Mbits/sec                  sender
[  5]   0.00-60.00  sec   168 MBytes  23.5 Mbits/sec                  receiver

iperf Done.

Двунаправленный:

iperf3 -c 192.168.1.8 -t 60 -i 10 --bidir
Connecting to host 192.168.1.8, port 5201
[  5] local 192.168.1.11 port 39962 connected to 192.168.1.8 port 5201
[  7] local 192.168.1.11 port 39976 connected to 192.168.1.8 port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-10.00  sec  10.9 MBytes  9.13 Mbits/sec   87   15.6 KBytes       
[  7][RX-C]   0.00-10.00  sec  6.53 MBytes  5.48 Mbits/sec                  
[  5][TX-C]  10.00-20.00  sec  6.40 MBytes  5.37 Mbits/sec   31   24.0 KBytes       
[  7][RX-C]  10.00-20.00  sec  11.6 MBytes  9.76 Mbits/sec                  
[  5][TX-C]  20.00-30.00  sec  11.7 MBytes  9.80 Mbits/sec   28   21.2 KBytes       
[  7][RX-C]  20.00-30.00  sec  16.9 MBytes  14.2 Mbits/sec                  
[  5][TX-C]  30.00-40.00  sec  9.88 MBytes  8.29 Mbits/sec   39   17.0 KBytes       
[  7][RX-C]  30.00-40.00  sec  12.9 MBytes  10.8 Mbits/sec                  
[  5][TX-C]  40.00-50.00  sec  9.82 MBytes  8.24 Mbits/sec   38   24.0 KBytes       
[  7][RX-C]  40.00-50.00  sec  17.5 MBytes  14.7 Mbits/sec                  
[  5][TX-C]  50.00-60.00  sec  10.1 MBytes  8.44 Mbits/sec   43   35.4 KBytes       
[  7][RX-C]  50.00-60.00  sec  11.6 MBytes  9.73 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID][Role] Interval           Transfer     Bitrate         Retr
[  5][TX-C]   0.00-60.00  sec  58.7 MBytes  8.21 Mbits/sec  266             sender
[  5][TX-C]   0.00-60.01  sec  58.0 MBytes  8.11 Mbits/sec                  receiver
[  7][RX-C]   0.00-60.00  sec  77.2 MBytes  10.8 Mbits/sec                  sender
[  7][RX-C]   0.00-60.01  sec  77.1 MBytes  10.8 Mbits/sec                  receiver

iperf Done.

В диапазоне 2.4 ГГц пропускная способность в режиме отправки в среднем составила 13.4 Мбит/с, в то время как в режиме приема была немного выше — 23.5 Мбит/с. В двунаправленном режиме производительность упала еще больше, в среднем 8.2 Мбит/с для передачи и 10.8 Мбит/с для приема.

Тестирование скорости передачи данных по Wi-Fi 5 ГГц

Отправка:

Connecting to host 192.168.1.8, port 5201
[  5] local 192.168.1.11 port 56378 connected to 192.168.1.8 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-10.00  sec   126 MBytes   106 Mbits/sec    2    724 KBytes       
[  5]  10.00-20.00  sec   122 MBytes   103 Mbits/sec    5    400 KBytes       
[  5]  20.00-30.00  sec   123 MBytes   104 Mbits/sec    2    421 KBytes       
[  5]  30.00-40.00  sec   123 MBytes   103 Mbits/sec    4    311 KBytes       
[  5]  40.00-50.00  sec   120 MBytes   101 Mbits/sec    0    532 KBytes       
[  5]  50.00-60.00  sec   118 MBytes  99.1 Mbits/sec    2    516 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec   733 MBytes   102 Mbits/sec   15             sender
[  5]   0.00-60.04  sec   733 MBytes   102 Mbits/sec                  receiver

Прием:

iperf3 -c 192.168.1.8 -t 60 -i 10 -R
Connecting to host 192.168.1.8, port 5201
Reverse mode, remote host 192.168.1.8 is sending
[  5] local 192.168.1.11 port 34518 connected to 192.168.1.8 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  98.0 MBytes  82.2 Mbits/sec                  
[  5]  10.00-20.00  sec   103 MBytes  86.3 Mbits/sec                  
[  5]  20.00-30.00  sec   101 MBytes  84.8 Mbits/sec                  
[  5]  30.00-40.00  sec   106 MBytes  89.0 Mbits/sec                  
[  5]  40.00-50.00  sec   109 MBytes  91.5 Mbits/sec                  
[  5]  50.00-60.00  sec   107 MBytes  90.0 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-60.01  sec   625 MBytes  87.4 Mbits/sec                  sender
[  5]   0.00-60.00  sec   624 MBytes  87.3 Mbits/sec                  receiver

iperf Done.

Двунаправленный:

Connecting to host 192.168.1.8, port 5201
[  5] local 192.168.1.11 port 55836 connected to 192.168.1.8 port 5201
[  7] local 192.168.1.11 port 55844 connected to 192.168.1.8 port 5201
[ ID][Role] Interval           Transfer     Bitrate         Retr  Cwnd
[  5][TX-C]   0.00-10.00  sec  35.8 MBytes  30.0 Mbits/sec   39    247 KBytes       
[  7][RX-C]   0.00-10.00  sec  61.0 MBytes  51.1 Mbits/sec                  
[  5][TX-C]  10.00-20.00  sec  42.9 MBytes  36.0 Mbits/sec    2    245 KBytes       
[  7][RX-C]  10.00-20.00  sec  66.5 MBytes  55.8 Mbits/sec                  
[  5][TX-C]  20.00-30.00  sec  53.3 MBytes  44.7 Mbits/sec    2    460 KBytes       
[  7][RX-C]  20.00-30.00  sec  57.6 MBytes  48.3 Mbits/sec                  
[  5][TX-C]  30.00-40.00  sec  49.4 MBytes  41.4 Mbits/sec   13    267 KBytes       
[  7][RX-C]  30.00-40.00  sec  51.2 MBytes  42.9 Mbits/sec                  
[  5][TX-C]  40.00-50.00  sec  60.1 MBytes  50.4 Mbits/sec   11    372 KBytes       
[  7][RX-C]  40.00-50.00  sec  59.9 MBytes  50.3 Mbits/sec                  
[  5][TX-C]  50.00-60.00  sec  54.5 MBytes  45.7 Mbits/sec    2    393 KBytes       
[  7][RX-C]  50.00-60.00  sec  56.5 MBytes  47.4 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID][Role] Interval           Transfer     Bitrate         Retr
[  5][TX-C]   0.00-60.00  sec   296 MBytes  41.4 Mbits/sec   69             sender
[  5][TX-C]   0.00-60.06  sec   295 MBytes  41.2 Mbits/sec                  receiver
[  7][RX-C]   0.00-60.00  sec   353 MBytes  49.4 Mbits/sec                  sender
[  7][RX-C]   0.00-60.06  sec   353 MBytes  49.3 Mbits/sec                  receiver

iperf Done.

Переключение на Wi-Fi 5 ГГц значительно улучшило производительность. В режиме отправки Tachyon стабильно показывал около 102.0 Мбит/с, в то время как в режиме приема достигал 87.3 Мбит/с. Двунаправленный режим показал хороший баланс: передача в среднем 41.4 Мбит/с, а прием около 49.4 Мбит/с.

В целом, беспроводная производительность Tachyon является solid в диапазоне 5 ГГц. Хотя в логах были обнаружены некоторые нестабильности, такие как occasional packet loss и retransmissions. Они могли быть вызваны хост-компьютером, помехами сигнала или самим роутером. Кроме того, iperf3 запускался на хосте с Windows 11, который может не обеспечивать тот же уровень производительности, что и система на базе Linux для сетевого бенчмаркинга .

Бенчмаркинг eMMC флеш-памяти с iozone

Результаты бенчмарка iozone на плате Particle Tachyon демонстрируют высокую производительность ввода-вывода с тестовым файлом 512 МБ и размерами записей 1024 КБ и 16384 КБ. Скорости последовательной записи варьировались от примерно 516 до 548 МБ/с, при этом скорости перезаписи были немного ниже — около 513 до 523 МБ/с. Операции чтения и повторного чтения были быстрее, достигая приблизительно 793 МБ/с при размере записей 1 МБ и до 950 МБ/с при 16 МБ. Производительность случайного чтения также была эффективной: около 709 МБ/с для записей 1 МБ и около 933 МБ/с для записей 16 МБ, в то время как скорости случайной записи оставались стабильными на уровне около 517 до 520 МБ/с.

iozone -e -I -a -s 512M -r 1024k -r 16384k -i 0 -i 1 -i 2
Iozone: Performance Test of File I/O
		Version $Revision: 3.489 $
	Compiled for 64 bit mode.
	Build: linux 
														  random    random     bkwd    record    stride                                    
		  kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
	  524288    1024   516731   513034   792809   795314   708912   517244                                                                
	  524288   16384   548228   523277   942690   950215   933300   520009                                                                

iozone test complete.

В целом, результаты подчеркивают хорошо оптимизированную подсистему хранения на плате Particle Tachyon, с положительным масштабированием производительности при больших размерах блоков, особенно для операций чтения. Стабильные скорости записи и высокая производительность последовательного чтения свидетельствуют о том, что встроенное хранилище и контроллер настроены для сбалансированных рабочих нагрузок.

Тестирование веб-браузеров с Speedometer 3.1

Был протестирован Speedometer 3.1 с использованием как браузера Chromium, включенного в ОС по умолчанию, так и недавно установленного браузера Firefox на Particle Tachyon. Средний балл в Firefox достиг 4.80, что заметно выше, чем 3.45 у Chromium. Следующий анализ объединяет оба лога для сравнения.

Некоторые результаты теста Chromium.

{
    ...
    "Score": {
        "name": "Score",
        "unit": "score",
        "description": "Scaled inverse of the Geomean",
        "mean": 3.490126014335767,
        "delta": 0.08525368411588982,
        "percentDelta": 2.4427107722101864,
        "sum": 34.90126014335767,
        "min": 3.2505296853945795,
        "max": 3.671860859944475,
        "values": [
            3.2505296853945795,
            3.528285683765244,
            3.602685103205795,
            3.3430617694265514,
            3.5040605622261314,
            3.475742816788889,
            3.5150877298778496,
            3.671860859944475,
            3.495627857605704,
            3.514318075122452
        ]
    }
}

Некоторые результаты теста Firefox.

{
    ...
    "Score": {
        "name": "Score",
        "unit": "score",
        "description": "Scaled inverse of the Geomean",
        "mean": 4.95512761866093,
        "delta": 0.14967231208370088,
        "percentDelta": 3.020554133056783,
        "sum": 49.55127618660929,
        "min": 4.387574109889527,
        "max": 5.099536229934388,
        "values": [
            4.387574109889527,
            4.86512346366237,
            5.017082525331689,
            5.05246500141165,
            5.040888596011321,
            5.006502278815123,
            5.042243557016601,
            4.977395230281133,
            5.099536229934388,
            5.062465194255494
        ]
    }
}

Chromium achieved a score of 3.49 in Speedometer 3.1.
Chromium показал результат 3.49 в Speedometer 3.1

.

Firefox achieved a score of 4.96 in Speedometer 3.1.
Firefox показал результат 4.96 в Speedometer 3.1.

В Chromium такие фреймворки, как Vue, Svelte и Backbone, завершали задачи в диапазоне 100–200 мс, демонстрируя плавную обработку синхронных операций и умеренную задержку для асинхронных. Более тяжелые фреймворки, такие как React и Angular, выполняли основные задачи в середине диапазона 200 мс, в то время как jQuery и базовые реализации ES5 испытывали наибольшие трудности, часто превышая 300 мс, а в некоторых случаях достигая более одной секунды.

В Firefox производительность была стабильно лучше почти во всех фреймворках. Vue и Svelte были наиболее отзывчивыми, выполняя задачи добавления и удаления быстрее, чем в Chromium. React и Angular также показали улучшение, сохраняя задержки ниже, чем их аналоги в Chromium. Даже jQuery, оставаясь самым медленным, показал reduced lag по сравнению с результатами Chromium.

Тестирование воспроизведения видео YouTube на плате Particle Tachyon

Было протестировано воспроизведение YouTube на Particle Tachyon с использованием 4K видео Норвегии при нескольких разрешениях от 240p до 2160p. Видео просматривалось в полноэкранном режиме при настольном разрешении 1080p, поэтому все, что выше, масштабировалось для соответствия.

При низких разрешениях 240p, 360p и 480p плата не испытывала никаких проблем. Воспроизведение было плавным с незначительными потерями кадров, а состояние буфера оставалось стабильным на протяжении всего времени, что показывает надежную обработку легких нагрузок видеопотока.

particle tachyon youtube chromium 426x240
Разрешение: 426×240
particle tachyon youtube chromium 640x360
Разрешение: 640×360
particle tachyon youtube chromium 854x480
Разрешение: 854×480
particle tachyon youtube chromium 1280x720
Разрешение: 1280×720
particle tachyon youtube chromium 1920x1080
Разрешение: 1920×1080
particle tachyon youtube chromium 2560x1440
Разрешение: 2560×1440
particle tachyon youtube chromium 3840x2160
Разрешение: 3840×2160

При переходе к 720p и 1080p воспроизведение все еще оставалось вполне приемлемым, хотя и были заметны occasional dropped frames, особенно при Full HD, где чипсет явно работал интенсивнее. Переход за эти пределы к 1440p и 2160p выявил ограничения. Видео воспроизводилось, но потери кадров были частыми, а состояние буфера колебалось, поскольку скорость соединения скачкообразно увеличивалась, чтобы справиться с более высоким битрейтом.

Youtube playback performances.

Производительность воспроизведения YouTube.

Тестирование WebGL рендеринга в веб-браузерах

Следующий тест был сосредоточен на браузерном 3D-рендеринге с использованием демо WebGL Aquarium в Chromium. При наличии всего одной рыбы на экране средняя частота кадров составляла около 5 кадров/с. Увеличение количества до 100 или 500 рыб сохраняло производительность на уровне около 4 кадров/с, а при 1000 до 5000 рыб она оставалась в диапазоне 3–4 кадров/с. При более тяжелых нагрузках, таких как 10 000 до 25 000 рыб, частота кадров падала дальше — между 2 кадр/с и 1 кадр/с.

В целом, хотя производительность 3D-рендеринга в Chromium была довольно низкой, вероятно, из-за того, что конфигурация по умолчанию образа десктопной ОС еще не оптимизирована для GPU-ускорения, это не создавало высокой нагрузки на CPU. В результате другие GUI-приложения оставались отзывчивыми и не страдали от lag, который наблюдался на других тестируемых SBC.

particle tachyon webgl chromium 1
Fish=1, FPS=5
particle tachyon webgl chromium 100
Fish=100, FPS=4
particle tachyon webgl chromium 500
Fish=500, FPS=4
particle tachyon webgl chromium 1000
Fish=1000, FPS=4
particle tachyon webgl chromium 5000
Fish=5000, FPS=3
particle tachyon webgl chromium 10000 Fish=10000, FPS=2
particle tachyon webgl chromium 20000 Fish=15000, FPS=2 particle tachyon webgl chromium 25000 Fish=20000, FPS=2

Тестирование 3D-графики с glmark2

Далее было протестировано 3D-графическое рендеринг с glmark2, который показал общий балл 62. Инструмент сообщил, что система работает на Mesa llvmpipe (LLVM 12.0.0), а не на GPU Adreno. Другие более простые тесты, такие как фильтрация текстур и базовые эффекты, достигли более 100 кадров/с, в то время как более сложные задачи затенения и освещения опустились до диапазона 40–50 кадров/с. Наиболее тяжелые workload, включая рендеринг terrain и refraction, показали наибольшие ограничения, с частотами кадров всего 4 кадр/с и 10 кадр/с соответственно.

Testing glmark2.

Тестирование glmark2.

=======================================================
    glmark2 2021.02
=======================================================
    OpenGL Information
    GL_VENDOR:     Mesa/X.org
    GL_RENDERER:   llvmpipe (LLVM 12.0.0, 128 bits)
    GL_VERSION:    3.1 Mesa 21.2.6
=======================================================
[build] use-vbo=false: FPS: 68 FrameTime: 14.706 ms
[build] use-vbo=true: FPS: 67 FrameTime: 14.925 ms
[texture] texture-filter=nearest: FPS: 113 FrameTime: 8.850 ms
[texture] texture-filter=linear: FPS: 118 FrameTime: 8.475 ms
[texture] texture-filter=mipmap: FPS: 113 FrameTime: 8.850 ms
[shading] shading=gouraud: FPS: 48 FrameTime: 20.833 ms
[shading] shading=blinn-phong-inf: FPS: 44 FrameTime: 22.727 ms
[shading] shading=phong: FPS: 40 FrameTime: 25.000 ms
[shading] shading=cel: FPS: 40 FrameTime: 25.000 ms
[bump] bump-render=high-poly: FPS: 24 FrameTime: 41.667 ms
[bump] bump-render=normals: FPS: 113 FrameTime: 8.850 ms
[bump] bump-render=height: FPS: 108 FrameTime: 9.259 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 111 FrameTime: 9.009 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 103 FrameTime: 9.709 ms
[pulsar] light=false:quads=5:texture=false: FPS: 121 FrameTime: 8.264 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 19 FrameTime: 52.632 ms
[desktop] effect=shadow:windows=4: FPS: 53 FrameTime: 18.868 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 37 FrameTime: 27.027 ms
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 38 FrameTime: 26.316 ms
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 38 FrameTime: 26.316 ms
[ideas] speed=duration: FPS: 49 FrameTime: 20.408 ms
[jellyfish] <default>: FPS: 36 FrameTime: 27.778 ms
[terrain] <default>: FPS: 4 FrameTime: 250.000 ms
[shadow] <default>: FPS: 28 FrameTime: 35.714 ms
[refract] <default>: FPS: 10 FrameTime: 100.000 ms
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 66 FrameTime: 15.152 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 63 FrameTime: 15.873 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 66 FrameTime: 15.152 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 66 FrameTime: 15.152 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 63 FrameTime: 15.873 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 64 FrameTime: 15.625 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 65 FrameTime: 15.385 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 65 FrameTime: 15.385 ms
=======================================================
glmark2 Score: 62 
=======================================================

Тестирование производительности AI

Подготовка

Во время этого обзора было замечено, что не существует четких пошаговых руководств по установке или тестированию AI на плате Particle Tachyon, поэтому пришлось полагаться на ресурсы, доступные из Qualcomm AI Hub . После создания учетной записи для получения необходимого API_TOKEN была настроена новая виртуальная среда с venv для чистоты установки. Первая попытка с Python 3.10 завершилась неудачей во время тестирования, но переход на Python 3.9 прошел гораздо глаже.

Затем был установлен пакет Qualcomm AI Hub с помощью pip3 install qai-hub. Настройка продолжилась входом в систему и конфигурацией с помощью qai-hub configure --api_token API_TOKEN, что связало среду с учетной записью Qualcomm AI Hub. Оттуда была подтверждена доступность устройства с помощью qai-hub list-devices. Набор инструментов также предоставляет полезные команды, такие как qai-hub list-models и qai-hub list-exports, что упрощает проверку поддерживаемых моделей. В целом, процесс потребовал некоторых проб и ошибок, но после настройки инструменты работали надежно для тестирования производительности AI на Particle Tachyon.

Базовые тесты

Несколько моделей AI, такие как MobileNet, FFNet и YOLO, доступны по адресу   https://github.com/quic/ai-hub-models . Для первого теста было выполнено пример real-time selfie segmentation со страницы начала работы . Модель была установлена с помощью pip3 install "qai-hub-models[ffnet_40s]" и запущена с использованием python -m qai_hub_models.models.ffnet_40s.demo. На следующем изображении показан результат сегментации.

(venv310) particle@tachyon-7c1f4061:~/Documents/particle_test_logs$ python -m qai_hub_models.models.ffnet_40s.demo
Downloading data at https://qaihub-public-assets.s3.us-west-2.amazonaws.com/qai-hub-models/models/cityscapes_segmentation/v1/cityscapes_like_demo_2048x1024.jpg to /home/particle/.qaihm/models/cityscapes_segmentation/v1/cityscapes_like_demo_2048x1024.jpg
100%|█████████████████████████████████████████████████████████████████████████████| 443k/443k [05:22<00:00, 1.37kB/s]
Done
Downloading data at https://github.com/quic/aimet-model-zoo/releases/download/torch_segmentation_ffnet/ffnet40S_dBBB_cityscapes_state_dict_quarts.pth to /home/particle/.qaihm/models/ffnet/v1/ffnet40S/ffnet40S_dBBB_cityscapes_state_dict_quarts.pth
100%|███████████████████████████████████████████████████████████████████████████| 55.8M/55.8M [00:05<00:00, 9.72MB/s]
Done
cityscapes_segmentation requires repository https://github.com/Qualcomm-AI-research/FFNet.git . Ok to clone? [Y/n] y
Cloning https://github.com/Qualcomm-AI-research/FFNet.git to /home/particle/.qaihm/models/cityscapes_segmentation/v2/Qualcomm-AI-research_FFNet_git...
Done
Loading pretrained model state dict from /home/particle/.qaihm/models/ffnet/v1/ffnet40S/ffnet40S_dBBB_cityscapes_state_dict_quarts.pth
Initializing ffnnet40S_dBBB_mobile weights
/home/particle/.qaihm/models/cityscapes_segmentation/v2/Qualcomm-AI-research_FFNet_git/models/ffnet_blocks.py:599: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
  pretrained_dict = torch.load(
Running Inference on 0 samples
Displaying predicted image

Input image used for real-time selfie segmentation testing.

Входное изображение, использованное для тестирования реального сегментирования селфи.

Output result from the real-time selfie segmentation test.
Выходной результат теста реального сегментирования селфи.

Также был протестирован YOLO путем установки YOLOv7 с pip install "qai_hub_models[yolov7]". После этого был запущен demo объектной детекции на локальном изображении путем указания пути к изображению с --image ../particle_test_logs/data/CrossWalk_640.jpg.

particle tachyon ai yolo input Input image Output result from Yolov7. Yolov7
Output result from Yolov8n. Yolov8n Output result from Yolov11n. Yolov11n

Далее было протестировано AI-вывод в Python с использованием примерного скрипта из Qualcomm AI Hub , и он работал гладко.

# https://app.aihub.qualcomm.com/docs/hub/inference_examples.html#running-inference-with-a-tflite-model
import numpy as np

import qai_hub as hub

sample = np.random.random((1, 224, 224, 3)).astype(np.float32)


inference_job = hub.submit_inference_job(
    model="models/SqueezeNet10.tflite",
    device=hub.Device("Samsung Galaxy S23 (Family)"),
    inputs=dict(x=[sample]),
)

assert isinstance(inference_job, hub.InferenceJob)
inference_job.download_output_data()

Inference Job Results in Qualcomm AI Hub.
Результаты задания вывода в Qualcomm AI Hub.

Обнаружение объектов в реальном времени с USB-камерой

На официальной веб-странице Particle Tachyon указано, что плата поддерживает два модуля камеры через разъемы CSI1 и DSI/CSI2, как показано на изображении ниже. Теоретически это должно позволять использовать две камеры одновременно. Однако при тестировании с модулем камеры Raspberry Pi Camera Module 3 и камерой Raspberry Pi AI ни одна из них не была обнаружена платой. Было установлено, что камеры Raspberry Pi в настоящее время не поддерживаются на Particle Tachyon из-за их закрытого стека прошивки . В результате следующие результаты были получены с использованием USB-вебкамеры.

Camera connectors
Разъемы камеры

Для подготовки оценки производительности кадры изображения захватывались с USB-вебкамеры с использованием OpenCV в разрешении 640×480. Модель детектирования YOLOv8 была установлена через pip install "qai-hub-models[yolov8-det]", следуя рекомендациям, предоставленным в репозитории qai-hub-models .

Для экспорта квантованной модели с предоставленным скриптом сначала была проверена возможность наличия чипсета QCM6490 в списке поддерживаемых устройств, но он отсутствовал. В качестве альтернативы был выбран QCS6490, который предлагает практически идентичные аппаратные компоненты. Модель затем была экспортирована из Qualcomm AI Hub с использованием скрипта qai_hub_models.models.yolov8_det.export , нацеленного на прокси-чипсет Qualcomm QCS6490. Конфигурация экспорта использовала среду выполнения TensorFlow Lite (TFLite) с выходным разрешением 512×512. Поскольку параметры квантования не были указаны, была применена настройка по умолчанию. Экспортированные файлы были сохранены в указанном каталоге для последующего тестирования.

Было создано виртуальное окружение Python 3.9 с установленными средой выполнения TFLite и NumPy 1.x для обеспечения совместимости. В этой среде модель YOLOv8n была протестирована на нескольких квадратных входных разрешениях — 512, 256, 128 и 64 пикселя — для сравнения производительности неквантованной и квантованной версий.

import cv2
import numpy
import qai_hub as hub
import torch
from ultralytics import YOLO
import time

def main():
    print("Loading YOLO model")
    model = YOLO("models/yolov8n.pt")
    print("Model loaded successfully!")

    #target_img_size = (64, 64)
    #target_img_size = (128, 128)
    #target_img_size = (256, 256)
    #target_img_size = (512, 512)
    target_img_size = (1024, 1024)

    print("Opening camera")
    cap = cv2.VideoCapture('/dev/video0')
    print("Camera opened")

    preprocess_time_min = 999999.99
    preprocess_time_max = -preprocess_time_min
    inference_time_min  = preprocess_time_min
    inference_time_max  = preprocess_time_max
    postprocess_time_min = preprocess_time_min
    postprocess_time_max = preprocess_time_max
    total_time_min = preprocess_time_min
    total_time_max = preprocess_time_max

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            continue
        
        # Perform object detection on the image frame
        results = model.predict(
                frame,
                imgsz=target_img_size,
                conf=0.5,
                verbose=False)
        annotated_frame = results[0].plot()

        speed_ms = results[0].speed  # This is a dictionary in ms
        preprocess_time = speed_ms['preprocess']
        inference_time = speed_ms['inference']
        postprocess_time = speed_ms['postprocess']
        total_time = preprocess_time + inference_time + postprocess_time
        
        if(preprocess_time < preprocess_time_min):
            preprocess_time_min = preprocess_time
        if(preprocess_time > preprocess_time_max):
            preprocess_time_max = preprocess_time

        if(inference_time < inference_time_min):
            inference_time_min = inference_time
        if(inference_time > inference_time_max):
            inference_time_max = inference_time

        if(postprocess_time < postprocess_time_min):
            postprocess_time_min = postprocess_time
        if(postprocess_time > postprocess_time_max):
            postprocess_time_max = postprocess_time

        if(total_time < total_time_min):
            total_time_min = total_time
        if(total_time > total_time_max):
            total_time_max = total_time

        print("---------------------------------")
        print(f"Pre-processing:  {preprocess_time:.2f}, {preprocess_time_min:.2f} - {preprocess_time_max:.2f}ms")
        print(f"Inference:       {inference_time:.2f}, {inference_time_min:.2f} - {inference_time_max:.2f}")
        print(f"Post-processing: {postprocess_time:.2f}, {postprocess_time_min:.2f} - {postprocess_time_max:.2f}")
        print(f"Total Time:      {total_time:.2f}, {total_time_min:.2f} - {total_time_max:.2f}")
        print("---------------------------------")
        
        cv2.imshow("annotated_frame", annotated_frame)

        key = cv2.waitKey(1)
        if(key == ord('q')):
            break

    # done
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

Testing realtime object detection with YOLOv8n.
Тестирование детектирования объектов в реальном времени с YOLOv8n.

Performances of YOLOv8n on Particle Tachyon.
Производительность YOLOv8n на Particle Tachyon.
Camera connectors
Сравнения производительности YOLOv8 на Particle Tachyon

Тест производительности YOLOv8n на Particle Tachyon, показанный на графике, демонстрирует четкую корреляцию между входным разрешением и временем обработки. Для неквантованной модели инференц доминирует в общем времени выполнения на всех разрешениях. При 512×512 модель требовала ~0.69 секунды, но уменьшение входного размера до 256×256 почти вдвое сократило время выполнения (~0.37с). Дальнейшее уменьшение до 128×128 и 64×64 снизило задержку до ~0.19с и ~0.16с соответственно. Время предварительной и последующей обработки оставалось минимальным для всех размеров, что подтверждает, что инференц является основным узким местом производительности.

В отличие от этого, квантованная модель значительно ускорила выполнение. При 512×512 время выполнения снизилось с ~0.69с до ~0.19с (в 3.7 раза быстрее), а при 256×256 оно упало с ~0.37с до ~0.05с (почти в 8 раз быстрее). Даже при наименьшем tested размере, 64×64, квантованная версия сократила задержку до ~0.01с на кадр, приближаясь к производительности в реальном времени. Эти результаты демонстрируют, что SoC Qualcomm QCM6490 в Tachyon значительно выигрывает от квантованных моделей, позволяя эффективно детектировать объекты across разрешениям, подходящим для робототехники, систем наблюдения и других edge AI приложений, где критически важна низкая задержка.

Измерение энергопотребления и распределения тепла

Финальный тест был сосредоточен на измерении энергопотребления и распределения тепла. Энергопотребление платы измерялось с помощью USB-донгла для измерения мощности в трех условиях: состояние простоя, воспроизведение видео YouTube в разрешении 1080p в оконном режиме и запуск полной нагрузки на ЦП с WebGL (10 000 рыб) вместе с видео YouTube в 4K. Во всех случаях показания USB-метра были довольно стабильными и составляли около 5.32 Вт. Значительных скачков мощности не наблюдалось, что может быть связано с тем, что плата в основном потребляет питание от USB-кабеля для зарядки аккумулятора.

CPU usage in idle state.
Использование ЦП в состоянии простоя.
CPU usage while playing a 1080p YouTube video in windowed mode.
Использование ЦП при воспроизведении видео YouTube 1080p в оконном режиме.
CPU usage while playing a 4K YouTube video and running WebGL Aquarium in windowed mode.
Использование ЦП при воспроизведении видео YouTube 4K и запуске WebGL Aquarium в оконном режиме.
Average power consumption of the Particle Tachyon.
Среднее энергопотребление Particle Tachyon.

Для наблюдения за распределением тепла использовалась тепловизорная камера FLIR E4 для захвата изображений, пока плата управлялась удаленно через панель Terminal в Particle Console. Это было дождливое утро в моем родном городе, температура в помещении составляла около 27–28 °C. Первое тепловое изображение было сделано при выполнении команды htop , когда максимальная наблюдаемая температура составила около 39.7 °C. Тепло распределялось довольно равномерно, с самыми горячими точками, сконцентрированными в области процессора. Второе изображение было записано, когда удаленно запускался скрипт sbc-bench в течение нескольких минут. Хотя скрипт завершился ошибкой, он все же потреблял больше мощности ЦП, чем в предыдущем случае, и температура поднялась до приблизительно 57–58 °C. В этом случае область процессора явно намного горячее. Интересно, что температура печатной платы в обоих случаях кажется выше, чем у двух чипов.

Thermal distribution of the Particle Tachyon board in an idle state.
Распределение тепла на плате Particle Tachyon в состоянии простоя.
Thermal image of the Particle Tachyon board under heavy CPU load.
Тепловое изображение платы Particle Tachyon под высокой нагрузкой ЦП.

Выводы

В заключение, общий дизайн платы является удачным, а ее производительность довольно высока. Процесс настройки прост как в режиме настольной ОС, так и в headless-режиме. Однако в ходе этого обзора были encountered некоторые проблемы. Основными ограничениями, обнаруженными в ходе обзора, стали отсутствие исчерпывающей документации и примеров для тестирования ИИ на веб-сайте Particle Tachyon, требование постоянного подключения аккумулятора и отсутствие аудиовыхода в настольной ОС.

Для заинтересованных, Particle Tachyon доступна в официальном магазине за $299 (8 ГБ ОЗУ и 128 ГБ флеш-памяти) или за $249 (4 ГБ ОЗУ и 64 ГБ флеш-памяти).

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments