(三)Open Explorer

什么是OE
OE是Open Explorer的缩写简称,中文名为天工开物(以下简称OE),它是基于地平线自研计算平台打造的全生命周期开发平台, 主要包括模型编译优化工具集、算法仓库和应用开发SDK三大功能模块。基于这三大功能模块开发的应用参考解决方案,为智能驾驶、智能物联网等行业方案提供了案例支撑。

- 模型编译优化工具集:聚焦于智能业务场景,包括完成算法模型转换与编译流程中所涉及到的一系列软件工具集,提供模型量化、优化、编译、调试等功能。
- 算法仓库:贴合时下智驾领域的基础算法结构,和重点业务算法技术点,地平线提供了丰富的开源最佳实践,赋能地平线合作伙伴更快、更省地开发出自己的智能产品。
- 应用开发SDK:提供丰富的基础接口与工具,支撑业务算法在征程平台的部署,可以完整支撑客户在仿真和物理环境下的部署全流程。
OE可以为地平线合作伙伴提供丰富多样的算法资源、灵活高效的开发工具和简单易用的开发框架。 OE的特色和优势可以概括为以下四个方面:

工具链
地平线J5算法工具链(以下简称工具链)是一套完整的边缘计算平台算法落地解决方案,可以帮助您把浮点模型量化为定点模型, 并在地平线计算平台上快速部署自研算法模型。
目前在GPU上训练的模型大部分都是浮点模型,即参数使用的是float类型存储。地平线BPU架构的计算平台使用的是int8的计算精度(业内计算平台的通用精度),能运行定点量化模型。
从训练出的浮点精度转为定点模型的过程,我们称之为量化。同时模型量化后能够有效减少模型大小,加速深度学习推理的速度,因此也在学术界和工业界被广泛研究和应用。
依据是否要对量化后的参数进行调整,我们可以将量化方法分为训练后量化(PTQ)和量化感知训练(QAT)。 这两种方法的操作区别如下图所示(图左为PTQ,图右为QAT):

训练后量化PTQ是使用一批校准数据对训练好的模型进行校准,将训练过的FP32模型直接转换为定点计算的模型,过程中无需对原始模型进行任何训练,只需要对几个超参数进行调整就可以完成量化过程, 且过程简单快速,无需训练,因此该方法已被广泛地应用于大量的端侧和云侧部署场景。
量化感知训练QAT是将训练过的模型量化后又再进行重训练。由于定点数值无法用于反向梯度计算,实际操作过程是在某些OP前插入伪量化节点(fake quantization nodes), 用于在训练时获取流经该OP的数据的截断值,便于在部署量化模型时对节点进行量化时进行使用。需要在训练中通过不断优化精度来获取最佳的量化参数。
工具链由PTQ、QAT和嵌入式编译等部分组成,工具链组成示意图如下:

其中:
Runtime SDK 提供了异构模型的运行库支持,运行库包含arm和x86两个部分,分别用于在地平线计算平台和X86仿真平台执行异构模型。
工具链的整体使用流程如下图所示。

关键概念
-
原始浮点模型
指通过TensorFlow/PyTorch等等DL框架训练得到的可用模型,这个模型的计算精度为float32。
-
混合异构模型
是一种适合在地平线计算平台上运行的模型格式,之所以被称为异构模型是因为它能够支持模型同时在ARM CPU和BPU上执行。 由于在BPU上的运算速度会远大于CPU上的速度,因此会尽可能的将算子放在BPU上运算。对于BPU上暂时不支持的算子,则会放在CPU上进行运算。
-
hbm文件
即Horizon BPU Model,HBDK编译器生成的模型文件,hbm包含BPU指令、模型参数、输入输出描述等信息。
-
算子
深度学习算法由计算单元组成,我们称这些计算单元为算子(Operator,也称op)。 算子是一个函数空间到函数空间上的映射,同一模型中算子名称是唯一的,但是同一类型的算子可以存在多个。 如:Conv1、Conv2,是两个算子类型相同的不同算子。
-
模型转换
指的是将原始浮点模型或QAT转换得到的onnx模型转换为地平线混合异构模型的过程。
-
模型量化
目前工业界最有效的模型优化方法之一,量化是指定点与浮点等数据之间建立一种数据映射关系,使得以较小的精度损失代价获得了推理性能收益,可简单理解为用"低比特"数字表示FP32等数值,如FP32-->INT8可以实现4倍的参数压缩,在压缩内存的同时可以实现更快速的计算。
-
PTQ
即训练后量化方案,先训练浮点模型,然后使用校准图片计算量化参数,将浮点模型转为量化模型的量化方法。更详细的介绍可参考 PTQ、QAT简介 章节。
-
QAT
即量化感知训练方案,在浮点训练的时候,就先对浮点模型结构进行干预,使得模型能够感知到量化带来的损失,减少量化损失精度的方案。更详细的介绍可参考 PTQ、QAT简介 章节。
-
张量
张量,也称Tensor,具备统一数据类型的多维数组,作为算子计算数据的容器,包含输入输出数据。 张量具体信息的载体,包含张量数据的名称、shape、数据排布、数据类型等内容。
-
数据排布
深度学习中,多维数据通过多维数组(张量)进行存储,通用的神经网络特征图通常使用四维数组(即4D)格式进行保存,即以下四个维度:
- N:Batch数量,如图片的数量。
- H:Height,图片的高度。
- W:Width,图片的宽度。
- C:Channel,图片的通道数。
但是数据只能线性存储,因此四个维度有对应的顺序,不同的数据排布(format)方式,会显著影响计算性能。 常见的数据存储格式有NCHW和NHWC两种:
-
- NCHW:将同一通道的所有像素值按顺序进行存储。
-
- NHWC:将不同通道的同一位置的像素值按顺序进行存储。
如下图所示:

- 数据类型
下文常用到的图片数据类型包括rgb、bgr、gray、yuv444、nv12、featuremap。- rgb、bgr和gray都是比较常见的图像格式,每个数值都采用UINT8表示。
- yuv444也是一种常见的图像格式,它的每个数值都采用UINT8表示。
- nv12是常见的yuv420图像格式,每个数值都采用UINT8表示。
- featuremap适用于以上列举格式不满足您需求的情况,此type每个数值采用float32表示。例如雷达和语音等模型处理就常用这个格式。
Open Explorer 安装
Open Explorer 安装硬件要求
| 硬件/操作系统 | 要求 |
|---|---|
| CPU | CPU I3以上或者同级别E3/E5的处理器 |
| 内存 | 16G或以上级别 |
| GPU | CUDA11.6、驱动版本Linux:>= 510.39.01* (推荐驱动版本Linux:515.76) |
| 系统 | Ubuntu 20.04 |
Open Explorer 安装
Open Explorer 依赖安装
bash
#安装 Docker
sudo apt install docker.io
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
bridge-utils containerd git git-man liberror-perl pigz runc ubuntu-fan
Suggested packages:
ifupdown aufs-tools btrfs-progs cgroupfs-mount | cgroup-lite debootstrap docker-buildx docker-compose-v2 docker-doc rinse zfs-fuse | zfsutils git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb
git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
bridge-utils containerd docker.io git git-man liberror-perl pigz runc ubuntu-fan
0 upgraded, 9 newly installed, 0 to remove and 341 not upgraded.
Need to get 76.8 MB of archives.
After this operation, 339 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 pigz amd64 2.4-1 [57.4 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu focal/main amd64 bridge-utils amd64 1.6-2ubuntu1 [30.5 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 runc amd64 1.1.12-0ubuntu2~20.04.1 [8,066 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 containerd amd64 1.7.24-0ubuntu1~20.04.2 [33.6 MB]
Get:5 http://us.archive.ubuntu.com/ubuntu focal-updates/universe amd64 docker.io amd64 26.1.3-0ubuntu1~20.04.1 [29.5 MB]
Get:6 http://us.archive.ubuntu.com/ubuntu focal/main amd64 liberror-perl all 0.17029-1 [26.5 kB]
Get:7 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 git-man all 1:2.25.1-1ubuntu3.14 [887 kB]
Get:8 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 git amd64 1:2.25.1-1ubuntu3.14 [4,613 kB]
Get:9 http://us.archive.ubuntu.com/ubuntu focal-updates/main amd64 ubuntu-fan all 0.12.13ubuntu0.1 [34.4 kB]
Fetched 76.8 MB in 50s (1,536 kB/s)
Preconfiguring packages ...
Selecting previously unselected package pigz.
(Reading database ... 157243 files and directories currently installed.)
Preparing to unpack .../0-pigz_2.4-1_amd64.deb ...
Unpacking pigz (2.4-1) ...
Selecting previously unselected package bridge-utils.
Preparing to unpack .../1-bridge-utils_1.6-2ubuntu1_amd64.deb ...
Unpacking bridge-utils (1.6-2ubuntu1) ...
Selecting previously unselected package runc.
Preparing to unpack .../2-runc_1.1.12-0ubuntu2~20.04.1_amd64.deb ...
Unpacking runc (1.1.12-0ubuntu2~20.04.1) ...
Selecting previously unselected package containerd.
Preparing to unpack .../3-containerd_1.7.24-0ubuntu1~20.04.2_amd64.deb ...
Unpacking containerd (1.7.24-0ubuntu1~20.04.2) ...
Selecting previously unselected package docker.io.
Preparing to unpack .../4-docker.io_26.1.3-0ubuntu1~20.04.1_amd64.deb ...
Unpacking docker.io (26.1.3-0ubuntu1~20.04.1) ...
Selecting previously unselected package liberror-perl.
Preparing to unpack .../5-liberror-perl_0.17029-1_all.deb ...
Unpacking liberror-perl (0.17029-1) ...
Selecting previously unselected package git-man.
Preparing to unpack .../6-git-man_1%3a2.25.1-1ubuntu3.14_all.deb ...
Unpacking git-man (1:2.25.1-1ubuntu3.14) ...
Selecting previously unselected package git.
Preparing to unpack .../7-git_1%3a2.25.1-1ubuntu3.14_amd64.deb ...
Unpacking git (1:2.25.1-1ubuntu3.14) ...
Selecting previously unselected package ubuntu-fan.
Preparing to unpack .../8-ubuntu-fan_0.12.13ubuntu0.1_all.deb ...
Unpacking ubuntu-fan (0.12.13ubuntu0.1) ...
Setting up runc (1.1.12-0ubuntu2~20.04.1) ...
Setting up liberror-perl (0.17029-1) ...
Setting up bridge-utils (1.6-2ubuntu1) ...
Setting up pigz (2.4-1) ...
Setting up git-man (1:2.25.1-1ubuntu3.14) ...
Setting up containerd (1.7.24-0ubuntu1~20.04.2) ...
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/containerd.service.
Setting up ubuntu-fan (0.12.13ubuntu0.1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/ubuntu-fan.service → /lib/systemd/system/ubuntu-fan.service.
Setting up docker.io (26.1.3-0ubuntu1~20.04.1) ...
Adding group `docker' (GID 135) ...
Done.
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
Setting up git (1:2.25.1-1ubuntu3.14) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3.20) ...
sudo groupadd docker
groupadd: group 'docker' already exists
sudo gpasswd -a ${USER} docker
Adding user openexplorer to group docker
sudo service docker restart
Open Explorer 安装
bash
wget --header="Authorization: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" --content-disposition https://developer.horizon.auto/api/document/resource/611453259936546816
sudo docker load -i docker_openexplorer_ubuntu_20_j5_cpu_v1.1.77.tar.gz
d543b8cad89e: Loading layer [==================================================>] 75.16MB/75.16MB
f4eca5ce0e5f: Loading layer [==================================================>] 2.048kB/2.048kB
0d505ec0c305: Loading layer [==================================================>] 48.68MB/48.68MB
8e942d7ce458: Loading layer [==================================================>] 3.96GB/3.96GB
9fa2948c3c9d: Loading layer [==================================================>] 18MB/18MB
0c4da6bd65ff: Loading layer [==================================================>] 960.8MB/960.8MB
Loaded image: openexplorer/ai_toolchain_ubuntu_20_j5_cpu:v1.1.77-py38
sudo docker run -it --rm -v /open_explorer -v ./dataset:/data/horizon_j5/data openexplorer/ai_toolchain_ubuntu_20_j5_cpu:v1.1.77-py38
ddk_vcs --help
Usage: ddk_vcs [OPTIONS] COMMAND [ARGS]...
Horizon Device Development Kit Version Control System
Options:
--version Show the version and exit.
--help Show this message and exit.
Commands:
install Install packages.
list List installed packages.
patch Patch packages.
show Show information about installed packages.
uninstall Uninstall packages.
Open Explorer 包管理
列出已安装的软件包
bash
ddk_vcs list -l
Host package version: v1.1.77
The following packages versions
Platform Local Package Version MD5
--------------- --------------------- ------- ----------
aarch_64 dnn_1.24.3.tar.gz 1.24.3 cff65432dc
x86_64_gcc5.4.0 dnn_x86_1.24.3.tar.gz 1.24.3 aeba491255
对安装包进行安装
bash
ddk_vcs install dnn==1.24.3 --platform aarch_64
dnn installed successfully, version: 1.24.3, platform: aarch_64
显示有关已安装软件包的信息
bash
ddk_vcs show dnn
Host package version v1.1.77
The following packages versions
Platform Package Version MD5
-------- ------- ------- ----------
aarch_64 dnn 1.24.3 cff65432dc
卸载指定模块
bash
ddk_vcs uninstall dnn --platform aarch_64
Start to uninstall modules, platform: aarch_64
dnn uninstalled successfully, version: 1.24.3, platform: aarch_64