【EdgeBoard FZ5 边缘AI计算盒】简单的开一下机而已
本帖最后由 nemon 于 2021-3-22 13:49 编辑上次说到,随FZ5C附有一个TF卡,考虑到在我胡折腾的时候,有可能心不在焉的敲出“rm -f /”的经典名句,所以最好还是有个备份。用读卡器加载后拷贝文件是不能备份整个系统滴,可以看到:完全不靠谱
<font face="微软雅黑" size="2">G:\新建文件夹\可移动磁盘>tree/?
以图形显示驱动器或路径的文件夹结构。
TREE
/F 显示每个文件夹中文件的名称。
/A 使用 ASCII 字符,而不使用扩展字符。
G:\新建文件夹\可移动磁盘>tree /F
文件夹 PATH 列表
卷序列号为 C293-7256
G:.
│atolr.exe
│BOOT.BIN
│image.ub
│README.txt
│
├─.fseventsd
│ fseventsd-uuid
│
└─.Spotlight-V100
│VolumeConfiguration.plist
│
├─Store-V1
│ VolumeConfig.plist
│
└─Store-V2
└─C437081A-2883-4684-81E0-57D8AD5D68BB
│.store.db
│0.directoryStoreFile
│0.directoryStoreFile.shadow
│0.indexArrays
│0.indexBigDates
│0.indexCompactDirectory
│0.indexDirectory
│0.indexGroups
│0.indexHead
│0.indexIds
│0.indexPositions
│0.indexPostings
│0.indexUpdates
│0.shadowIndexGroups
│0.shadowIndexHead
│Cab.created
│indexState
│journalAttr.1
│journalExclusion
│Lion.created
│live.0.directoryStoreFile
│live.0.directoryStoreFile.shadow
│live.0.indexArrays
│live.0.indexBigDates
│live.0.indexCompactDirectory
│live.0.indexDirectory
│live.0.indexGroups
│live.0.indexHead
│live.0.indexIds
│live.0.indexPositions
│live.0.indexPositionTable
│live.0.indexPostings
│live.0.indexTermIds
│live.0.indexUpdates
│live.0.shadowIndexArrays
│live.0.shadowIndexCompactDirectory
│live.0.shadowIndexDirectory
│live.0.shadowIndexGroups
│live.0.shadowIndexHead
│live.0.shadowIndexPositionTable
│live.0.shadowIndexTermIds
│psid.db
│reverseDirectoryStore
│reverseDirectoryStore.shadow
│reverseStore.updates
│shutdown_time
│store.db
│store.updates
│store_generation
│tmp.Cab
│tmp.Lion
│tmp.SnowLeopard
│tmp.spotlight.loc
│tmp.spotlight.state
│
├─journals.assisted_import_post
├─journals.assisted_import_pre
├─journals.corespotlight
├─journals.health_check
├─journals.live
├─journals.live_priority
├─journals.live_system
├─journals.live_user
├─journals.migration
├─journals.migration_secondchance
└─journals.scan
retire.7</font>
于是找了两个小工具。第一个工具用来备份:
第二个工具用来恢复(希望用不上):
专用工具就是好,顺利的备出来三十多G的映像,压缩完5个多G:
<font face="微软雅黑" size="2">G:\新建文件夹>dir
驱动器 G 中的卷没有标签。
卷的序列号是 C293-7256
G:\新建文件夹 的目录
2021-03-1218:30 <DIR> .
2021-03-1218:30 <DIR> ..
2021-03-1209:14 5,740,672,715 FZ5-baidu-20210308.7z
2021-03-1208:38 31,914,983,424 FZ5-baidu-20210308.img</font>然后就可以放心大胆的搞了,接上dp转VGA和显示器,直接把usb键盘插到盒子上,再接上电源,一台3500块软妹币的linux台式机就启动了,想想这配置就觉得奢侈。
https://v.youku.com/v_show/id_XNTEyNTM2ODg4MA==.html
从加电到出现“openembedded”大约需要12秒,之后直接进入到文本控制台,不需要登录。
从视频中可以看到在workspace下,有3个文件夹:<font face="微软雅黑" size="2">FZ5C_install_1.5.1
PaddleLiteSample
driver</font>其中driver里面只有一个文件“fpgadrv.ko”是fpga的驱动,这个驱动和paddle版本相关。
paddle是百度研发的类似tensorflow的深度学习框架,经过多年发展,已经形成了系列套件,其中用于边缘计算的以前称作paddle mobile,到1.5之后,成为paddle lite 。百度paddle lite分成两段:
[*]Analysis Phase为模型优化阶段,输入为Paddle的推理模型,通过Lite的模型加速和优化策略对计算图进行相关的优化分析,包含算子融合,计算裁剪,存储优化,量化精度转换、存储优化、Kernel优选等多类图优化手段。优化后的模型更轻量级,在相应的硬件上运行时耗费资源更少,并且执行速度也更快。
[*]Execution Phase为预测执行阶段,输入为优化后的Lite模型,仅做模型加载和预测执行两步操作,支持极致的轻量级部署,无任何第三方依赖。
我理解,模型优化阶段是通用的,而预测执行阶段,会对不同硬件平台进行适配和优化,于是会有以下的架构:
对于一个完整AI应用,架构应该是这样:
首先是选取框架工具,然后设计一个模型,用已有的训练数据进行训练,得到符合期望的带参模型。将带参模型部署到硬件平台后,通过执行兼容预测框架的引擎,对从外设接口获得的工作数据进行处理,得到所需输出。
而前文提到的“fpgadrv.ko”就是paddle调用fpga中预先烧录的op所需的驱动。
“FZ5C_install_1.5.1”是为米尔科技的EdgeBoard边缘AI计算盒FZ5C安装paddle lite环境用的,其中的“install_FZ5C.sh”就是安装文件,内容如下:
#!/usr/bin/env sh
backup() {
echo "开始进行$dev_type安装前备份"
if [ ! -d "/backup" ]; then
rm -rf backup
fi
mkdir backup
for file in `ls $paddlelite_lib_dir`
do
if [[ $file =~ ^libpaddle_full_api_shared.so ]];then
cp $3/$file ./backup/
if [$? -ne 0 ];then
echo "备份${file}到./backup/失败"
return 0
else
echo "备份${file}到./backup/"
fi
fi
done
mkdir ./backup/include
cp $2/paddle_*./backup/include
if [$? -ne 0 ];then
echo "备份libpaddle_full_api_shared.so头文件到./backup/include/目录失败"
return 0
else
echo "成功备份libpaddle_full_api_shared.so头文件到./backup/include/目录"
fi
mkdir ./backup/$1/
cp ~/workspace/driver/fpgadrv.ko ./backup/$1/
if [$? -ne 0 ];then
echo "备份fpgadrv.ko到./backup/${1}/目录失败"
return 0
else
echo "成功备份fpgadrv.ko到./backup/${1}/目录"
fi
cp /run/media/mmcblk1p1/BOOT.BIN ./backup/$1/
if [$? -ne 0 ];then
echo "备份BOOT.BIN到./backup/${1}/目录失败"
return 0
else
echo "成功备份BOOT.BIN到./backup/${1}/目录"
fi
cp /run/media/mmcblk1p1/image.ub ./backup/$1/
if [$? -ne 0 ];then
echo "备份image.ub到./backup/${1}/目录失败"
return 0
else
echo "成功备份image.ub到./backup/${1}/目录"
fi
echo "备份完成"
return 1
}
install() {
echo "开始进行$dev_type安装"
for file in `ls $3`
do
if [[ $file =~ ^libpaddle_full_api_shared.so ]];then
rm $3/$file
if [$? -ne 0 ];then
echo -e "删除已经安装${file}失败"
return 0
else
echo -e "删除已经安装${file}成功"
fi
fi
done
for file in `ls .`
do
if [[ $file =~ ^libpaddle_full_api_shared.so... ]];then
cp ./libpaddle_full_api_shared.so* $3
if [$? -ne 0 ];then
echo -e "安装新版${file}失败"
return 0
else
echo -e "成功安装新版${file}"
fi
ln -r $3/$file $3/libpaddle_full_api_shared.so --symbolic
if [$? -ne 0 ];then
echo -e "创建${file}软链到libpaddle_full_api_shared.so失败"
return 0
else
echo -e "成功创建${file}软链到libpaddle_full_api_shared.so"
fi
fi
done
cp -r ./include/* $2
if [$? -ne 0 ];then
echo -e "安装新版libpaddle_full_api_shared.so头文件失败"
return 0
else
echo -e "成功安装新版libpaddle_full_api_shared.so头文件"
fi
cp -r ./$1/fpgadrv.ko ~/workspace/driver/
if [$? -ne 0 ];then
echo -e "安装新版驱动失败"
return 0
else
echo -e "成功安装新版驱动"
fi
cp ./$1/BOOT.BIN /run/media/mmcblk1p1/
if [$? -ne 0 ];then
echo -e "安装新版镜像BOOT.BIN失败"
return 0
else
echo -e "成功安装新版镜像BOOT.BIN"
fi
cp ./$1/image.ub /run/media/mmcblk1p1/
if [$? -ne 0 ];then
echo -e "安装新版镜像image.ub失败"
return 0
else
echo -e "成功安装新版镜像image.ub"
fi
return 1
}
restore() {
echo "安装失败开始进行$dev_type恢复"
for file in `ls $3`
do
if [[ $file =~ ^libpaddle_full_api_shared.so ]];then
rm $3/$file
if [$? -ne 0 ];then
echo "删除已经安装${file}失败"
return 0
else
echo "删除已经安装${file}成功"
fi
fi
done
for file in `ls ./backup/`
do
if [[ $file =~ ^libpaddle_full_api_shared.so... ]];then
cp ./backup/$file $3
if [$? -ne 0 ];then
echo "恢复备份的${file}失败"
return 0
else
echo "恢复备份的${file}成功"
fi
ln -r $3/$file $3/libpaddle_full_api_shared.so --symbolic
if [$? -ne 0 ];then
echo "创建${file}软链到libpaddle_full_api_shared.so失败"
return 0
else
echo "成功创建${file}软链到libpaddle_full_api_shared.so"
fi
fi
done
cp -r ./backup/include/* $2
if [$? -ne 0 ];then
echo "恢复备份的libpaddle_full_api_shared.so头文件失败"
return 0
else
echo "恢复备份的libpaddle_full_api_shared.so头文件成功"
fi
cp -r ./backup/$1/fpgadrv.ko ~/workspace/driver/
if [$? -ne 0 ];then
echo "恢复备份的驱动失败"
return 0
else
echo "恢复备份的驱动成功"
fi
cp ./backup/$1/BOOT.BIN /run/media/mmcblk1p1/
if [$? -ne 0 ];then
echo "恢复备份的镜像BOOT.BIN失败"
return 0
else
echo "恢复备份的镜像BOOT.BIN成功"
fi
cp ./backup/$1/image.ub /run/media/mmcblk1p1/
if [$? -ne 0 ];then
echo "恢复备份镜像image.ub失败"
return 0
else
echo "恢复备份镜像image.ub成功"
fi
return 1
}
dev_type='FZ5C'
paddlelite_cmake_dir='/usr/local/lib/cmake/PaddleLite/'
paddlelite_include_dir='/usr/local/include/paddle_lite/'
paddlelite_lib_dir='/usr/local/lib/paddle_lite/'
if [ -d "/usr/local/lib/cmake/" ]; then
if [ ! -d "/usr/local/lib/cmake/PaddleLite/" ]; then
echo "创建 /usr/local/lib/cmake/PaddleLite/"
mkdir /usr/local/lib/cmake/PaddleLite
fi
cp ./PaddleLiteConfig.cmake "/usr/local/lib/cmake/PaddleLite/"
fi
if [ -d "/usr/lib/cmake/" ]; then
if [ ! -d "/usr/lib/cmake/PaddleLite/" ]; then
echo "创建 /usr/lib/cmake/PaddleLite/"
mkdir /usr/lib/cmake/PaddleLite
fi
cp ./PaddleLiteConfig.cmake "/usr/lib/cmake/PaddleLite/"
fi
if [ ! -d "$paddlelite_include_dir" ]; then
echo "创建 $paddlelite_include_dir"
mkdir $paddlelite_include_dir
fi
if [ ! -d "$paddlelite_lib_dir" ]; then
echo "创建 $paddlelite_include_dir"
mkdir $paddlelite_lib_dir
fi
backup $dev_type $paddlelite_include_dir $paddlelite_lib_dir
echo "------------------------------------------------------------------"
install $dev_type $paddlelite_include_dir $paddlelite_lib_dir
ret=$?
if [[ $ret == 0 ]]; then
echo "安装失败"
echo "------------------------------------------------------------------"
restore $dev_type
else
echo "安装成功"
fi
在“PaddleLiteSample”路径下,只有2个目录:
classification
detection这两个分别是基于resnet50的图片分类和基于yolo v3的物体检测,在后续的帖子中我会详细做出说明。
页:
[1]