[嵌入式AI从0开始到入土]嵌入式AI系列教程
注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。
第1期 昇腾Altas 200 DK上手
第2期 下载昇腾案例并运行
第3期 官方模型适配工具使用
第4期 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第5期 炼丹炉的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu远程桌面配置
第7期 下载yolo源码及样例运行验证
第8期 在线Gpu环境训练(基于启智ai协作平台)
第9期 转化为昇腾支持的om离线模型
第10期 jupyter lab的使用
第11期 yolov5在昇腾上推理
第12期 yolov5在昇腾上应用
第13期_orangepi aipro开箱测评
第14期 orangepi_aipro小修补含yolov7多线程案例
第15期 orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份
未完待续…
文章目录
- [嵌入式AI从0开始到入土]嵌入式AI系列教程
- 前言
- 一、ATC报错
- 1、报错详情
- 2、解决办法
- 二、欢迎界面
- 1、一些有趣的软件
- 2、效果展示
- 1、lolcat
- 2、figlet
- 3、toilet
- 4、cowsay
- 5、sl
- 6、cmatrix
- 3、修改欢迎界面
- 1、源文件
- 2、添加的内容
- 3、效果
- 三、镜像导出
- 1、折腾历程
- 2、wsl2环境导出
- 1、重新编译内核
- 2、安装驱动
- 3、导入脚本,安装依赖
- 4、执行
- 5、卸载sd卡
- 3、VMware虚拟机
- 4、注意事项
- 四、问题
- 1、添加的欢迎信息不显示
- 2、apt报错
- 总结
前言
注:本文基于orangepi_aipro于2023.2.3公布的ubuntu_desktop镜像
上一期中在atc转换时有个报错,但是不影响结果,这期做一个修复;然后添加本次修补的信息到ssh欢迎界面,以便后续使用;最后是导出我们制作好的镜像,并且压缩备份。
一、ATC报错
1、报错详情
PermissionError: [Errno 13] Permission denied: '/usr/local/Ascend/ascend-toolkit/7.0.0/opp/vendors/customize/op_impl/ai_core/tbe/customize_impl/rescale.py'
我手动寻找了这个文件,发现在/usr/local/Ascend/ascend-toolkit/7.0.0/opp/vendors/customize/op_impl/ai_core/tbe/customize_impl/
目录是有这个文件的,这时我怀疑的是权限问题。
于是我去我安装了相同版本CANN的wsl2内去查看,不幸的是发现/usr/local/Ascend/ascend-toolkit/7.0.0/
这个目录下就已经没有opp
这个文件夹了。
2、解决办法
后面经过一阵搜索,终于在论坛上找到了办法。
sudo chmod a+rx -R /usr/local/Ascend/ascend-toolkit/7.0.0/opp/vendors/customize/op_impl/
这行命令的意思是以超级用户权限,递归地为指定目录及其所有子目录和文件设置所有用户的读和执行权限
之后再次运行便不会收到这个错误了。
二、欢迎界面
1、一些有趣的软件
这里系统内置了lolcat
和figlet
这两个软件。当然,这远远不够我们整活的。于是
sudo apt install -y cowsay sl cmatrix toilet
关于用法直接使用-h
参数即可(虽然有些会报错,但你就说给没给说明吧)
2、效果展示
1、lolcat
ll | lolcat
lolcat "This is a test text!"
2、figlet
figlet
3、toilet
toilet -f term -F border --gay "This is a test text!"
echo "This is a test text!" | toilet -f term -F border --gay
4、cowsay
cowsay "toolsmanhehe" | lolcat #这里结合lolcat实现彩色
echo "This is a test text!" | cowsay
5、sl
sl
嗯,没错,跑过一辆小火车
6、cmatrix
cmatrix
经典黑客帝国背景,很帅的啦。
3、修改欢迎界面
在Ubuntu系统中,SSH登录的欢迎信息通常显示在用户成功通过SSH登录后看到的第一条消息。这个欢迎信息存储在文件/etc/motd
中,该文件的名字是“Message of the Day”的缩写。
请注意,这里会有一个动态生成的motd,它会覆盖您直接编辑的/etc/motd
文件。在这种情况下,您可能需要修改负责生成这个动态消息的脚本,位于/etc/update-motd.d/
目录下的脚本。
我们选其中一种就行了,注意,前面数字越小的越先被执行。
sudo vim /etc/update-motd.d/01-orangepi-startup-text #直接修改原来的欢迎界面
sudo vim /etc/update-motd.d/02-user-text #新建新的信息
1、源文件
我们先来看下原来的内容
#!/bin/sh
figlet -tk -w 120 "Orange Pi"
printf "Welcome to Orange Pi Ai Pro\n"
[ -r /etc/lsb-release ] && . /etc/lsb-release
if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then
# Fall back to using the very slow lsb_release utility
DISTRIB_DESCRIPTION=$(lsb_release -s -d)
fi
printf "This system is based on %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"
printf "\n"
printf "This system is only applicable to individual developers and cannot be used for commercial purposes.\n"
printf "\n"
printf "By using this system, you have agreed to the Huawei Software License Agreement.\n"
printf "\n"
printf "Please refer to the agreement for details on https://www.hiascend.com/software/protocol\n"
printf "\n"
2、添加的内容
toilet -f term -F border -w 100 --metal "Fix the bug that the hibernation cannot wake up,configure the vnc desktop (accessed using ip:5901),add opencv4.9.0 with CANN support enabled,add torch_npu support."
cat /etc/motd.cowsay #至于为什么这么写,看问题区第一点
3、效果
这是我魔改完的效果
三、镜像导出
这里我研究了好几天,终于成功导出镜像。不要问我不是有许多工具的吗,随便找一个就好了,不信你试试就好,不缺硬盘的除外。
1、折腾历程
开始,我使用Ascend AI Devkit Imager
备份功能进行备份,但是似乎有bug,不管选不选压缩,它都会压缩。这里备份没有问题,备份的镜像也没问题。这里使用了19G左右空间的64G卡备份完的test.img.zip
是14G多,比我最后使用的方法获得的打2倍以上。
但是刷入备份镜像的时候你就会发现问题,明明条子读完了,过了一会,却还是没提示烧录完成。通过任务管理器,会发现sd卡还在被写入。
于是我更换balenaEtcher烧录,发现原来是1:1备份的,也就是卡多大,镜像多大
我知道有人会说,啊,用个镜像压缩工具把空白的区域去掉不就行了嘛。于是我掏出了祖传的pishrink.sh
,然而挂载img镜像后,执行这个脚本却提示超级块损坏,有人说用win32diskimager
备份的镜像就可以。不幸的是,还是1:1备份,而且也是同样的报错提示。
好嘛,那我掏出祖传的DiskGenius
,显示第二个分区确实后面没有被使用,那就直接resize,不幸的是,提示文件损坏,无法调整。
好嘛,那我手动压缩(直接去除后面没有使用的空间),行了吧。
losetup /dev/loop0 test.img #使用losetup将.img文件映射为一个块设备。
fdisk -l /dev/loop0 #使用fdisk或parted查看分区的详细信息
parted /dev/loop0 #使用parted工具来缩小第二个分区的大小。
resizepart 2 20GB # 假设要将分区缩小到20GB
q # 退出parted
e2fsck -f /dev/loop0p2 # 检查文件系统
resize2fs /dev/loop0p2 20GB # 调整文件系统大小
dd if=/dev/loop0 of=test_resized.img #使用dd命令备份修改后的分区到新的镜像文件。
losetup -d /dev/loop0 #卸载分区并删除loop设备
然而不幸的是,在调整文件系统大小这一步报错。到这里我心态真的要崩溃了,复制一次源文件就得60G的样子,搞了快10次。
然后我就好奇官方的镜像是如何出来的,于是翻文档,终于,成功了,导出镜像6G多一点。
2、wsl2环境导出
1、重新编译内核
尽管我们通过usbipd-win项目能够将usb设备连接到wsl,而且WSL2-Linux-Kernel内核中已经包含USB驱动,但不幸的是默认内核配置并没有自动加载USB存储驱动模块。所以,还得自己动手编译内核。
在wsl内执行以下命令
su
apt update
apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool #安装依赖
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git #下不动用下面的码云镜像仓库
git clone https://gitee.com/mirrors/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-$(uname -r | cut -d- -f1) #切换到我们当前版本内核分支
cp /proc/config.gz config.gz #复制当前内核的配置文件
gunzip config.gz
mv config .config
make menuconfig
在Device Drivers --> USB support ---> USB Mass Storage support
开启usb驱动加载
使用方向键上下移动,回车进入,找到后按两下空格,使其变为<*>
,然后方向键向右移动到save,保存,最后,移动到exit,一步步退出,直到提示configuration witten to.config
。
接下来需要修改一个配置,确保CONFIG_X86_X32
没有被开启
vim .config
接下来就让你的电脑风扇咆哮吧
sudo make -j$(nproc)
sudo make modules_install -j$(nproc)
sudo make install -j$(nproc)
大概5-10分钟就可以编译完成。编译结果如下
接着把这个vmlinux
文件放到win上,我是放到了存放wsl文件的地方,cp命令或者直接资源管理器复制都可以。
然后来到win用户根目录,也就是C:\Users\xxx
,新建.wslconfig
文件
[wsl2]
kernel=D:\\wsl\\vmlinux #路径自行修改
然后重新启动wsl就可以了,注意,应该使用wsl --shutdown
命令关闭。
2、安装驱动
WSL 本身并不支持连接 USB 设备,因此你需要安装开源 usbipd-win 项目。
注意,必须是wsl2,否则无法挂载usb设备到wsl内。什么,你还没有,那么按照我之前的这篇教程安装一下吧,很快的。
首先安装驱动,详情请查看官方文档,在powershell内执行(为了方便,请直接使用管理员权限打开)
wget https://github.com/dorssel/usbipd-win/releases/download/v4.1.0/usbipd-win_4.1.0.msi #下载完记得手动安装一下
winget install --interactive --exact dorssel.usbipd-win #github下载慢的话用这个
不幸的是这俩我都下的十分缓慢,这里疑似版权问题,CSDN不让我发。
安装之后,我们继续在powershell内执行(假设我现在需要连接的设备是2-6)
usbipd list #列出所有连接到 Windows 的 USB 设备
usbipd bind --busid 2-6 #将其设为共享状态
usbipd list #确保其状态变为share
usbipd attach --wsl --busid 2-6 #将USB设备连接到wsl
连接成功应有如下提示
注意,应该确保 WSL 命令提示符处于打开状态。 请注意,只要 USB 设备连接到 WSL,Windows 将无法使用它。 附加到 WSL 后,任何作为 WSL 2 运行的分发版本都可以使用 USB 设备。
然后在wsl内执行
lsusb
lsblk
3、导入脚本,安装依赖
我提取了相关脚本,上传至本文置顶资源。
同时我们也可以从产品详情页下载源码。
我们只需要这两个文件
su
apt update
apt-get install -y qemu qemu-user qemu-user-static binfmt-support xz-utils
cp library/* /usr/lib64/ #这两个文件我放在我的压缩包跟目录了,自己改下路径
tar zxf image-builder.tar.gz
cd image-builder/src/compress/
vim base.sh
#修改419行
xz -ck -T0 -9 -vv "$3" > "$3".xz || return 1
#改成
xz -c -T$(nproc) -vv "$3" > "$3".xz || return 1
这里做了三个更改
- 去除
-k
参数,这样就不会保留原始的linux.img,反正我们一般也不会保留压缩前的,第一次使用这个脚本建议还是留着。 T0
改为T$(nproc)
:这样使用全部cpu核心去执行压缩操作,加快速度- 去除
-9
这个参数,这个参数表示最大压缩率,虽然去除会导致压缩后的文件变大一些,但是能有效减少内存占用。实测大约需要20G内存执行-9这个压缩级别。内存不够会导致报错。
4、执行
bash base.sh -c ubuntu/22.04 /dev/sdX linux.img #ubuntu
bash base.sh -c openEuler/22.03/ /dev/sdX linux.img #openEuler
说明:此处的sdX是上面第二步lsblk
显示的编号,或者用fdisk -l
查找,就是可能比较乱
等待其提示[COMPRESS] sd card compress success!
然后我们可以在image-builder/src/compress
目录下看到linux.img
和linux.img.xz
两个文件。当然我们选择只保存后者啦。
5、卸载sd卡
在 WSL 中完成设备使用后,可物理断开 USB 设备,或者从 PowerShell 运行
二选一,效果一样
usbipd unbind -b 2-6 #停止共享
usbipd detach --busid 2-6 #卸载这个设备
3、VMware虚拟机
这里遇到一个问题,不知道是不是vm17的问题,我把sd卡连接到虚拟机,提示我驱动不兼容,然后虚拟机内看不到,物理机也看不到。
解决办法很简单,添加物理磁盘就行了。
使用管理员权限启动VMware。
关于设备问题,0一般都是你的系统盘,不知道就都试一下,添加后看大小就行了。
其他步骤和wsl内一致。
4、注意事项
导出的镜像不包含你的wifi连接信息,或者说包含,但是首次启动时会写入官方的配置导致无法自动连接wifi。需要通过串口或者网口重新配网。
四、问题
1、添加的欢迎信息不显示
这里我使用以下命令,在终端执行是正常的,但加入motd后不显示
cowsay -W 35 Mirror production time: 24.02.19 Made by toolsmanhehe | toilet -f term --gay
后面经过查询,得知motd不支持动态输入,但是我们可以曲线实现,把动态输入变为静态。
cowsay -g -W 35 "Mirror production time: 24.02.19" "Made by toolsmanhehe" | toilet -f term --gay > /etc/motd.cowsay #-g是把眼镜变成$
之后看一下效果,并加入motd内容中
cat /etc/motd.cowsay
2、apt报错
报错内容如下
Failed to retrieve available kernel versions.
Failed to check for processor microcode upgrades.
虽然不影响使用,但是作为强迫症晚期患者,眼不见为净
sudo vim /etc/needrestart/needrestart.conf
#找到kernelhints和ucodehints,去掉注释,并将其改为
$nrconf{kernelhints} = 0;
$nrconf{ucodehints} = 0;
究极解决办法
sudo apt-get purge needrestart
总结
emmm,现在应该只剩下硬件问题了,这个是真的要费脑子了。