🌀Jarson Cai's Blog
头脑是日用品,不是装饰品
算能(Sophon)sdk部署:以SE5为例
国产化sdk(算能)算法迁移部署

Sophon(算能):SE5 SDK部署

算能官方提供的开发者文档:https://doc.sophgo.com/sdk-docs/v23.05.01/docs_latest_release/docs/SophonSDK_doc/zh/html/index.html

设备信息

目前拿到的盒子型号为SE5,主要参数如下:

  • 4GB A53(cpu)专用
  • 4GB TPU(张量处理器)专用(BM)
  • 4GB VPU(编解码)专用

盒子与加速卡不同,其走的Soc模式,其Host Memory代表芯片主控上的内存,而Device Memory则是代表划分给TPU/VPU的内存。

算力信息

  • AI算力:INT8为17.6 TOPS,FP32为2.2 TFLOPs

  • 支持的视频解码能力:H.264 & H.265: 1080P @960fps

  • 支持的视频解码分辨率:8192 * 8192 / 8K / 4K / 1080P / 720P / D1 / CIF

  • 支持的视频编码能力: H.264 & H.265: 1080P @50fps

  • 视频编码分辨率:4K / 1080P / 720P / D1 / CIF

  • 图片解码能力:JPEG:480张/秒 @1080P

环境配置(Soc)

tpu-nntc环境供用户在x86主机上进行模型的编译量化,提供了libsophon环境供用户进行应用的开发部署。PCIe用户可以基于tpu-nntc和libsophon完成模型的编译量化与应用的开发部署; SoC用户可以在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译,部署时将编译好的程序拷贝至SoC平台(SE微服务器/SM模组)中执行。

开发环境配置

因为最后运行的环境为soc平台,以及需要完成对摄像头的拉流、模型推理。开发平台需要的开发环境为交叉编译环境。需要先在x86_64架构上的主机配置交叉编译环境。

环境要求:Linux系统(Ubuntu)、x86_64架构、能连接外网(互联网)

  • 下载交叉编译工具链:
1
$ apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 
  • 验证工具链:
1
2
$ which aarch64-linux-gnu-g++
# 终端输出 /usr/bin/aarch64-linux-gnu-g++
  • 配置pipeline交叉编译需要的libsophonsophon-opencvsophon-ffmpeg:

具体参考https://github.com/sophgo/sophon-pipeline/blob/release/docs/docs_zh/arm_soc.md

但是按照这个教程集成的soc-sdk有问题,联系了厂商那边,给出了它们配置的soc-sdk包,看到里面除了上面需要的库,还增加了厂商封装的AI加速库sail

这样开发环境就配置好了!

运行环境配置

SE5属于soc平台,内部已经集成了libsophonsophon-opencvsophon-ffmpeg环境,在/opt/sophon/下。

配置环境变量即可:

1
2
3
4
$ vim ~/.bashrc
# 加入以下内容保存 x.y.z代表版本,不知道的可以自己进目录看一下
export PYTHONPATH=$PYTHONPATH:/opt/sophon/sophon-opencv_<x.y.z>/opencv-python 
$ source ~/.bashrc

网络模型移植

BModel

  • BModel是一种面向算能TPU处理器的深度神经网络模型文件格式,其中包含目标网络的权重(weight)、TPU指令流等等。

  • Stage是支持将同一个网络的不同batch size的模型combine为一个BModel;同一个网络的不同batch size的输入对应着不同的stage,推理时BMRuntime会根据输入shape的大小自动选择相应stage的模型。也支持将不同的网络combine为一个BModel,通过网络名称来获取不同的网络。

  • 动态编译和静态编译: 支持模型的动态编译和静态编译,可在转换模型时通过参数设定。动态编译的BModel,在Runtime时支持任意小于编译时设置的shape的输入shape;静态编译的BModel,在Runtime时只支持编译时所设置的shape。

模型转化工具链

算丰系列TPU平台只支持BModel模型加速。所以需要先将模型转化为BModel。

常用的PytorchONNX模型的转化为BModel都有版本的要求:

  • ONNX要求:onnx==1.7.0(Opset Version == 12)onnxruntime == 1.3.0 protobuf >= 3.8.0

  • Pytorch要求:pytorch >= 1.3.0, 建议1.8.0

TPU-NNTC工具链帮助实现模型迁移。对于BM1684平台来说,它既支持float32模型,也支持int8量化模型。其模型转换流程以及章节介绍如图:

如果需要运行in8 BModel,需要先准备量化数据集、将原始模型转换为fp32 UModel、再使用量化工具量化为int8 UModel、最后使用bmnetu编译为int8 BModel。

具体的INT8流程如下:

  • Parse-Tools:

解析各深度学习框架下已训练好的网络模型,生成统一格式的网络模型文件—umodel, 支持的深度学习框架包括: Caffe、TensorFlow、MxNet、PyTorch、Darknet、ONNX以及PaddlePaddle。

  • Calibration-Tools:

分析float32格式的umodel文件,默认基于熵损失最小算法(可选MAX等其他算法),将网络系数定点化成8bit,最后 将网络模型保存成int8格式的umodel文件。

  • U-FrameWork:

自定义的深度学习推理框架,集合了各开源深度学习框架的运算功能,提供的功能包括:

  1. 作为基础运算平台,为定点化提供基础运算。

  2. 作为验证平台,可以验证fp32,int8格式的网络模型的精度。

  3. 作为接口,通过bmnetu,可以将int8umodel编译成能在SOPHON运算平台上运行的bmodel。

更为具体的,如量化数据集的格式要求、如何进行精度测试和调优可以详细参考官方开发文档!

算法移植

对于基于深度学习的视频/图片分析任务来说,通常都包括如下几个步骤:

  1. 视频/图片解码
  2. 输入预处理
  3. 模型推理
  4. 输出后处理
  5. 视频/图片编码

实际任务中,算法往往还会包含多个不同神经网络模型,因此,步骤2-4会根据需要反复执行多次。

硬件加速支持

SophonSDK提供了视频/图片解码输入预处理模型推理输出后处理视频/图片编码五个阶段的加速。

为了提高算法的效率,在编写代码和使用接口的时候需要注意这几个方面:

  • 内存零copy
  • 申请物理连续内存
  • 将多个预处理步骤进行合并
  • 凑4batch进行推理

编程接口

目前支持C/C++/Python三种编程接口。BMRuntime模块支持C/C++接口编程,BMCV、BMLib支持C接口编程;Python/C++编程接口基于SAIL库实现。目前, SAIL 模块中所有的类、枚举、函数都在 “sail” 命名空间下。

常见算法的开发示例可以参考官方提供的demo:https://github.com/sophgo/sophon-demo/

常见的处理视频流的开发示例可以参考官方提供的pipeline:https://github.com/sophgo/sophon-pipeline

编译运行实例

参考的代码:https://github.com/sophgo/sophon-pipeline

  • 运行环境编译整个repo的代码:
1
2
3
4
5
6
$ git clone https://github.com/sophgo/sophon-pipeline
$ cd sophon-pipeline
# 编译需要SoC平台上运行的程序 soc-sdk填入开发环境配置阶段配置好的soc-sdk包的绝对地址
$ ./tools/compile.sh soc ${soc-sdk}
# 这样我们就可以在`sophon-pipeline/release`中找到所要所要算法生成的可执行文件
# 以yolov5s为例,其路径为`sophon-pipeline/release/yolov5s_demo/`下
  • 需要拷贝的文件包括:模型(必须是Bmodel的格式)、流视频地址或者.h264或者.h265格式的视频文件、在编译生成的目录下的json配置文件和包含可执行程序的soc文件夹。
  • 将其全部放到盒子内部的同一目录下 ,修改json配置文件:

主要配置两个参数,第一个是视频的地址、第二个是模型的地址,其他可以按需配置。具体配置含义信息可参考https://github.com/sophgo/sophon-pipeline/blob/release/docs/docs_zh/yolov5.md

  • 注意修改可执行文件的权限,然后运行demo:
1
2
3
4
5
6
7
8
$ ./soc/yolov5s_demo --config=./cameras_yolov5.json
# 打印下面的信息就说明成功了
...
[2022-10-13:16:00:26] total fps =nan,ch=0: speed=nan
[2022-10-13:16:00:27] total fps =24.0,ch=0: speed=24.0
[2022-10-13:16:00:28] total fps =24.0,ch=0: speed=24.0
[2022-10-13:16:00:29] total fps =25.4,ch=0: speed=25.4
...

RTSP视频流输出画面

算能为sophon_pipeline准备了可视化工具pipeline_client。由于本次是在ubuntu上启动客户端,编译相对简单。

  • 下载pipeline_client代码:
1
git clone https://github.com/sophon-ai-algo/pipeline_client.git
  • 下载相关依赖:
1
2
3
4
 sudo apt install qtbase5-dev
 sudo apt install libopencv-dev
 sudo apt install ffmpeg
 sudo apt install libavfilter-dev
1
2
3
4
5
6
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
$ cd ..
$ ./build/bin/pipeline_client # 启动客户端

系统会出现类似于如下的客户端画面:

  • RTSP需要配合一个rtsp server使用,先推流到rtsp serverpipeline_client再拉流获取画面。使用官网推荐的rtsp server:https://github.com/bluenviron/mediamtx/releases,注意Linux x86_64机器需要选择下面这个包:

  • 现在rtsp serverpipeline_clientsophon_pipeline都已经准备完毕,接下来就可以测试输出画面了(注意sophon_pipeline在盒子端,rtsp serverpipeline_client在交叉编译端):
    • 在交叉编译端启动rtsp server,解压下好的文件,并执行./mediamtx,默认端口为8544,如果修改端口,则需要修改其中的配置文件mediamtx.yml文件,必须要确保启动的端口没有被其他应用占用。
    • 运行sophon-pipeline例程程序,推流到指定rtsp地址:将编译好的配置文件cameras_yolov5.json的参数配置改为rtsp://${ip}:8544/abc,这里的ip是指交叉编译机器的ip地址。
    • 运行pipeline_client,指定拉流地址为rtsp://${ip}:8554/abc,如果pipeline_clientrtsp server在一个机子上,ip可以直接用127.0.0.1或者//localhost代替。
    • 稍等片刻,则可以看见画面。

最后修改于 2023-09-12

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。