สวัสดีครับ วันนี้ผมจะมารีวิว Particle Tachyon ซึ่งเป็นคอมพิวเตอร์บอร์ดเดี่ยว (Single-Board Computer: SBC) ขนาดกะทัดรัดที่ออกแบบมาเพื่อรองรับงาน Edge AI, IoT และการเชื่อมต่อความเร็วสูง โดยภายในใช้ Octa-core Qualcomm Kryo CPU, Adreno GPU และ DSP Hexagon นอกจากนี้ยังรองรับการเชื่อมต่อไร้สายครบครัน ไม่ว่าจะเป็น 5G, Wi-Fi 6E และ Bluetooth 5.2
Particle Tachyon ถูกออกแบบให้มีรูปแบบเดียวกับ Raspberry Pi และมาพร้อมกับพอร์ต I/O หลากหลาย เช่น 40-pin GPIO header ที่รองรับ Raspberry Pi HATs รวมถึงตัวเลือกขยายการเชื่อมต่อสำหรับเซนเซอร์และอุปกรณ์เสริมต่าง ๆ อีกทั้งยังมี Qwiic connector สำหรับใช้งานร่วมกับอุปกรณ์ของ SparkFun และ Adafruit และยังมีพอร์ต MIPI-CSI/DSI สำหรับกล้องและจอแสดงผลอีกด้วย หากต้องการรายละเอียดเพิ่มเติมสามารถดูได้จาก datasheet ของ Particle Tachyon
เปิดกล่อง
พัสดุถูกส่งมาจากฮ่องกงและมาพร้อมกับอุปกรณ์ตามภาพด้านล่างครับ โดยภายในกล่องประกอบด้วย บอร์ด Particle Tachyon, บอร์ดเสริมสำหรับการใช้งานไมโครโฟน, แบตเตอรี่ Li-Po แบบเซลล์เดียว 3.7V พร้อมคอนเน็กเตอร์ JST-PH แบบ 3 พิน และการ์ดต้อนรับขนาดเล็ก

รูปต่อไปนี้เป็นการเปรียบเทียบระหว่างบอร์ด Particle Tachyon, BeagleY-AI, Raspberry Pi 5 และ Raspberry Pi 4 Model B

ติดตั้งระบบปฏิบัติการ
ในการตั้งค่าอุปกรณ์ ผมทำตามขั้นตอนจากหน้า Setting up your Tachyon ของผู้ผลิต เริ่มแรกผมเชื่อมต่อแบตเตอรี่เข้ากับ JST connector บนบอร์ด จากนั้นเสียบสาย USB Type-C เพื่อต่อบอร์ดเข้ากับแล็ปท็อป ซึ่งไฟ LED สีแดงบนอร์ดติดขึ้นทันที แสดงว่าบอร์ดได้รับพลังงานเรียบร้อยแล้ว หลังจากนั้นผมติดตั้งโปรแกรม Particle CLI ลงบนแล็ปท็อป และอัปเดตด้วยคำสั่ง particle update-cli
เมื่อตรวจสอบด้วยคำสั่ง particle --version
ซึ่งโปรแกรมแสดงข้อมูลเวอร์ชัน 3.38.1 ก็ยืนยันว่าการติดตั้งเสร็จสมบูรณ์ ขั้นตอนถัดไปคือการเข้าสู่โหมด Programming โดยกดปุ่มหลักค้างไว้ประมาณ 3 วินาทีจนกระทั่งไฟ LED เปลี่ยนเป็นกระพริบสีเหลือง จากนั้นผมจึงติดตั้ง USB driver โดยใช้เครื่องมือ Zadig ตามที่ผู้ผลิตแนะนำ
ผมเริ่มใช้งานด้วยการลองติดตั้งแบบ Desktop โดยใช้คำสั่ง particle tachyon setup
และทำตามขั้นตอนที่ระบบแนะนำ เมื่อถึงขั้นตอนเลือกซอฟต์แวร์ ผมเลือก Desktop variant ซึ่งมาพร้อมกับสภาพแวดล้อมแบบ GUI เต็มรูปแบบ โดยตามเอกสารอย่างเป็นทางการของผู้ผลิตนั้นตัวบอร์ดรองรับระบบปฏิบัติการทั้ง Ubuntu 20.04 (legacy support) และ Ubuntu 24.04 (current development) แต่ในช่วงเวลาที่ผมรีวิวนี้ ตัวโปรแกรมติดตั้งได้ติดตั้งระบบปฏิบัติการ Ubuntu 20.04 ให้ โดยการดาวน์โหลดและติดตั้งระบบปฏิบัติการทั้งหมดเสร็จสิ้นอย่างราบรื่นภายในเวลาไม่ถึง 20 นาที
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 |
=================================================================================== 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 ก็พบว่ามี Device ID แสดงอยู่ในหน้า Devices ได้อย่างถูกต้อง แต่กระบวนการ handshake ระหว่างอุปกรณ์กับเครื่องบริการไม่เคยเสร็จสมบูรณ์



จากการค้นหา ผมพบคำแนะนำของชุมชนที่แนะนำให้ลองติดตั้งแบบ Headless แทนการใช้ Desktop GUI ดังนั้นผมจึงลองติดตั้งในโหมดนี้ดู โดยการติดตั้งก็ดำเนินไปอย่างราบรื่นเช่นกัน โดยเมื่อติดตั้งเรียบร้อยไฟ LED หลักเปลี่ยนจากกระพริบสีเขียวไปเป็นสี magenta ซึ่งหมายความว่าการเชื่อมต่อ Wi-Fi สำเร็จ แต่อย่างไรก็ตามไฟ LED ไม่เคยเปลี่ยนเป็นสี cyan ที่ควรจะแสดงถึงการเชื่อมต่อเครือข่ายเซลลูลาร์ แต่ถึงอย่างนั้นครั้งนี้ตัวบอร์ด Particle Tachyon ก็สามารถทำ handshake ติดต่อกับ Particle Console ได้สำเร็จ

ถัดมาผมได้ลองทดสอบการใช้งานด้วยการส่งคำสั่งระยะไกลผ่าน Command-line ของ Particle Console เช่น การรัน htop
จาก Terminal panel ซึ่งทำงานได้โดยไม่มีปัญหา จากนั้นผมได้ทำการทดสอบเพิ่มเติมผ่าน Particle Console เพื่อตรวจสอบสถานะอื่น ๆ ของอุปกรณ์ ดังที่แสดงในภาพด้านล่างนี้




ตรวจสอบข้อมูลของ Particle Tachyon ด้วย inxi
การทดสอบinxi
กับบอร์ด Particle Tachyon แสดงให้เห็นว่ามีระบบปฏิบัติการเป็น Ubuntu 20.04.6 LTS (Focal Fossa) พร้อม kernel 5.4.219 บน Qualcomm SoC แบบ ARM โดย CPU ถูกระบุว่าเป็น 8-core Kryo cluster ที่มีความถี่ระหว่าง 300 MHz ถึง 2.7 GHz ตรงกับแพลตฟอร์ม Qualcomm QCM6490/QCS6490 ที่ระบุไว้ในสเปกของ Particle Tachyon สำหรับการแสดงผลกราฟิกส์นั้นใช้ไดรเวอร์ msm-dai-q6-hdmi บนความละเอียด 1920×1080@60Hz แต่การเรนเดอร์ยังคงใช้ llvmpipe (LLVM 12, Mesa 21.2.6) แทนที่จะใช้การเร่งความเร็วโดยตรงจาก Adreno GPU การตรวจสอบแบตเตอรี่ทำงานได้ตามปกติ และค่าความร้อนก็เสถียรโดยมีอุณหภูมิของ CPU อยู่ที่ประมาณ 28 °C
ในด้านการเชื่อมต่อพบ Qualcomm CNSS PCI Wi-Fi interface ที่ใช้งานอยู่ในชื่อ wlan0 พร้อมด้วยอินเทอร์เฟซเสมือนและเซลลูลาร์ร่วมอยู่ด้วย ส่วนพื้นที่จัดเก็บข้อมูลเป็นแบบ eMMC ขนาด 116 GB รุ่น KM8L9001JM-B624 และหน่วยความจำที่ใช้งานจริงอยู่ที่ 3.96 GB จากทั้งหมด 7.1 GB RAM โดยรวมแล้วการทดสอบด้วย inxi พบว่าฮาร์ดแวร์ที่รายงานตรงกับสเปกทางการของ Particle Tachyon เพียงแต่ในตอนนี้การประมวลผลกราฟิกยังใช้การเรนเดอร์ด้วยซอฟต์แวร์แทนที่จะเปิดใช้งาน Adreno GPU
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
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
ผมพบว่าสคริปต์ทำงานได้ แต่การทดสอบในภาพรวมนั้นล้มเหลว เนื่องจากสคริปต์ส่งข้อความ error ว่า failed to set pid xxxx’s affinity: Invalid argument ตามที่แสดงใน log ด้านล่าง อย่างไรก็ตามผมยังสามารถรันคำสั่ง sbc-bench -m
เพื่อดูข้อมูลการทำงานของ CPU และข้อมูลระบบพื้นฐานได้ตามปกติ ดังที่เห็นใน log ด้านล่าง เราได้โพสต์ปัญหาไว้บน GitHub แต่ไม่สามารถหาทางแก้ไขได้ทันเวลา และเนื่องจากผมไม่มีเวลาวิเคราะห์สาเหตุของ error และต้องการไปทดสอบฟีเจอร์อื่น ๆ ของ Particle Tachyon ผมจึงหยุดการทดสอบ sbc-bench
ไว้เพียงเท่านี้
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 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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
ทั้งบน Wi-Fi 2.4 GHz และ 5 GHz โดยผมเชื่อมต่อบอร์ดกับเราเตอร์ที่บ้าน ผลการทดสอบทั้งหมดนี้ทำขึ้นโดยไม่ได้มีการปรับแต่งใด ๆ รวมทั้งอาจจะมีอุปกรณ์อื่น เช่น ทีวี, โทรศัพท์มือถือ หรืออุปกรณ์อื่น ๆ เชื่อมต่อใช้งาน Wi-Fi พร้อมกันอยู่ด้วย และระยะห่างระหว่างบอร์ด Particle Tachyon กับเราเตอร์นั้นอยู่ที่ประมาณ 6–7 เมตร
สำหรับการตั้งค่าการทดสอบ ผมใช้โน้ตบุ๊กที่ติดตั้งระบบปฏิบัติการ Windows 11 รันเป็นโหมดเซิร์ฟเวอร์ด้วยคำสั่ง iperf -s
และผลการทดสอบด้วย iperf3
ระหว่าง Particle Tachyon กับเครื่องโฮสต์ก็แสดงให้เห็นความแตกต่างของประสิทธิภาพระหว่าง Wi-Fi 2.4 GHz และ 5 GHz อย่างชัดเจน ดังแสดงด้านล่างนี้
ทดสอบการรับส่งข้อมูลผ่านเครือข่าย WiFi 2.4 GHz
ส่งข้อมูล
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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. |
รับข้อมูล
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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. |
สองทิศทาง
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 |
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 GHz ความเร็วเฉลี่ยในโหมดส่งข้อมูลอยู่ที่ประมาณ 13.4 Mbit/s ส่วนโหมดรับข้อมูลทำได้สูงกว่าเล็กน้อยที่ประมาณ 23.5 Mbit/s แต่เมื่อทดสอบในโหมดสองทางประสิทธิภาพลดลง โดยได้ค่าเฉลี่ย 8.2 Mbit/s สำหรับการส่งข้อมูล และ 10.8 Mbit/s สำหรับการรับข้อมูล
ทดสอบการรับส่งข้อมูลผ่านเครือข่าย WiFi 5 GHz
ส่งข้อมูล
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
รับข้อมูล
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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. |
สองทิศทาง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 GHz พบว่าประสิทธิภาพเพิ่มขึ้นอย่างชัดเจน โดยในโหมดส่งข้อมูลนั้น Particle Tachyon ทำความเร็วได้ค่อนข้างคงที่ที่ประมาณ 102.0 Mbit/s ส่วนโหมดรับข้อมูลจะอยู่ที่ประมาณ 87.3 Mbit/s สำหรับโหมดสองทางพบว่าผลลัพธ์ออกมาค่อนข้างดี โดยได้ค่าเฉลี่ย 41.4 Mbit/s สำหรับการส่งข้อมูล และประมาณ 49.4 Mbit/s สำหรับการรับข้อมูล
โดยรวมแล้วประสิทธิภาพการเชื่อมต่อไร้สายของ Particle Tachyon บนย่านความถี่ 5 GHz ถือว่าดี แม้ว่าใน log จะพบความไม่เสถียรเล็กน้อย เช่น การสูญเสียแพ็กเก็ตหรือการส่งซ้ำเป็นครั้งคราว ซึ่งอาจเกิดได้จากปัญหาของเครื่องคอมพิวเตอร์ที่ใช้ทดสอบ, สัญญาณรบกวน, หรือแม้แต่ตัวเราเตอร์เอง นอกจากนี้การทดสอบครั้งนี้ผมรัน iperf3 บนเครื่อง Windows 11 ซึ่งอาจไม่ให้ประสิทธิภาพการทดสอบเครือข่ายสูงเท่ากับการใช้ระบบ Linux
ทดสอบประสิทธิภาพระบบไฟล์ด้วย iozone
สำหรับผลการทดสอบ iozone
benchmark บนบอร์ด Particle Tachyon นั้นแสดงให้เห็นถึงประสิทธิภาพ I/O ที่ค่อนข้างดี โดยผมกำหนดใช้ไฟล์ทดสอบขนาด 512 MB และขนาดบันทึกที่ 1024 KB และ 16384 KB ผลลัพธ์ได้ความเร็วการเขียนแบบ Sequential write อยู่ในช่วงระหว่าง 516 – 548 MB/s ส่วนการเขียนซ้ำ (rewrite) ทำได้ใกล้เคียงกันที่ประมาณ 513 – 523 MB/s ในขณะที่การอ่านทำได้เร็วกว่ามาก โดยอยู่ที่ราว 793 MB/s สำหรับข้อมูลขนาด 1 MB และสูงสุดประมาณ 950 MB/s เมื่อใช้ข้อมูลขนาด 16 MB ในกรณีของการอ่านแบบสุ่มนั้นก็ทำได้ดีเช่นกัน โดยวัดได้ประมาณ 709 MB/s ที่ข้อมูลขนาด 1 MB และได้ความเร็วประมาณ 933 MB/s กับข้อมูลขนาด 16 MB ส่วนด้านการเขียนแบบสุ่มนั้นยังคงทำได้สม่ำเสมออยู่ที่ประมาณ 517 – 520 MB/s
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 |
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 Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins Al Slater, Scott Rhine, Mike Wisner, Ken Goss Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR, Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner, Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy, Dave Boone, Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root, Fabrice Bacchella, Zhenghua Xue, Qin Li, Darren Sawyer, Vangel Bojaxhi, Ben England, Vikentsi Lapa, Alexey Skidanov, Sudhir Kumar. Run began: Sun Aug 31 08:23:18 2025 Include fsync in write timing O_DIRECT feature enabled Auto Mode File size set to 524288 kB Record Size 1024 kB Record Size 16384 kB Command line used: iozone -e -I -a -s 512M -r 1024k -r 16384k -i 0 -i 1 -i 2 Output is in kBytes/sec Time Resolution = 0.000001 seconds. Processor cache size set to 1024 kBytes. Processor cache line size set to 32 bytes. File stride size set to 17 * record size. 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 ถูกปรับแต่งดี ประสิทธิภาพเพิ่มขึ้นอย่างชัดเจนเมื่อใช้ block ข้อมูลขนาดใหญ่ โดยเฉพาะในการอ่านที่ทำได้โดดเด่น มีความเร็วการเขียนที่ค่อนข้างคงที่และความเร็วการอ่านแบบลำดับที่สูง สะท้อนให้เห็นว่าหน่วยเก็บข้อมูลบนบอร์ดและคอนโทรลเลอร์ถูกปรับจูนมาเพื่อรองรับงานที่ต้องการสมดุลระหว่างความเร็วและความเสถียร
ทดสอบเว็บเบราเซอร์ด้วย Speedometer 3.1
ผมได้ทดสอบ Speedometer 3.1 ทั้งบนเว็บเบราว์เซอร์ Chromium ที่ติดตั้งมาพร้อมกับระบบปฏิบัติการ และทดสอบบน Firefox ที่ผมติดตั้งเพิ่มใหม่ โดยผลการทดสอบเฉลี่ยของ Firefox ทำได้ 4.80 ซึ่งสูงกว่า Chromium ที่ได้ 3.45 โดยการวิเคราะห์ด้านล่างนี้เป็นการเปรียบเทียบจาก log ของทั้งสองเบราว์เซอร์
นี่คือผลการทดสอบบางส่วนจาก Chromium
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 |
{ ... "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
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 |
{ ... "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 นั้นพบว่าเฟรมเวิร์กอย่าง Vue, Svelte และ Backbone สามารถประมวลผลงานได้ในช่วงความเร็วประมาณ 100–200 ms แสดงให้เห็นว่าการจัดการงานแบบประสานเวลา (synchronous) ทำได้ลื่นไหล และงานแบบไม่ประสานเวลา (asynchronous) ก็มีการหน่วงเวลาปานกลาง ส่วนเฟรมเวิร์กที่หนักกว่าอย่าง React และ Angular ใช้เวลาประมาณ 200 ms ขณะที่ jQuery และ ES5 baseline ทำงานได้ช้าที่สุด โดยหลายครั้งเกิน 300 ms และบางกรณีอาจนานกว่า 1 วินาที
ในฝั่งของ Firefox นั้นพบว่าประสิทธิภาพดีกว่าแทบทุกเฟรมเวิร์ก โดย Vue และ Svelte ตอบสนองได้เร็วที่สุด สามารถทำงานเพิ่ม/ลบข้อมูลได้เร็วกว่าบน Chromium ส่วน React และ Angular นั้นก็แสดงผลลัพธ์ที่ดีขึ้น โดยมีการหน่วงเวลาน้อยกว่าที่พบใน Chromium และแม้แต่ jQuery ที่ทำงานได้ช้าก็มีอาการหน่วงลดลงเมื่อเทียบกับผลทดสอบบน Chromium
ทดสอบประสิทธิภาพการเล่นวิดีโอ YouTube
ผมได้ทดสอบการเล่นวิดีโอ YouTube บน Particle Tachyon โดยใช้คลิป Norway 4K ในหลายความละเอียดตั้งแต่ 240p จนถึง 2160p โดยเปิดแบบ เต็มจอ (fullscreen) บนเดสก์ท็อปที่ตั้งค่าความละเอียดไว้ที่ 1080p ซึ่งหมายความว่าวิดีโอที่ความละเอียดที่สูงกว่า 1080p จะถูกย่อ (downscale) ให้พอดีกับหน้าจอ
ในการทดสอบที่ความละเอียดต่ำอย่าง 240p, 360p และ 480p นั้นพบว่าบอร์ดสามารถเล่นวิดีโอได้อย่างไม่มีปัญหา การแสดงผลลื่นไหล มีเฟรมดรอปเพียงเล็กน้อย และ buffer health ค่อนข้างคงที่ตลอดการทดสอบ แสดงให้เห็นว่าการสตรีมวิดีโอแบบเบา ๆ สามารถทำงานได้อย่างเสถียรดี







เมื่อปรับความละเอียดขึ้นมาเป็น 720p และ 1080p พบว่าการเล่นวิดีโอยังคงทำงานได้ดี แต่ผมก็เริ่มสังเกตเห็นอาการสะดุดหรือเฟรมดรอปให้เห็นบ้างเป็นบางครั้ง โดยเฉพาะที่ความละเอียดแบบ Full HD ซึ่งดูเหมือนว่าชิปเซ็ตต้องทำงานหนักขึ้น และพอขยับความละเอียดไปที่ 1440p และ 2160p (4K) ก็สังเกตุเห็นข้อจำกัดของบอร์ดได้ชัดเจนมากขึ้น โดยวิดีโอสามารถเล่นได้แต่มีอาการเฟรมดรอปถี่ขึ้น และพบว่าสถานะของ buffer health เริ่มขึ้นลงตามความเร็วการเชื่อมต่อที่พยายามปรับตัวให้ทันกับความต้องการบิตเรตที่สูงกว่า

ทดสอบการเรนเดอร์สามมิติด้วย WebGL บนเว็บเบราเซอร์
การทดสอบถัดมาของผมคือการเรนเดอร์สามมิติบนเบราว์เซอร์ โดยผมใช้การรัน WebGL Aquarium บน Chromium โดยผมพบว่าเมื่อมีกำหนดให้มีปลาบนหน้าจอเพียงตัวเดียวนั้นวัดค่า FPS ได้เฉลี่ยอยู่ที่ประมาณ 5 fps และเมื่อเพิ่มจำนวนปลาเป็น 100–500 ตัวนั้นประสิทธิภาพยังคงอยู่ที่ราว ๆ 4 fps ต่อมาเมื่อเพิ่มจำนวนปลาเป็น 1000–5000 ตัวพบว่าอัตราการแสดงผลลดลงเหลือเพียง 3–4 fps ส่วนที่โหลดหนักจริง ๆ อย่างการกำหนดจำนวนปลา 10,000–25,000 ตัวทำให้เฟรมเรตตกลงไปอยู่ระหว่าง 2 fps ถึง 1 fps
โดยรวมแล้วอาจจะกล่าวได้ว่าประสิทธิภาพการเรนเดอร์สามมิติบน Chromium ถือว่าค่อนข้างต่ำ ซึ่งสาเหตุหลักน่าจะมาจากการตั้งค่าเริ่มต้นของระบบปฏิบัติการที่ผู้ผลิตเตรียมให้ที่ยังไม่ได้ถูกปรับแต่งให้รองรับการเร่งการทำงานผ่าน GPU ได้อย่างเต็มประสิทธิภาพ แต่อย่างไรก็ตามผมพบว่าการประมวลผลไม่ได้กดดัน CPU มากนัก ผมยังใช้งานแอปพลิเคชัน GUI อื่น ๆ ได้ดี และไม่เกิดอาการหน่วงมากเหมือนที่ผมเคยเจอบน SBC รุ่นอื่น ๆ ที่เคยทดสอบมาก่อน
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
ทดสอบการเรนเดอร์สามมิติด้วย glmark2
ต่อมาผมได้ทดสอบการเรนเดอร์กราฟิกสามมิติด้วย glmark2
ซึ่งให้ผลคะแนนรวมอยู่ที่ 62 โดยข้อมูลจากใน log แสดงให้เห็นว่าระบบทำงานบน Mesa llvmpipe (LLVM 12.0.0) แทนที่จะใช้ Adreno GPU สำหรับการทดสอบการแสดงที่ง่ายอย่างเช่น texture filtering และ basic effects นั้นทำอัตราการแสดงผลได้สูงเกิน 100 fps แต่เมื่องานเรนเดอร์ที่ซับซ้อนขึ้นอย่าง shading และ lighting นั้นมีอัตราการแสดงผลลดลงมาอยู่ในช่วง 40–50 fps ส่วนงานเรนเดอร์สามมิติที่หนักมากอย่างเช่น terrain rendering และ refraction นั้นแสดงข้อจำกัดอย่างชัดเจนโดยมีอัตราการแสดงผลเหลือเพียง 4 fps และ 10 fps ตามลำดับ
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 |
======================================================= 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
มารอใช้งาน จากนั้นผมได้สร้าง virtual environment ด้วย 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 อื่น ๆ ดังรายการทดสอบต่อไปนี้
ทดสอบทั่วไป
เบื้องต้นผมพบว่ามีโมเดล AI หลายตัวให้เลือกใช้ เช่น MobileNet, FFNet และ YOLO โดยโมเดลเหล่านี้มีให้เลือกนำไปใช้งานได้ที่ https://github.com/quic/ai-hub-models และสำหรับการทดสอบครั้งแรกนี้ผมได้ทำตามตัวอย่าง real-time selfie segmentation จากหน้า Getting Started ของ Qualcomm AI Hub โดยผมได้ติดตั้งโมเดลด้วยคำสั่ง pip3 install "qai-hub-models[ffnet_40s]"
จากนั้นรันสคริปต์ตัวอย่างด้วยคำสั่ง python -m qai_hub_models.models.ffnet_40s.demo
และภาพด้านล่างนี้คือผลลัพธ์ของการ Segmentation ครับ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
(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 |

ผมยังได้ลองทดสอบการรันโมเดลการตรวจหาวัตถุ YOLO โดยผมได้ติดตั้ง YOLOv7 ด้วยคำสั่ง pip install "qai_hub_models[yolov7]"
หลังจากนั้นผมจึงรันสคริปต์ตัวอย่างโดยใช้ภาพที่ผมดาวน์โหลดมาเตรียมไว้ในเครื่อง โดยผมระบุพาธของภาพนี้ด้วยออปชัน --image ../particle_test_logs/data/CrossWalk_640.jpg
และมีผลลัพธ์การทำงานตามภาพด้านล่างนี้
![]() |
![]() |
![]() |
![]() |
ถัดมาผมได้ทดสอบการทำงานของ AI inferencing ใน Python โดยใช้สคริปต์ตัวอย่างจาก Qualcomm AI Hub ซึ่งการทำงานเป็นไปอย่างราบรื่นไม่มีปัญหาเช่นเดียวกัน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 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() |
ทดสอบการตรวจหาวัตถุ (object detection) กับ USB camera
ในหน้าเว็บอย่างเป็นทางการของ Particle Tachyon นั้นมีการระบุว่าบอร์ดนี้รองรับการเชื่อมต่อกล้องได้สองตัวผ่านพอร์ต CSI1 และ DSI/CSI2 ตามที่แสดงในภาพด้านล่างนี้ ซึ่งในทางทฤษฎีควรจะทำให้เราสามารถใช้งานกล้องสองตัวพร้อมกันได้ อย่างไรก็ตามเมื่อผมลองทดสอบกับ Raspberry Pi Camera Module 3 และ Raspberry Pi AI Camera ที่ใช้พอร์ตแบบ CSI นั้นกลับไม่สามารถทำงานได้ บอร์ดตรวจไม่พบกล้อง หลังจากค้นหาข้อมูลผมพบว่าสาเหตุคือ ณ ขณะที่ผมกำลังรีวิวนี้กล้องของ Raspberry Pi ยังไม่สามารถใช้งานได้บน Particle Tachyon เนื่องจากพึ่งพาเฟิร์มแวร์แบบปิด(closed-source firmware stack) ดังนั้นการทดสอบต่อไปนี้ผมจึงใช้กล้อง USB webcam แทนครับ

สำหรับการเตรียมการทดสอบประสิทธิภาพแบบเวลาจริงนี้ ผมได้ใช้ USB webcam และจับภาพด้วยคลังโปรแกรม OpenCV ที่ผมกำหนดความละเอียดเป็น 640×480 พิกเซล จากนั้นผมติดตั้งโมเดลตรวจจับวัตถุ YOLOv8 ด้วยคำสั่ง pip install "qai-hub-models[yolov8-det]"
ตามคำแนะนำจาก qai-hub-models repository
ในขั้นตอนการเตรียมโมเดลเพื่อนำมาใช้งานนั้น ผมทำการ export โมเดลแบบ quantized ด้วยสคริปต์ที่มีมาให้ แต่จากผมตรวจสอบรายชื่ออุปกรณ์ที่รองรับนั้นผมไม่พบ QCM6490 ในรายการ ดังนั้นผมจึงเลือกใช้ QCS6490 แทน เนื่องจากมีฮาร์ดแวร์แทบจะเหมือนกัน จากนั้นผมจึง export โมเดลผ่าน Qualcomm AI Hub โดยใช้สคริปต์ qai_hub_models.models.yolov8_det.export
โดยตั้งค่าให้รันโมเดลบน Qualcomm QCS6490 proxy chipset รวมถึงตั้งค่าให้ใช้ TensorFlow Lite (TFLite) runtime ในการทำงานที่ความละเอียดเอาต์พุต 512×512 พิกเซล และผมไม่ได้ระบุพารามิเตอร์สำหรับ quantization เพิ่มเติมเพื่อให้ระบบใช้ค่า default หลังจากนั้นระบบจาก export และสร้างโมเดลที่พร้อมให้เรานำไปใช้ทดสอบต่อไป
ผมสร้าง virtual environment ด้วย Python 3.9 และติดตั้ง TFLite runtime ร่วมกับ NumPy 1.x เพื่อให้ทำงานเข้ากันได้ โดยภายในสภาพแวดล้อมเสริมนี้ ผมทดสอบโมเดล YOLOv8n กับภาพอินพุตจัตุรัสหลายขนาด ประกอบด้วย 512, 256, 128 และ 64 พิกเซล โดยมีจุดประสงค์เพื่อเปรียบเทียบประสิทธิภาพการทำงานระหว่างโมเดลที่ unquantized และ quantized
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
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() |


การทดสอบประสิทธิภาพ YOLOv8n บน Particle Tachyon ที่แสดงในภาพข้างบนนี้แสดงให้เห็นความสัมพันธ์ที่ชัดเจนระหว่างความละเอียดอินพุตและ เวลาในการประมวลผล โดยในกรณีของโมเดลแบบ unquantized นั้นพบว่าขั้นตอน inference ใช้เวลามากที่สุดในทุกความละเอียด ซึ่งโมเดลใช้เวลาประมวลผลภาพที่ความละเอียด 512×512 พิกเซลประมาณ 0.69 วินาที แต่เมื่อปรับลดขนาดอินพุตเป็น 256×256 พิกเซลนั้นรันไทม์เกือบลดลงครึ่งหนึ่งเหลือประมาณ 0.37 วินาที และเมื่อปรับลดขนาดภาพลงไปที่ 128×128 และ 64×64 พิกเซลนั้นใช้เวลาประมวลผลลดลงเหลือเพียงประมาณ 0.19 วินาที และ 0.16 วินาที ตามลำดับ จากการสังเกตุในภาพจะพบว่าเวลาที่ใช้ในขั้นตอน preprocessing และ postprocessing นั้นน้อยมากในภาพทุกขนาด ซึ่งค่อนข้างสอดล้องและยืนยันได้ว่าขั้นตอนการ inference น่าจะคือคอขวดหลักของประสิทธิภาพ
ในทางตรงกันข้ามโมเดลที่ผ่านการ quantized นั้นสามารถเร่งความเร็วได้ดี ที่ความละเอียดภาพขนาด 512×512 นั้นใช้เวลาทำงานลดลงจากประมาณ 0.69 วินาที เหลือเพียงประมาณ 0.19 วินาที หรือเร็วขึ้นประมาณ 3.7 เท่า ขณะที่ความละเอียดภาพขนาด 256×256 นั้นใช้เวลาลดลงจากประมาณ 0.37 วินาที เหลือเพียงประมาณ 0.05 วินาที ซึ่งทำงานได้เร็วขึ้นเกือบ 8 เท่า แม้แต่ที่ภาพดอินพุตเล็กสุดขนาด 64×64 พิกเซลนั้น โมเดลเวอร์ชัน quantized ก็ลดเวลาทำงานได้ดีเหลือเพียงประมาณ 0.01 วินาทีต่อเฟรมเท่านั้น ซึ่งใกล้เคียงกับการประมวลผลแบบเวลาจริงได้ดี ผลลัพธ์เหล่านี้แสดงให้เห็นว่า Qualcomm QCM6490 SoC ของ Particle Tachyon ได้ประโยชน์อย่างมากจากการใช้โมเดลแบบ quantized ทำให้สามารถประมวลผลการตรวจจับวัตถุได้อย่างมีประสิทธิภาพในหลายระดับความละเอียด เหมาะกับงานด้าน หุ่นยนต์, ระบบเฝ้าระวัง และแอปพลิเคชัน Edge AI อื่น ๆ ที่ต้องการค่าดีเลย์ต่ำเป็นสำคัญ
วัดการใช้พลังงานและการกระจายความร้อน
การทดสอบสุดท้ายของผมมุ่งไปที่การวัดการใช้พลังงานและการกระจายความร้อน โดยผมใช้ USB power metering dongle ในการตรวจสอบการใช้พลังงานของบอร์ดภายใต้ 3 สถานการณ์ ได้แก่ โหมด Idle, การเล่นวิดีโอ YouTube 1080p แบบหน้าต่างย่อ และการทำงานที่โหลดสูงสุดด้วยการรัน WebGL (10,000 fishes) ควบคู่ไปพร้อมกับการเล่นวิดีโอ YouTube 4K ในโหมดหน้าต่าง ผลการวัดการใช้พลังงานทั้งหมดออกมาค่อนข้างคงที่ อยู่ที่ประมาณ 5.32 W ในทุกกรณี ผมไม่พบการกระชากของพลังงานที่มีนัยสำคัญ ซึ่งอาจเป็นเพราะบอร์ดดึงพลังงานหลักจากสาย USB เพื่อชาร์จแบตเตอรี่ไปด้วยก็เป็นได้




เพื่อสังเกตการกระจายความร้อน ผมได้ใช้กล้องความร้อน FLIR E4 ในการถ่ายภาพความร้อนของบอร์ด ผมทดสอบควบคุมบอร์ดจากระยะไกลผ่าน เครื่องมือ Termial ของ Particle Console โดยผมทดสอบตอนเช้าที่ฝนตก อุณหภูมิห้องอยู่ที่ประมาณ 27–28 °C ภาพความร้อนภาพแรกด้านล่างนี้ผมถ่ายในขณะที่รันคำสั่ง htop โดยในภาพพบอุณหภูมิสูงสุดที่บันทึกได้อยู่ที่ราว 39.7 °C และความร้อนกระจายค่อนข้างสม่ำเสมอ โดยจุดที่ร้อนที่สุดอยู่รอบ ๆ บริเวณโปรเซสเซอร์หลัก สำหรับภาพความร้อนที่สองนั้นผมถ่ายในขณะที่รันสคริปต์ sbc-bench
ไประยะเวลาหนึ่ง ซึ่งแม้ว่าสคริปต์นี้จะรันไม่สำเร็จ แต่รวม ๆ ก็ยังคงใช้พลังงาน CPU มากกว่ากรณีแรก จึงส่งผลให้อุณหภูมิสูงขึ้นเป็นประมาณ 57–58 °C ซึ่งโดยรวมแล้วบอร์ดร้อนขึ้นกว่ากรณีแรกมาก และที่น่าสนใจคือทั้งสองกรณีนั้นอุณหภูมิของ PCB โดยรวมกลับสูงกว่าชิปหลักทั้งสองตัว


สรุป
โดยสรุปแล้ว ส่วนตัวผมค่อนข้างชอบการออกแบบโดยรวมของบอร์ด Particle Tachyon และประสิทธิภาพของบอร์ดก็ถือว่าทำได้ดีทีเดียว ขั้นตอนการติดตั้งก็ทำได้ง่าย ไม่ว่าจะเป็นโหมด Desktop OS หรือ Headless อย่างไรก็ตามระหว่างการรีวิวก็พบข้อจำกัดอยู่บ้าง เช่น เอกสารและตัวอย่างสำหรับการทดสอบ AI บนเว็บไซต์ Particle Tachyon ที่ยังไม่ครบถ้วน, การที่เราจะต้องเชื่อมต่อแบตเตอรี่อยู่ตลอดเวลา และ ณ ขณะที่รีวิวนี้ก็ยังไม่มีเอาต์พุตเสียงจาก Desktop OS ครับ
สำหรับผู้ที่สนใจ ตอนนี้ Particle Tachyon วางจำหน่ายในร้านค้าอย่างเป็นทางการ ที่ราคา $299 (~9,600฿) สำหรับรุ่น 8GB RAM / 128GB Flash และ $249 (~8,000฿) สำหรับรุ่น 4GB RAM / 64GB Flash

I am an assistant professor in surveying engineering and geographic information systems at Rambhai Barni Rajabhat University. My primary research areas include digital image/audio processing, digital photogrammetry, AI, IoT, and UAV. I am open to other subjects as well.