回答

收藏

【EdgeBoard FZ5 边缘AI计算盒】简单的开一下机而已

人工智能 人工智能 2175 人阅读 | 0 人回复 | 2021-03-22

本帖最后由 nemon 于 2021-3-22 13:49 编辑

上次说到,随FZ5C附有一个TF卡,考虑到在我胡折腾的时候,有可能心不在焉的敲出“rm -f /”的经典名句,所以最好还是有个备份。用读卡器加载后拷贝文件是不能备份整个系统滴,可以看到:完全不靠谱
  1. <font face="微软雅黑" size="2">G:\新建文件夹\可移动磁盘>tree/?
  2. 以图形显示驱动器或路径的文件夹结构。

  3. TREE [drive:][path] [/F] [/A]

  4.    /F   显示每个文件夹中文件的名称。
  5.    /A   使用 ASCII 字符,而不使用扩展字符。


  6. G:\新建文件夹\可移动磁盘>tree /F
  7. 文件夹 PATH 列表
  8. 卷序列号为 C293-7256
  9. G:.
  10. │  atolr.exe
  11. │  BOOT.BIN
  12. │  image.ub
  13. │  README.txt

  14. ├─.fseventsd
  15. │      fseventsd-uuid

  16. └─.Spotlight-V100
  17.     │  VolumeConfiguration.plist
  18.     │
  19.     ├─Store-V1
  20.     │      VolumeConfig.plist
  21.     │
  22.     └─Store-V2
  23.         └─C437081A-2883-4684-81E0-57D8AD5D68BB
  24.             │  .store.db
  25.             │  0.directoryStoreFile
  26.             │  0.directoryStoreFile.shadow
  27.             │  0.indexArrays
  28.             │  0.indexBigDates
  29.             │  0.indexCompactDirectory
  30.             │  0.indexDirectory
  31.             │  0.indexGroups
  32.             │  0.indexHead
  33.             │  0.indexIds
  34.             │  0.indexPositions
  35.             │  0.indexPostings
  36.             │  0.indexUpdates
  37.             │  0.shadowIndexGroups
  38.             │  0.shadowIndexHead
  39.             │  Cab.created
  40.             │  indexState
  41.             │  journalAttr.1
  42.             │  journalExclusion
  43.             │  Lion.created
  44.             │  live.0.directoryStoreFile
  45.             │  live.0.directoryStoreFile.shadow
  46.             │  live.0.indexArrays
  47.             │  live.0.indexBigDates
  48.             │  live.0.indexCompactDirectory
  49.             │  live.0.indexDirectory
  50.             │  live.0.indexGroups
  51.             │  live.0.indexHead
  52.             │  live.0.indexIds
  53.             │  live.0.indexPositions
  54.             │  live.0.indexPositionTable
  55.             │  live.0.indexPostings
  56.             │  live.0.indexTermIds
  57.             │  live.0.indexUpdates
  58.             │  live.0.shadowIndexArrays
  59.             │  live.0.shadowIndexCompactDirectory
  60.             │  live.0.shadowIndexDirectory
  61.             │  live.0.shadowIndexGroups
  62.             │  live.0.shadowIndexHead
  63.             │  live.0.shadowIndexPositionTable
  64.             │  live.0.shadowIndexTermIds
  65.             │  psid.db
  66.             │  reverseDirectoryStore
  67.             │  reverseDirectoryStore.shadow
  68.             │  reverseStore.updates
  69.             │  shutdown_time
  70.             │  store.db
  71.             │  store.updates
  72.             │  store_generation
  73.             │  tmp.Cab
  74.             │  tmp.Lion
  75.             │  tmp.SnowLeopard
  76.             │  tmp.spotlight.loc
  77.             │  tmp.spotlight.state
  78.             │
  79.             ├─journals.assisted_import_post
  80.             ├─journals.assisted_import_pre
  81.             ├─journals.corespotlight
  82.             ├─journals.health_check
  83.             ├─journals.live
  84.             ├─journals.live_priority
  85.             ├─journals.live_system
  86.             ├─journals.live_user
  87.             ├─journals.migration
  88.             ├─journals.migration_secondchance
  89.             └─journals.scan
  90.                     retire.7</font>
复制代码

于是找了两个小工具。第一个工具用来备份:
USB Duplicator Image Creator.rar (224.83 KB, 下载次数: 0)

第二个工具用来恢复(希望用不上):
USB Duplicator Image Writer.rar (226.5 KB, 下载次数: 1)

专用工具就是好,顺利的备出来三十多G的映像,压缩完5个多G:
  1. <font face="微软雅黑" size="2">G:\新建文件夹>dir
  2. 驱动器 G 中的卷没有标签。
  3. 卷的序列号是 C293-7256

  4. G:\新建文件夹 的目录

  5. 2021-03-12  18:30    <DIR>          .
  6. 2021-03-12  18:30    <DIR>          ..
  7. 2021-03-12  09:14     5,740,672,715 FZ5-baidu-20210308.7z
  8. 2021-03-12  08:38    31,914,983,424 FZ5-baidu-20210308.img</font>
复制代码
然后就可以放心大胆的搞了,接上dp转VGA和显示器,直接把usb键盘插到盒子上,再接上电源,一台3500块软妹币的linux台式机就启动了,想想这配置就觉得奢侈。

从加电到出现“openembedded”大约需要12秒,之后直接进入到文本控制台,不需要登录。

从视频中可以看到在workspace下,有3个文件夹:
  1. <font face="微软雅黑" size="2">FZ5C_install_1.5.1
  2. PaddleLiteSample
  3. 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”就是安装文件,内容如下:
  1. #!/usr/bin/env sh

  2. backup() {
  3.         echo "开始进行$dev_type安装前备份"

  4.         if [ ! -d "/backup" ]; then
  5.                 rm -rf backup
  6.         fi

  7.         mkdir backup
  8.         for file in `ls $paddlelite_lib_dir`
  9.         do
  10.             if [[ $file =~ ^libpaddle_full_api_shared.so ]];then
  11.                     cp $3/$file ./backup/
  12.                         if [  $? -ne 0 ];then
  13.                                 echo "备份${file}到./backup/失败"
  14.                                 return 0
  15.                         else
  16.                             echo "备份${file}到./backup/"
  17.                         fi               
  18.             fi
  19.         done

  20.         mkdir ./backup/include
  21.         cp $2/paddle_*  ./backup/include
  22.         if [  $? -ne 0 ];then
  23.                 echo "备份libpaddle_full_api_shared.so头文件到./backup/include/目录失败"
  24.                 return 0
  25.         else
  26.                   echo "成功备份libpaddle_full_api_shared.so头文件到./backup/include/目录"  
  27.         fi

  28.         mkdir ./backup/$1/
  29.         cp ~/workspace/driver/fpgadrv.ko ./backup/$1/
  30.         if [  $? -ne 0 ];then
  31.                 echo "备份fpgadrv.ko到./backup/${1}/目录失败"
  32.                 return 0
  33.         else
  34.                   echo "成功备份fpgadrv.ko到./backup/${1}/目录"  
  35.         fi

  36.         cp /run/media/mmcblk1p1/BOOT.BIN ./backup/$1/
  37.         if [  $? -ne 0 ];then
  38.                 echo "备份BOOT.BIN到./backup/${1}/目录失败"
  39.                 return 0
  40.         else
  41.                   echo "成功备份BOOT.BIN到./backup/${1}/目录"  
  42.         fi

  43.         cp /run/media/mmcblk1p1/image.ub ./backup/$1/
  44.         if [  $? -ne 0 ];then
  45.                 echo "备份image.ub到./backup/${1}/目录失败"
  46.                 return 0
  47.         else
  48.                   echo "成功备份image.ub到./backup/${1}/目录"  
  49.         fi

  50.         echo "备份完成"

  51.         return 1
  52. }

  53. install() {
  54.         echo "开始进行$dev_type安装"

  55.         for file in `ls $3`
  56.         do
  57.             if [[ $file =~ ^libpaddle_full_api_shared.so ]];then
  58.                     rm $3/$file
  59.                         if [  $? -ne 0 ];then
  60.                                 echo -e "删除已经安装${file}失败"
  61.                                 return 0
  62.                         else
  63.                             echo -e "删除已经安装${file}成功"
  64.                         fi               
  65.             fi
  66.         done

  67.         for file in `ls .`
  68.         do
  69.             if [[ $file =~ ^libpaddle_full_api_shared.so.[0-9].[0-9].[0-9] ]];then
  70.                     cp ./libpaddle_full_api_shared.so* $3
  71.         
  72.                         if [  $? -ne 0 ];then
  73.                                 echo -e "安装新版${file}失败"
  74.                                 return 0
  75.                         else
  76.                             echo -e "成功安装新版${file}"
  77.                         fi
  78.         
  79.                 ln -r $3/$file $3/libpaddle_full_api_shared.so --symbolic
  80.                 if [  $? -ne 0 ];then
  81.                             echo -e "创建${file}软链到libpaddle_full_api_shared.so失败"
  82.                             return 0
  83.                         else
  84.                                 echo -e "成功创建${file}软链到libpaddle_full_api_shared.so"
  85.                         fi                                
  86.             fi
  87.         done

  88.         cp -r ./include/* $2
  89.         if [  $? -ne 0 ];then
  90.             echo -e "安装新版libpaddle_full_api_shared.so头文件失败"
  91.             return 0
  92.         else
  93.                 echo -e "成功安装新版libpaddle_full_api_shared.so头文件"
  94.         fi

  95.         cp -r ./$1/fpgadrv.ko ~/workspace/driver/
  96.         if [  $? -ne 0 ];then
  97.             echo -e "安装新版驱动失败"
  98.             return 0
  99.         else
  100.                 echo -e "成功安装新版驱动"
  101.         fi

  102.         cp ./$1/BOOT.BIN /run/media/mmcblk1p1/
  103.         if [  $? -ne 0 ];then
  104.                 echo -e "安装新版镜像BOOT.BIN失败"
  105.                 return 0
  106.         else
  107.             echo -e "成功安装新版镜像BOOT.BIN"
  108.         fi

  109.         cp ./$1/image.ub /run/media/mmcblk1p1/
  110.         if [  $? -ne 0 ];then
  111.                 echo -e "安装新版镜像image.ub失败"
  112.                 return 0
  113.         else
  114.             echo -e "成功安装新版镜像image.ub"
  115.         fi

  116.         return 1
  117. }

  118. restore() {
  119.         echo "安装失败开始进行$dev_type恢复"

  120.         for file in `ls $3`
  121.         do
  122.             if [[ $file =~ ^libpaddle_full_api_shared.so ]];then
  123.                     rm $3/$file
  124.                         if [  $? -ne 0 ];then
  125.                                 echo "删除已经安装${file}失败"
  126.                                 return 0
  127.                         else
  128.                             echo "删除已经安装${file}成功"
  129.                         fi               
  130.             fi
  131.         done

  132.         for file in `ls ./backup/`
  133.         do
  134.             if [[ $file =~ ^libpaddle_full_api_shared.so.[0-9].[0-9].[0-9] ]];then
  135.                     cp ./backup/$file $3
  136.                         if [  $? -ne 0 ];then
  137.                                 echo "恢复备份的${file}失败"
  138.                                 return 0
  139.                         else
  140.                             echo "恢复备份的${file}成功"
  141.                         fi

  142.                 ln -r $3/$file $3/libpaddle_full_api_shared.so --symbolic
  143.                 if [  $? -ne 0 ];then
  144.                             echo "创建${file}软链到libpaddle_full_api_shared.so失败"
  145.                             return 0
  146.                         else
  147.                                 echo "成功创建${file}软链到libpaddle_full_api_shared.so"
  148.                         fi                                
  149.             fi
  150.         done

  151.         cp -r ./backup/include/* $2
  152.         if [  $? -ne 0 ];then
  153.             echo "恢复备份的libpaddle_full_api_shared.so头文件失败"
  154.             return 0
  155.         else
  156.                 echo "恢复备份的libpaddle_full_api_shared.so头文件成功"
  157.         fi

  158.         cp -r ./backup/$1/fpgadrv.ko ~/workspace/driver/
  159.         if [  $? -ne 0 ];then
  160.             echo "恢复备份的驱动失败"
  161.             return 0
  162.         else
  163.                 echo "恢复备份的驱动成功"
  164.         fi

  165.         cp ./backup/$1/BOOT.BIN /run/media/mmcblk1p1/
  166.         if [  $? -ne 0 ];then
  167.                 echo "恢复备份的镜像BOOT.BIN失败"
  168.                 return 0
  169.         else
  170.             echo "恢复备份的镜像BOOT.BIN成功"
  171.         fi

  172.         cp ./backup/$1/image.ub /run/media/mmcblk1p1/
  173.         if [  $? -ne 0 ];then
  174.                 echo "恢复备份镜像image.ub失败"
  175.                 return 0
  176.         else
  177.             echo "恢复备份镜像image.ub成功"
  178.         fi
  179.         return 1
  180. }

  181. dev_type='FZ5C'

  182. paddlelite_cmake_dir='/usr/local/lib/cmake/PaddleLite/'
  183. paddlelite_include_dir='/usr/local/include/paddle_lite/'
  184. paddlelite_lib_dir='/usr/local/lib/paddle_lite/'

  185. if [ -d "/usr/local/lib/cmake/" ]; then
  186.         if [ ! -d "/usr/local/lib/cmake/PaddleLite/" ]; then
  187.                 echo "创建 /usr/local/lib/cmake/PaddleLite/"
  188.                 mkdir /usr/local/lib/cmake/PaddleLite
  189.         fi
  190.         cp ./PaddleLiteConfig.cmake "/usr/local/lib/cmake/PaddleLite/"
  191. fi

  192. if [ -d "/usr/lib/cmake/" ]; then
  193.         if [ ! -d "/usr/lib/cmake/PaddleLite/" ]; then
  194.                 echo "创建 /usr/lib/cmake/PaddleLite/"
  195.                 mkdir /usr/lib/cmake/PaddleLite
  196.         fi
  197.         cp ./PaddleLiteConfig.cmake "/usr/lib/cmake/PaddleLite/"
  198. fi


  199. if [ ! -d "$paddlelite_include_dir" ]; then
  200.                 echo "创建 $paddlelite_include_dir"
  201.                 mkdir $paddlelite_include_dir
  202. fi

  203. if [ ! -d "$paddlelite_lib_dir" ]; then
  204.                 echo "创建 $paddlelite_include_dir"
  205.                 mkdir $paddlelite_lib_dir
  206. fi

  207. backup $dev_type $paddlelite_include_dir $paddlelite_lib_dir


  208. echo "------------------------------------------------------------------"

  209. install $dev_type $paddlelite_include_dir $paddlelite_lib_dir
  210. ret=$?

  211. if [[ $ret == 0 ]]; then
  212.         echo "安装失败"
  213.         echo "------------------------------------------------------------------"
  214.         restore $dev_type
  215. else
  216.         echo "安装成功"
  217. fi


复制代码
在“PaddleLiteSample”路径下,只有2个目录:
  1. classification
  2. detection
复制代码
这两个分别是基于resnet50的图片分类和基于yolo v3的物体检测,在后续的帖子中我会详细做出说明。











分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条