• 基于MiDas的深度估计算法移植与测试


    课程全程将在SOPHGO(算能)云平台上进行。
    本次课程将介绍:

    1. SOPHGO(算能)PCIE 云平台环境搭建
    2. MiDas的深度估计算法
    3. 通过BMNNSDK进行MiDas模型转换
    4. 实现算法的移植
    5. 部署和测试
    6. 相关链接

    版本环境: 本次课程使用的版本环境适配 SOPHON SDK V2.7.0 和 SOPHON SDK V3.0.0 版本,其他版本可能会出现不兼容的情况。目前课程的云环境版本是SOPHON SDK V2.7.0  

    1. SOPHGO(算能) PCIE 云平台环境搭建

    1.1. 开通云平台账号   

    参考:https://cloud.sophgo.com/tpu.pdf

    1.2. 开发环境初始化  

    1.2.1 进入命令行模式,进去默认在/home/sophgo目录  

     1.2.2 安装驱动  

    1. # 切换成root权限 sudo -i
    2. cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/scripts
    3. bash ./install_driver_pcie.sh

    执行ls /dev/bm*, 如果可以看到以下设备节点,表示驱动安装成功: 

    1.2.3 加载Docker,并初始化环境  

    1. apt install unzip
    2. cd /home/sophgo/bmnnsdk2-bm1684-ubuntu-docker-py37/
    3. docker load -i bmnnsdk2-bm1684-ubuntu.docker

    1.2.4 通过脚本创建Docker容器

    1. cd  /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
    2. bash ./docker_run_bmnnsdk.sh
    3. # 自动进入Docker容器
    4. cd /workspace/scripts && bash install_lib.sh nntc
    5. # 每次进入镜像都要source 
    6. source /workspace/scripts/envsetup_pcie.sh 
    7. #  安装sophon包
    8. pip3 install /workspace/lib/sail/python3/pcie/py37/sophon-2.7.0-py3-none-any.whl

    可以通过python3 -c "import sophon.sail" 来检查是否出现问题   

    1.2.5 通过云空间文件系统拷贝代码到Docker容器中

    打开云空间文件系统:   

    上传文件:文件会被存储在服务器的 /tmp 目录下  

     拷贝文件到Docker容器中: 
    Docker容器的workspace目录被映射到 /home/sophgo/bmnnsdk2-bm1684_v2.7.0/

    注意:本教程后续步骤均在Docker容器中进行 

    2. MiDas的深度估计算法  

    仓库链接: https://github.com/isl-org/MiDaS

    论文链接: https://arxiv.org/abs/1907.01341v3 

    hub链接: https://pytorch.org/hub/intelisl_midas_v2/ 

    MiDaS从单个图像计算相对逆深度。

    3. 通过BMNNSDK进行MiDas模型转换  

    3.1 下载项目文件 

    git clone https://github.com/sophgo/sophpi-shaolin
    

    3.2 准备推理的模型 

    1. cd MiDas/v2.7.0/scripts
    2. bash download_from_nas.sh

    3.3 生成FP32 BModel 

    BMNETP是针对pytorch的模型编译器,可以把pytorch的model直接编译成BMRuntime所需的执行指令。pytorch的模型在编译前要经过torch.jit.trace(见pytorch文档),trace后的模型才能用于编译。在编译模型的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。 可参考文档 https://doc.sophgo.com/docs/3.0.0/docs_latest_release/nntc/html/usage/bmneto.html

    执行以下命令转为bmodel并复制到测试路径

    bash gen_fp32bmodel.sh

    部分输出:

    3.4 查看模型相关信息   

    命令:bm_model.bin --info xxxx.bmodel

    bm_model.bin --info ../dataset/midas_s_fp32b1.bmodel

    命令:bmrt_test --bmodel xxxxxxx.bmodel

    bmrt_test --bmodel ../dataset/midas_s_fp32b1.bmodel

    3.5 分层量化: 生成INT8 BModel  

    int8 模型是原始fp32模型量化后得到的。量化是指将信号的连续取值近似为有限多个离散值的过程。可理解成一种信息压缩的方法。在计算机系统上考虑这个概念,一般用“低比特”来表示。 BM168X支持INT8量化模型的部署。在通用流程中,需要先借助于算能提供的量化工具对fp32模型进行量化。 ​Qantization-Tools 如下图所示,是算能科技自主开发的网络模型量化工具,它解析各种已训练好的32bit浮点网络模型,生成8bit的定点网络模型。该8bit定点网络模型,可用于算能科技SOPHON系列AI运算平台。在SOPHON运算平台上,网络各层输入、输出、系数都用8bit来表示,从而在保证网络精度的基础上,大幅减少功耗,内存,传输延迟,大幅提高运算速度。  

     量化的流程是:  

    • 使用量化数据集生成lmdb格式数据  
    • 生成FP32 umodel
    • 生成INT8 umodel
    • 精度测试 (可选)  
    • 生成INT8 bmodel


    SophonSDK v3.0版本中,提供了使用一键假数据实现量化,对应脚本gen_int8bmodelfake.sh  

    通过执行以下命令可以生成 INT8 bmodel (这里不涉及精度测试,过程用时较长)。  

    bash gen_int8bmodel.sh

    部分输出:

    4. 实现算法的移植

    要在x86 PCIe平台使用bm_opencv可添加环境变量如下:   
    export PYTHONPATH=$PYTHONPATH:$REL_TOP/lib/opencv/pcie/opencv-python/
     

    5. 部署和测试

    5.1 Python示例程序测试

    执行以下命令即可实现推理(路径已经在内部处理完毕)

    1. cd ../python
    2. # bmcv + FP32 BModel example
    3. python3 midas_bmcv_inference.py #BModel默认使用../dataset/midas_s_fp32b1.bmodel
    4. # opencv + INT8 BModel example
    5. python3 midas_opencv_inference.py --bmodel ../dataset/midas_s_int8b1.bmodel

    输出:

    bmcv + FP32 BModel:

     opencv + INT8 BModel:

     5.2 获得推理生成的图片

    注意: 由于是在Docker容器中,如果想要看到推理的可视化结果需要退出容器,并打开Docker容器映射的文件夹,在对应位置将图片拷贝到/tmp 文件夹下后可在云平台文件系统中下载。

    1. # 退出容器
    2. exit
    3. # 进入Docker容器映射的文件夹,即Docker容器中的 workspace/目录
    4. cd /home/sophgo/bmnnsdk2-bm1684_v2.7.0/
    5. # 打开midas项目, ${midas}即项目所在路径
    6. cd ${midas}/python
    7. # 拷贝需要的推理结果图片
    8. cp output.* /tmp/

    如图所示  

     查看color图:

    6. 相关链接   

    样例开源仓库:https://github.com/sophon-ai-algo/examples  
    BM1684 BMNNSDK文档:https://developer.sophgo.com/site/index/document/6/all.html   
    编译工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/nntc/html/index.html   
    量化工具用户开发手册: https://doc.sophgo.com/docs/2.7.0/docs_latest_release/calibration-tools/html/index.html  
    算能量化工具介绍及使用说明:https://www.bilibili.com/video/BV1DA4y1S75p?spm_id_from=333.999.0.0  
    官网视频教程:https://developer.sophgo.com/site/index/course/all/all.html  
    官网文档中心:https://developer.sophgo.com/site/index/document/all/all.html 
    官网下载中心:https://developer.sophgo.com/site/index/material/all/all.html  
    官网论坛:https://developer.sophgo.com/forum/view/43.html 

  • 相关阅读:
    大型数据中心云平台建设中网络的知识及实践
    Solidity 小白教程:16. 函数重载
    Git-Lab私域共享代码
    Jsp基础了解(一)
    二项队列----数据结构与算法分析6.8
    【RCNN系列】Fast RCNN论文总结
    若依框架前后端打包到linux部署,踩坑
    【合集】Spring Cloud 组件——架构进化史话 & Nacos,OpenFeign,Ribbon,Sentinel,Gateway . . .
    servlet中doGet方法无法读取body中的数据
    libyuv 再次封装打包与测试
  • 原文地址:https://blog.csdn.net/lily_19861986/article/details/127403716