人工智能AI合集:1、嵌入式LinuxAI开发套件OrangePI AIPRO初体验

前言

  随着人工智能技术的飞速发展,AI已经不再是遥不可及的高科技概念,而是逐渐融入到我们的日常生活中。从智能手机的语音助手到家庭中的智能音箱,再到工业自动化和医疗诊断,AI的应用无处不在。然而,要想真正掌握并应用这些技术,不仅需要理论知识,更需要实践操作。这正是嵌入式AI学习的核心所在。

  嵌入式系统,作为现代电子设备的核心,其与AI技术的结合,为智能设备的开发提供了无限可能。从简单的自动化任务到复杂的图像和语音识别,嵌入式AI开发板成为了学习这些技术的理想平台。它们不仅易于操作,而且功能强大,能够满足从初学者到专业人士的各种需求。

  对于大多数人来说,日常生活中的无时无刻都能接触的到AI应用。比如平时最常见的停车场的车牌识别、上班打卡机的人脸识别、能自由对话的语音助手等等。它们都有一个共同的特点,就是体积小巧且功能强大。这些应用的落地都离不开嵌入式AI。

  本人也在近期意外获得一块高性能的AI开发板OrangePI AIPRO。计划以此为媒介,学习一下AI相关的技术栈。本篇文章主要介绍一下这款开发平台,并不会涉及到多么高深的技术,主要是我也不会,本人还没学过AI呢。本质上也是一个门外汉,所以各位也不要有太大的期望。

开箱

  开发套件包含以下物品:充电器一个,双头type-c数据线一根,主板一块。

  主板下方携带一块大大的扇热模块,想必还散热不错。主板上方是一个无线模块支持WIFI5和蓝牙4.2,蓝牙和WiFi天线通过天线座连接到一个天线贴纸上,不过就我本人而言,我不是很喜欢这种天线,不仅很容易丢还有点碍事,板载天线我认为会更好一些。

输入图片说明

  开发套件提供的电源,最大支持20V*3.25A的输出,峰值功率可达65W。

输入图片说明

  开发套件携带一张32GB的闪迪高速存储卡,这一点商家考虑的很细心,省的我还去买。不过这个SD卡座有点不太友好,拿到的那一刻下意识的按了一下,差点给按坏。为啥不做成,按一下进去在按一下出来的呢。

输入图片说明

开发板简介

  Orange Pi AI Pro 是一款由深圳市迅龙软件有限公司联合华为推出的高性能 AI 开发板。这款开发板搭载了昇腾 AI 处理器,具备强大的计算能力,特别适合用于教育、机器人、无人机等场景。硬件规格如下:

  • 昇腾 AI 处理器:集成了 4 核 64 位 Arm 处理器和 AI 处理器。
  • AI 算力
    • 半精度(FP16):4 TFLOPS
    • 整数精度(INT8):8 TOPS
  • 内存:提供 8GB 和 16GB 两种版本,类型为 LPDDR4X。
  • 存储
    • 板载 32MB SPI Flash。
    • 支持 Micro SD 卡插槽。
    • 支持 eMMC 插座,可外接 eMMC 模块。
    • 支持 M.2 M-Key 接口,可接 2280 规格的 NVMe SSD 或 SATA SSD。
  • 以太网:支持 10/100/1000Mbps,板载 PHY 芯片为 RTL8211F。
  • Wi-Fi+蓝牙:支持 2.4G 和 5G 双频 Wi-Fi,蓝牙版本为 BT4.2,模组为欧智通 6221BUUC。
  • USB:2 个 USB3.0 Host 接口,1 个 Type-C 接口(仅支持 USB3.0)。
  • 摄像头:2 个 MIPI CSI 2 Lane 接口。
  • 显示:2 个 HDMI 接口,1 个 MIPI DSI 接口。
  • 音频:1 个 3.5mm 耳机孔,支持音频输入输出,2 个 HDMI 音频输出。
  • 40 pin 扩展口:用于扩展 UART、I2C、SPI、PWM 和 GPIO 等接口。
  • 按键:1 个复位键,1 个关机键,1 个升级按键。
  • 拨码开关:2 个拨码开关,用于控制 SD 卡、eMMC 和 SSD 启动选项。
  • 电源:支持 Type-C 供电,适配器规格为 20V PD-65W。
  • LED 灯:1 个电源指示灯和 1 个软件可控指示灯。
  • 风扇接口:4pin,0.8mm 间距,支持 PWM 控制。
  • 电池接口:2pin,2.54mm 间距,支持 3 串电池,支持快充。
  • 调试串口:Micro USB 接口的调试串口。

  板载接口还是很丰富的,可以说是应有尽有。具体有哪些我也不抄了,自己看下图吧。

输入图片说明

输入图片说明

使用体验

开机

  开发板支持从 TF 卡、eMMC 和 SSD(支持 NVMe SSD 和 SATA SSD)启动。 具体从哪个设备启动是由开发板背面的两个拨码(BOOT1 和 BOOT2)开关来控制的。

  BOOT1 和 BOOT2 两个拨码开关都支持左右两种设置状态,所以总共有 4 种 设置状态,开发板目前只使用了其中的三种。

  • BOOT0 和 BOOT1 都拨到左侧:未使用的组合。
  • BOOT0 拨到右侧,BOOT1 拨到左侧:从 SATA SSD 和 NVMe SSD 启动。
  • BOOT0 拨到左侧,BOOT1 拨到右侧:从 eMMC 启动。
  • BOOT0 和 BOOT1 都拨到右侧:从 TF 卡启动。

  由于开发套件只包含SD卡,并未包含EMMC模块,故我们选择将BOOT0和BOOT1都拨到右侧。

输入图片说明

  接上,鼠标,键盘,HDMI,最后接入电源。风扇转一下停一下,持续几秒就没后文了,很不幸出师不利。怀疑是SD卡默认没有刷入系统,接上电脑一看。有系统哇,为啥还不行呢。

输入图片说明

查看开机日志

  开机失败,作为一个开发人员第一时间应该想到的是,查看开机日志,看日志中有没有报错。开发板上有一个uart口是用于查看设备的运行日志的。

输入图片说明

  使用数据线连接电脑。打开串口调试工具,我这边日常使用的是Electerm。这个工具比较好的地方就是不仅开源还可以跨平台多端支持,且配置文件可以云同步,换电脑也不怕配置丢失。

输入图片说明

  官方文档推荐的是Mobaterm,这个对个人是免费的,需要注意的是该工具商用还是要掏钱的,且不跨平台,且不支持云同步,我并不喜欢用。这里可以按照自己的喜好,选择不同的工具。

  这里以Electerm为例,Linux系统下以115200波特率打开串口/dev/ttyACM0

输入图片说明

  为什么是/dev/ttyACM0?这里可以通过dmesg查看usb接入时的日志。日志中会提示接入了什么设备SerialNumber: 579B005206,操作系统分配的什么端口cdc_acm 1-1:1.0: ttyACM0: USB ACM device

becase@7080:~$ dmesg
[541875.671971] usb 1-7: USB disconnect, device number 49
[541878.870737] usb 1-7: new full-speed USB device number 50 using xhci_hcd
[541879.020054] usb 1-7: New USB device found, idVendor=1a86, idProduct=55d3, bcdDevice= 4.45
[541879.020058] usb 1-7: New USB device strings: Mfr=0, Product=2, SerialNumber=3
[541879.020059] usb 1-7: Product: USB Single Serial
[541879.020060] usb 1-7: SerialNumber: 579B005206
[541879.023266] cdc_acm 1-7:1.0: ttyACM0: USB ACM device
[541930.518184] usb 1-7: USB disconnect, device number 50
[541944.410993] usb 1-1: new full-speed USB device number 51 using xhci_hcd
[541944.564262] usb 1-1: New USB device found, idVendor=1a86, idProduct=55d3, bcdDevice= 4.45
[541944.564265] usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=3
[541944.564266] usb 1-1: Product: USB Single Serial
[541944.564267] usb 1-1: SerialNumber: 579B005206
[541944.567402] cdc_acm 1-1:1.0: ttyACM0: USB ACM device

  打开端口后,给开发板重新上电开机,看到有如下日志输出。日志中没有明显报错,看不懂没有什么头绪。

Pll Init ..pll[0] inited
pll[2] inited
pll[3] inited
pll[4] inited
pll[5] inited
OK.
reset src:0x00000001
lsadc dreset ok
lsadc0 init ok
adc0in0:91 adc0in1:588 adc0in2:223
adc1in2:2 adc1in3:91
adc boardId:10251
Load main hboot1_a
Load main hilink25
hboot1a hash dc44e2b7.
Boot Entry.
Load main hboot1_b

  死马当做活马医,重新刷一遍系统试一下。

下载镜像

  点我跳转到官方镜像下载地址,可以看到有Ubuntu和OpenEuler。由于该开发板使用的华为的昇腾 AI 处理器,自然也是支持华为的欧拉系统的。虽然你支持不过我不会用,所以还是选择ubuntu镜像。

输入图片说明

  下载完成需要解压才可以被烧录程序识别,解压出来是以.img结尾。

输入图片说明

烧录镜像

  烧录程序选择BalenaEtcher,这 是一款流行的开源软件,用于烧录(写入)镜像文件到存储设备,如 SD卡、USB驱动器或eMMC等。市面上绝大部分的通过SD卡启动的开发板,都是使用该工具烧录的。

  启动界面如下,第一个选项选择,要烧录的镜像。第二个选项选择,要烧录的存储介质。最后点击那个大大的Flash按钮。

输入图片说明

  稍等片刻,等待烧录完成即可。

输入图片说明

结论

  一顿操作后,发现还是不行。故怀疑是供电有问题,更换自己用的手机充电器。发现正常启动。

NOTICE:  Int ID:174, syscnt:0x2c305f19
NOTICE:  intNum 174, nodeStatus1 0x40 !
NOTICE:  [RasCbbCommonHandler]:[71L] moduleBase c1260000 
NOTICE:  [RasCbbCommonHandler]:[81] UE
NOTICE:  [Module] MATA0 
NOTICE:  [FillHisiModuleErrorInfo]:[275L] moduleID = 0x14 
NOTICE:  [Module] MATA0 
NOTICE:  SubSysID:0xff, DeviceID:0x0, SubSysNum:0x0
NOTICE:  RECOVERABLE!
NOTICE:  HestNotifiedOS
NOTICE:  [RasCbbCommonHandler]:[89] Handler end
NOTICE:  base = 0xc1260000 
NOTICE:  ERR_FRL = 0x142aa2 
NOTICE:  ERR_FRH = 0x0 
NOTICE:  ERR_CTRLL = 0x515 
NOTICE:  ERR_CTRLH = 0x0 
NOTICE:  ERR_STATUSL = 0xfc30050e 
NOTICE:  ERR_STATUSH = 0x0 
NOTICE:  ERR_ADDRL   = 0x10080010 
NOTICE:  ERR_ADDRH   = 0xe0000001 
NOTICE:  ERR_MISC0L  = 0x0 
NOTICE:  ERR_MISC0H  = 0x0 
NOTICE:  ERR_MISC1L  = 0xe798005 
NOTICE:  ERR_MISC1H  = 0x800122 
NOTICE:  el3_int exit!
cpu 0 entering scheduler
>>>>>>>>>>>>LiteOS start succeed!<<<<<<<<<<<

Ubuntu 22.04.3 LTS orangepiaipro ttyAMA0

orangepiaipro login: 

  开机后桌面如下,长呼一口气。之前真是吓我一跳,差点以为开发板是坏的。

输入图片说明

  随后用我的数据线以及我的充电器,和开发套件自带的数据线以及充电器,两两组合做交叉验证。发现只有我自己的充电器和我自己的数据线能给开发板使用。开发套件带的充电器和数据线全是坏的或者说供电不稳定的,这也是绝了白折腾我半个小时。

远程连接

查询IP

  连接网线,在路由器的后台查询到设备orangepiaipro的IP地址是192.168.101.8

输入图片说明

SSH连接

  SSH(Secure Shell)是一种网络协议,用于加密方式远程登录到计算机系统。它主要用于在网络服务中提供安全、可靠的远程登录和其他网络服务。

  我这边烧录的Ubuntu镜像,默认情况下是开启了SSH服务的。可以选择通过SSH连接开发板进行操作。

  通过SSH连接到设备端,用户名为HwHiAiUser,密码为Mind@123。查询系统版本为Ubuntu 22.04.3 LTS

becase@7080:~$ ssh HwHiAiUser@192.168.101.8
The authenticity of host '192.168.101.8 (192.168.101.8)' can't be established.
ECDSA key fingerprint is SHA256:bByvKK4hbDpvuc0bet7lQQabfHEx71fLip5TeJR6oHw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.101.8' (ECDSA) to the list of known hosts.
HwHiAiUser@192.168.101.8's password: 
  ___                                    ____   _ 
 / _ \  _ __  __ _  _ __    __ _   ___  |  _ \ (_)
| | | || '__|/ _` || '_ \  / _` | / _ \ | |_) || |
| |_| || |  | (_| || | | || (_| ||  __/ |  __/ | |
 \___/ |_|   \__,_||_| |_| \__, | \___| |_|    |_|
                           |___/                  
Welcome to Orange Pi Ai Pro
This system is based on Ubuntu 22.04.3 LTS (GNU/Linux 5.10.0+ aarch64)

This system is only applicable to individual developers and cannot be used for commercial purposes.

By using this system, you have agreed to the Huawei Software License Agreement.
Please refer to the agreement for details on https://www.hiascend.com/software/protocol

(base) HwHiAiUser@orangepiaipro:~$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
(base) HwHiAiUser@orangepiaipro:~$ 

VNC连接

  VNC(Virtual Network Computing)是一种远程桌面协议,它允许用户通过网络连接到远程计算机并以图形化界面进行操作。在Ubuntu操作系统上,我们可以通过下面的步骤安装和配置VNC服务器。

  首先需要在Ubuntu上安装VNC服务器。在SSH终端执行该下面的命令

(base) HwHiAiUser@orangepiaipro:~$ sudo apt update
(base) HwHiAiUser@orangepiaipro:~$ sudo apt install tightvncserver

  安装完成后,还需要配置VNC服务器以设置访问密码和其他选项。首次运行该命令时,它会提示设置一个密码(建议输入Mind@123),并询问是否还要设置一个view-only密码(可用可不用)。密码用于连接到VNC服务器进行操作,view-only密码用于只能查看而不能操作的连接。

(base) HwHiAiUser@orangepiaipro:~$ tightvncserver

You will require a password to access your desktops.

Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is orangepiaipro:2

Creating default startup script /home/HwHiAiUser/.vnc/xstartup
Starting applications specified in /home/HwHiAiUser/.vnc/xstartup
Log file is /home/HwHiAiUser/.vnc/orangepiaipro:2.log

  配置完成后,运行下面的命令启动VNC服务器。这里需要注意的是VNC的默认端口是5900,这里传入1的话,那么连接接开发板的VNC端口要填写5901。

(base) HwHiAiUser@orangepiaipro:~$ tightvncserver :1
A VNC server is already running as :1

  在远程管理器上填写VNC连接的服务器IP192.168.101.8和端口5091

输入图片说明

  输入前面VNC初始化时填写的密码Mind@123,即可远程连接到开发板的桌面。

输入图片说明

性能测试

  使用UnixBench完成性能基准测试。 UnixBench 是一套广泛使用的基准测试工具,主要用于评估 Unix-like 系统(包括 Linux 发行版、macOS 等)的性能。它通过一系列测试来衡量系统的不同方面,如 CPU 性能、内存速度、磁盘 I/O 性能等

  使用git clone https://github.com/kdlucas/byte-unixbench.git下载x性能测试工具。

(base) HwHiAiUser@orangepiaipro:~/Downloads$ git clone https://github.com/kdlucas/byte-unixbench.git
Cloning into 'byte-unixbench'...
remote: Enumerating objects: 258, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 258 (delta 76), reused 59 (delta 59), pack-reused 161
Receiving objects: 100% (258/258), 209.78 KiB | 1.06 MiB/s, done.
Resolving deltas: 100% (146/146), done.

  进入到UnixBench路径下,使用make编译工具源码。

(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ make
make distr
make[1]: Entering directory '/home/HwHiAiUser/Downloads/byte-unixbench/UnixBench'
Checking distribution of files
./pgms  exists
./src  exists
./testdir  exists
./tmp  exists
./results  exists
make[1]: Leaving directory '/home/HwHiAiUser/Downloads/byte-unixbench/UnixBench'
make programs
make[1]: Entering directory '/home/HwHiAiUser/Downloads/byte-unixbench/UnixBench'
gcc -o pgms/arithoh -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Darithoh src/arith.c 
gcc -o pgms/register -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum='register int' src/arith.c 
xxxxxxxxxxx
(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ ls
Makefile  README  Run  USAGE  WRITING_TESTS  pgms  results  src  testdir  tmp
(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ ./Run 

  编译完成会生成一个Run文件,控制台运行Run二进制文件。等待测试结果,时间很长很长很长,估摸着跑了有半个多小时。

(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ ls
Makefile  README  Run  USAGE  WRITING_TESTS  pgms  results  src  testdir  tmp
(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ ./Run 
   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com

------------------------------------------------------------------------------
   Use directories for:
      * File I/O tests (named fs***) = /home/HwHiAiUser/Downloads/byte-unixbench/UnixBench/tmp
      * Results                      = /home/HwHiAiUser/Downloads/byte-unixbench/UnixBench/results
------------------------------------------------------------------------------
....................
1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput  1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

1 x File Copy 256 bufsize 500 maxblocks  1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

1 x Process Creation  1 2 3

1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent)  1 2 3

1 x Shell Scripts (8 concurrent)  1 2 3

4 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

4 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

4 x Execl Throughput  1 2 3

4 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

4 x File Copy 256 bufsize 500 maxblocks  1 2 3

4 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

4 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

4 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

4 x Process Creation  1 2 3

4 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

4 x Shell Scripts (1 concurrent)  1 2 3

4 x Shell Scripts (8 concurrent)  1 2 3

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: orangepiaipro: GNU/Linux
   OS: GNU/Linux -- 5.10.0+ -- #1 SMP Mon Feb 26 15:29:07 CST 2024
   Machine: aarch64 (aarch64)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0:  (96.0 bogomips)
          
   CPU 1:  (96.0 bogomips)
          
   CPU 2:  (96.0 bogomips)
          
   CPU 3:  (96.0 bogomips)
          
   10:35:14 up  1:01,  2 users,  load average: 17.32, 17.39, 17.02; runlevel Jul

------------------------------------------------------------------------
Benchmark Run: Fri Jul 19 2024 10:35:14 - 11:03:23
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       18893177.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     4354.3 MWIPS (9.8 s, 7 samples)
Execl Throughput                               1179.8 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        532368.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          187810.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1192465.7 KBps  (30.0 s, 2 samples)
Pipe Throughput                              871454.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 121185.7 lps   (10.0 s, 7 samples)
Process Creation                               5336.8 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4036.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1121.3 lpm   (60.0 s, 2 samples)
System Call Overhead                         846033.2 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   18893177.2   1619.0
Double-Precision Whetstone                       55.0       4354.3    791.7
Execl Throughput                                 43.0       1179.8    274.4
File Copy 1024 bufsize 2000 maxblocks          3960.0     532368.4   1344.4
File Copy 256 bufsize 500 maxblocks            1655.0     187810.3   1134.8
File Copy 4096 bufsize 8000 maxblocks          5800.0    1192465.7   2056.0
Pipe Throughput                               12440.0     871454.2    700.5
Pipe-based Context Switching                   4000.0     121185.7    303.0
Process Creation                                126.0       5336.8    423.6
Shell Scripts (1 concurrent)                     42.4       4036.3    951.9
Shell Scripts (8 concurrent)                      6.0       1121.3   1868.8
System Call Overhead                          15000.0     846033.2    564.0
                                                                   ========
System Benchmarks Index Score                                         825.1

------------------------------------------------------------------------
Benchmark Run: Fri Jul 19 2024 11:03:23 - 11:31:41
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       56273640.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    14856.9 MWIPS (7.7 s, 7 samples)
Execl Throughput                               3335.2 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1402731.3 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          524689.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       3133562.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2592391.6 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 308950.3 lps   (10.0 s, 7 samples)
Process Creation                              12302.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   8213.7 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1139.0 lpm   (60.1 s, 2 samples)
System Call Overhead                        2441933.6 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   56273640.9   4822.1
Double-Precision Whetstone                       55.0      14856.9   2701.3
Execl Throughput                                 43.0       3335.2    775.6
File Copy 1024 bufsize 2000 maxblocks          3960.0    1402731.3   3542.3
File Copy 256 bufsize 500 maxblocks            1655.0     524689.4   3170.3
File Copy 4096 bufsize 8000 maxblocks          5800.0    3133562.8   5402.7
Pipe Throughput                               12440.0    2592391.6   2083.9
Pipe-based Context Switching                   4000.0     308950.3    772.4
Process Creation                                126.0      12302.2    976.4
Shell Scripts (1 concurrent)                     42.4       8213.7   1937.2
Shell Scripts (8 concurrent)                      6.0       1139.0   1898.4
System Call Overhead                          15000.0    2441933.6   1628.0
                                                                   ========
System Benchmarks Index Score                                        2057.9

  最后跑分结果单核825.1分,多核2057.9分,在嵌入式平台中性能是很强的了。要知道龙芯3A4000是桌面级别的CPU单核也只有876分,多核也不过2741分。

输入图片说明

开发环境

安装docker

  我这边喜欢用docker来部署各类开发环境,避免安装乱七八糟的软件和编译器影响到系统本身,把开发环境和系统环境隔离开。

(base) HwHiAiUser@orangepiaipro:~$ sudo apt install docker.io

  把用户添加到docker组,方便操作。

(base) HwHiAiUser@orangepiaipro:~$ sudo usermod -aG docker $USER

  由于国内dockerhub镜像源被禁,现在无法直接访问,且国内大部分的代理镜像源也都被关闭。这里先不说小猫这些东西。选择合法的途径,直接采用国内的atomhub镜像源测试即可。

  简单介绍一下AtomHub ,它由开放原子开源基金会牵头,联合多家行业伙伴发起,遵循OCI(Open Container Initiative,以下简称“OCI”)容器镜像标准,旨在为开发者提供开放中立、安全可信、高效便捷的新一代开源容器镜像中心。

  常用的镜像都是有的,一些个人开发者上传的定制镜像,可能就有点悬了。

输入图片说明

  运行下面的命令安装一个hello-world镜像,测试是否能正常工作。

(base) HwHiAiUser@orangepiaipro:~$ docker run hub.atomgit.com/library/hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

部署python3的开发环境

  进入到ubuntu环境使用apt安装python3,默认安装的版本是3.10.12

(base) HwHiAiUser@orangepiaipro:~$ docker run -it --name my_python hub.atomgit.com/library/ubuntu
root@b19f19390fa1:/# apt update
xxxxxxxx
root@b19f19390fa1:/# apt install python3
xxxxxxxx
root@b19f19390fa1:/# python3 --version
Python 3.10.12
root@b19f19390fa1:/# python3                     
Python 3.10.12 (main, Mar 22 2024, 16:50:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello_world")
hello_world
>>> print(1+1)
2

  退出容器回到本机一看,发现python3的版本还是3.9.2。说明在docker容器中安装的软件和外界没有任何关系,不会影响到外界的依赖关系。容器是一个独立的开发环境。

(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ python3 --version
Python 3.9.2

AI应用

部署语言类大模型

安装ollama

  安装ollama,该工具是一个大模型聚合平台。可以方便管理各种语言模型。运行curl -fsSL https://ollama.com/install.sh | sh执行安装步骤,输入密码Mind@123


(base) HwHiAiUser@orangepiaipro:~$ curl -fsSL https://ollama.com/install.sh | sh
>>> Downloading ollama...
######################################################################## 100.0%##O#-#                                                                        
>>> Installing ollama to /usr/local/bin...
[sudo] password for HwHiAiUser: 
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.
WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.

  提示开发板没有GPU显卡(WARNING: No NVIDIA/AMD GPU detected. Ollama will run in CPU-only mode.)运行的性能可能较为低下,不知道具体是啥原因暂且忽略吧。

  输入ollama --version验证是否安装成功,得到结果ollama version is 0.2.7说明一切正常。

(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ ollama --version
ollama version is 0.2.7

配置局域网访问

  设置Ollama配置支持局域网访问,修改/etc/systemd/system/ollama.service文件,在Environment下面再添加一行Environment="OLLAMA_HOST=0.0.0.0:11434"保存即可。

[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/home/HwHiAiUser/.local/bin:/usr/local/Ascend/ascend-toolkit/latest/bin:/usr/local/Ascend/ascend-toolkit/latest/compiler/ccec_compiler/bin:/usr/local/miniconda3/bin:/usr/local/miniconda3/condabin:/usr/local/Ascend/ascend-toolkit/laster/bin:/usr/local/Ascend/ascend-toolkit/laster/compiler/ccec_compiler/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin "
Environment="OLLAMA_HOST=0.0.0.0:11434"
[Install]
WantedBy=default.target

  运行sudo systemctl daemon-reload重载systemctl,紧接着运行sudo service ollama restart重启服务,最后通过curl http://192.168.101.8:11434测试,若返回Ollama is running则代表设置成功。

(base) HwHiAiUser@orangepiaipro:~$ sudo systemctl daemon-reload
(base) HwHiAiUser@orangepiaipro:~$ sudo service ollama restart
(base) HwHiAiUser@orangepiaipro:~$ curl http://192.168.101.8:11434
Ollama is running(base) 

部署通义千问

  根据ollama官方文档的描述,最少要有8G的内存才能使用7B的语言模型。

Model Parameters Size Download
Llama 3 8B 4.7GB ollama run llama3
Llama 3 70B 40GB ollama run llama3:70b
Phi 3 Mini 3.8B 2.3GB ollama run phi3
Phi 3 Medium 14B 7.9GB ollama run phi3:medium
Gemma 2 9B 5.5GB ollama run gemma2
Gemma 2 27B 16GB ollama run gemma2:27b
Mistral 7B 4.1GB ollama run mistral
Moondream 2 1.4B 829MB ollama run moondream
Neural Chat 7B 4.1GB ollama run neural-chat
Starling 7B 4.1GB ollama run starling-lm
Code Llama 7B 3.8GB ollama run codellama
Llama 2 Uncensored 7B 3.8GB ollama run llama2-uncensored
LLaVA 7B 4.5GB ollama run llava
Solar 10.7B 6.1GB ollama run solar

Note: You should have at least 8 GB of RAM available to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models.

  而我们的开发板一共就搭载了8G内存,出掉系统的开销,剩下可以用的也就6.3G。

(base) HwHiAiUser@orangepiaipro:~/Downloads/byte-unixbench/UnixBench$ free -h
               total        used        free      shared  buff/cache   available
Mem:           7.4Gi       859Mi       2.9Gi        49Mi       3.6Gi       6.3Gi
Swap:             0B          0B          0B

  从表格来看,可选项只有Moondream 2Phi 3 Mini。实际上官方的仓库内有很多的语言模型,我们只要找一个小于8B的就行。测试选用阿里系发布的通义千问大模型部署。运行命令ollama run qwen:0.5b安装通义千问0.5B。这个安装就比较费时了,在等待安装的过程中可以再开一个终端,继续下一步跳过等待的过程。

(base) HwHiAiUser@orangepiaipro:~$ ollama run qwen:0.5b
pulling manifest 
pulling fad2a06e4cc7... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 394 MB                         
pulling 41c2cf8c272f... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 7.3 KB                         
pulling 1da0581fd4ce... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  130 B                         
pulling f02dd72bb242... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   59 B                         
pulling ea0a531a015b... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  485 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success

  部署完成后控制台是可以直接访问的,只不过控制台还是显得不够高端只能自己用,其他人想要使用该怎么办呢。

(base) HwHiAiUser@orangepiaipro:~$ ollama run qwen:0.5b
>>> 你好
您好!有什么可以帮助您的吗?

>>> 你是谁
我是来自阿里云的大规模语言模型,我叫通义千问。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持和解答。

>>>

安装ollama-webui

  安装ollama的前端交互界面,这里就用到了我们刚刚开发环境中安装的docker。运行下面的命令安装open-webui的容器。

(base) HwHiAiUser@orangepiaipro:~$ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
Unable to find image 'ghcr.io/open-webui/open-webui:main' locally
main: Pulling from open-webui/open-webui
ea235d1ccf77: Pull complete 
26f13e32d8cd: Pull complete 
e569c3fca503: Pull complete 
8cae6dc67aef: Pull complete 
153915d34d13: Pull complete 
761886d9fb03: Pull complete 
4f4fb700ef54: Pull complete 
004754e7f3d1: Pull complete 
4495941f96a2: Pull complete 
2bb7e3b0ae41: Downloading [=======>                                           ]  40.45MB/288.1MB
abd18b7d3c36: Download complete 
49800a7fbb5c: Downloading [==>                                                ]  32.38MB/727.9MB
25281b23f845: Downloading [==============================>                    ]  32.91MB/54.66MB
67196eb5d079: Waiting 
85f88c980917: Waiting 
48fbf4ab6c66: Waiting 

  安装完成后通过http://{ip}:{port}访问open-webui,我们这边使用的访问地址就是http://192.168.101.8:3000,第一次登录需要注册账户。

输入图片说明

  注册完成会自动登录,登录进去后,必须找到管理员面板。

输入图片说明

  点击设置,先修改外部连接的Ollama API的地址。我这边修改为http://192.168.101.8:11434,点击后面的刷新按钮,确定弹窗提示已验证服务器连接。随后建议关掉OpenAI API的访问按钮,最后点击保存。

输入图片说明

  如果连接的Ollama API这一步报错WebUI could not connect to Ollama呢,这大概率是因为没有正确配置局域网访问导致的。

输入图片说明

  可以做如下测试,在开发板中执行curl http://192.168.101.8:11434会报错Connection refusedsudo lsof -i :11434去查看端口状态显示localhost,说明Ollama被配置为只能使用localhost去访问。

(base) HwHiAiUser@orangepiaipro:~$ curl http://192.168.101.8:11434
curl: (7) Failed to connect to 192.168.101.8 port 11434 after 0 ms: Connection refused
(base) HwHiAiUser@orangepiaipro:~$ sudo lsof -i :11434
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ollama  10749 ollama    3u  IPv4  53543      0t0  TCP localhost:11434 (LISTEN)
(base) HwHiAiUser@orangepiaipro:~$ curl http://localhost:11434/
Ollama is running(base)

  由于我们这边Ollama被安装在了宿主机中,Ollama-webui被安装到docker中,两者之间的网络环境是不一样的,无法在docker中通过localhost:11434访问到Ollama。这边我们需要修改一下配置文件,参考上面安装Ollama提到的配置局域网访问即可。

  回到主页,选择刚刚安装的千问0.5B,就可以快乐的玩耍啦。

输入图片说明

总结

  从收到开发板到开机配置,再到跑相关的工程,总体来说十分坎坷,尤其是这个充电器供电有问题,无法开机,耽误我几个小时时间去排查。

  天线的设计不是很喜欢,容易损坏和丢失,如果是板载天线就更好了。

  建议初学者可以搭配上外壳,真的很容易摔坏,我就摔了一下,sd卡槽的天灵盖就被掀起来了,SD卡也被直接摔断,在我手上还没活过十分钟。

  当然也有好的一面,开发板整体接口丰富,性能强劲,资源较多,文档全是中文对中文开发者还是比较友好的。

关于无法开机的问题

  闲来无事用了一个功率计看了一下充电功率,得出以下结论,品质有待提高哇。

  • 使用我自己的手机充电器+我自己的手机充电线。不通过任何中间手段,能直接以5v2a约为10w的功率开机。
  • 使用我自己的手机充电器+开发套件带的原装充电线。只是更换一个数据线,PD诱骗到5v电流上不去无法开机。将电压修改到9v,这时候电流维持在1a左右可以正常开机。推测原装充电线品质太差,无法以5v2a方式稳定输出2a以上的电流,达不到10w供电功率。
  • 使用开发套件原装的充电器+原装的充电线。更换头和线,PD诱骗到5v/9v电流都上不去无法开机。改为12v就可以开机,此时电流只有几百毫安。推测充电器也是劣质的,峰值电流太低,5v2a和9v1a都做不到。
  • 原装线和原装头,不通过PD诱骗的手段,无法正常使用。供电功率协商都会出问题,推测开发板的电源管理芯片也不太行,在劣质的充电器和充电线上连协商一个正常的供电功率都做不到。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 18:14:02       101 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 18:14:02       109 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 18:14:02       87 阅读
  4. Python语言-面向对象

    2024-07-22 18:14:02       96 阅读

热门阅读

  1. 【Linux常用命令】之mkdir命令

    2024-07-22 18:14:02       25 阅读
  2. 在 macOS 上使用 Jadx 进行 APK 反编译

    2024-07-22 18:14:02       25 阅读
  3. C++生成随机数的两种方法

    2024-07-22 18:14:02       21 阅读
  4. Blazor Webassembly多标签页实现非iframe的实现

    2024-07-22 18:14:02       26 阅读
  5. Lianwei 安全周报|2024.07.22

    2024-07-22 18:14:02       31 阅读
  6. js弹出对话框

    2024-07-22 18:14:02       22 阅读
  7. 优先级策略:在Eureka中配置服务实例优先级

    2024-07-22 18:14:02       26 阅读
  8. L298N的输出电流与电压

    2024-07-22 18:14:02       23 阅读
  9. 基于vite + pnpm monorepo 实现一个UI组件库

    2024-07-22 18:14:02       25 阅读
  10. sqlserver15(2019)修改参数READ_COMMITTED_SNAPSHOT

    2024-07-22 18:14:02       22 阅读