nemon 发表于 2021-3-22 13:11:33

【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]
查看完整版本: 【EdgeBoard FZ5 边缘AI计算盒】简单的开一下机而已

Baidu
map