deploy_SuperEdge.md 8.3 KB
Newer Older
1
# Tengine + SuperEdge 一条指令跨平台部署边缘AI应用
B
BUG1989 已提交
2
------------
3 4 5 6
## 案例说明

​		案例基于开源AI推理框架Tengine 实现容器调用边缘硬件NPU资源,完成高效物体检测的推理任务,并通过开源边缘容器方案 SuperEdge 轻松将应用调度到边缘计算节点,实现一条指令部署边缘计算跨平台AI应用案例。

7
[Tengine](https://github.com/OAID/Tengine "Tengine")[OPEN AI LAB](http://www.openailab.com/) 主导开发,该项目实现了深度学习神经网络模型在嵌入式设备上的**快速****高效**部署需求。为实现在众多**AIoT**应用中的跨平台部署,本项目使用**C语言**进行核心模块开发,针对嵌入式设备资源有限的特点进行了深度框架裁剪。同时采用了完全分离的前后端设计,有利于 CPU、GPU、NPU 等异构计算单元的快速移植和部署,降低评估、迁移成本。
8 9 10

[SuperEdge](https://github.com/superedge/superedge "SuperEdge") 是基于原生 Kubernetes 的**边缘容器**管理系统。该系统把云原生能力扩展到**边缘侧**,很好的实现了云端对边缘端的**管理**和控制,极大**简化**了应用从云端部署到边缘端的过程。SuperEdge 为应用实现**边缘原生化**提供了**强有力**的支持。

reachfoo's avatar
reachfoo 已提交
11
![img](../images/oal_structure.png)
12 13 14 15 16

## 硬件环境准备

| 物品         | 描述                                                         |
| ------------ | ------------------------------------------------------------ |
17 18
| Master服务器 | SuperEdge Master 服务器, 用于应用调度,可采用X86 or Arm 架构,本例中采用X86服务器 |
| Khadas VIM3  | 应用负载工作节点,内置 A311D SoC 的单板计算机,内置 5Tops NPU 加速器,各大商城有售 |
19 20 21 22 23 24 25 26 27 28 29
| USB 摄像头   | 连接Khadas VIM3,输入实时视频流                              |
| 液晶显示器   | 连接Khadas VIM3,控制台操作,实时输出示例运行结果            |
| HDMI连接线   | 由于Khadas VIM3 的 TYPE C 接口与 HDMI 接口过于紧凑,需要寻找小一点接口的 HMDI 连接线 |



## 操作步骤

### 1.安装SuperEdge环境

- 安装SuperEdge Master节点(x86_64)
B
BUG1989 已提交
30
```shell
31
wget https://superedge-1253687700.cos.ap-guangzhou.myqcloud.com/v0.4.0/amd64/edgeadm-linux-amd64-v0.4.0.tgz
B
BUG1989 已提交
32 33 34
tar -zxvf edgeadm-linux-amd64-v0.4.0.tgz
cd edgeadm-linux-amd64-v0.4.0
./edgeadm init --kubernetes-version=1.18.2 --image-repository superedge.tencentcloudcr.com/superedge --service-cidr=10.96.0.0/12 --pod-network-cidr=10.224.0.0/16 --install-pkg-path ./kube-linux-*.tar.gz --apiserver-cert-extra-sans=<Master Public IP> --apiserver-advertise-address=<Master Intranet IP> --enable-edge=true
35 36 37 38 39 40 41 42 43 44
#复制k8s配置文件到用户目录下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#去掉资源限制,解决khadas VIM3安装SuperEdge导致设备重启的问题
kubectl patch DaemonSet kube-proxy -n kube-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources", "value":{}}]'
kubectl patch DaemonSet kube-flannel-ds -n kube-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources", "value":{}}]'
kubectl patch DaemonSet tunnel-edge -n edge-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources", "value":{}}]'
kubectl patch DaemonSet edge-health -n edge-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources", "value":{}}]'
kubectl patch DaemonSet application-grid-wrapper-node -n edge-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/resources", "value":{}}]'
B
BUG1989 已提交
45
```
46
- Khadas VIM3 设备加入集群
B
BUG1989 已提交
47
```shell
48 49 50 51 52 53 54 55
# 由于demo使用了桌面GUI画图,开机登录界面导致应用无法正常启动,因此需设置设备开机桌面自动登录
#步骤:打开图形桌面右上角 settings-users-AutoLogin 配置,开机无需输入密码进入桌面,重新启动,无登录画面即可

#Disable fenix-zram-config service to disable the swap 
sudo systemctl disable fenix-zram-config
sudo systemctl status fenix-zram-config

# Download edgeadm arm64 version to install SuperEdge Node 
56
wget https://superedge-1253687700.cos.ap-guangzhou.myqcloud.com/v0.4.0/arm64/edgeadm-linux-arm64-v0.4.0.tgz
B
BUG1989 已提交
57 58
tar -zxvf edgeadm-linux-arm64-v0.4.0.tgz
cd edgeadm-linux-arm64-v0.4.0
59 60

#Upgrade cni-plugins from v0.8.3 to v0.8.6, 解决在Khadas上安装SuperEdge和CNI失败的问题,
61 62 63 64 65
tar -zxvf kube-linux-arm64-v1.18.2.tar.gz
wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-arm64-v0.8.6.tgz
mv cni-plugins-linux-arm64-v0.8.6.tgz edge-install/cni/cni-plugins-linux-arm64-v0.8.3.tgz
sed -i 's/\tload_kernel/# load_kernel/' edge-install/script/init-node.sh
tar -zcvf kube-linux-arm64-v1.18.2.1.tar.gz edge-install/
66

67 68 69 70 71 72 73 74
#加入集群
./edgeadm join <Master Public/Intranet IP Or Domain>:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxx --install-pkg-path kube-linux-arm64-v1.18.2.1.tar.gz --enable-edge=true
```
- Khadas VIM3 设备开启Xserver授权
```shell
# Access to Xserver
# Execute script on device Terminal
xhost +
B
BUG1989 已提交
75 76
```

77
### 2.(可选)构建Tengine demo容器镜像
78
------------
79 80 81
该步骤介绍如何构建Tengine Demo镜像,如采用Docker Hub镜像, 可跳过。

- 下载文件包到Khadas VIM3设备上,构建Tengine物体识别应用docker镜像
B
BUG1989 已提交
82
```shell
83
#Download docker build packeage [~91M] from OPEN AI LAB server
B
BUG1989 已提交
84 85 86 87 88
wget http://tengine2.openailab.com:9527/openailab/yolo.tar.gz
tar -zxvf yolo.tar.gz
cd superedge
docker build -t yolo:latest .
```
89
Dockerfile文件如下所示
B
BUG1989 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
```
FROM ubuntu:20.04
MAINTAINER openailab
RUN apt-get update
RUN apt-get install -y tzdata
RUN apt-get install -y libopencv-dev
RUN apt-get install -y libcanberra-gtk-module
RUN useradd -m openailab
COPY libtengine-lite.so /root/myapp/
COPY demo_yolo_camera /root/myapp/
COPY tm_330_330_330_1_3.tmcache /root/myapp/
ADD models /root/myapp/models/
COPY tm_88_88_88_1_1.tmcache /root/myapp/
COPY tm_classification_timvx /root/myapp/
COPY libOpenVX.so /lib/
COPY libGAL.so /lib/
COPY libVSC.so /lib/
COPY libArchModelSw.so /lib/
COPY libNNArchPerf.so /lib/
COPY libgomp.so.1 /lib/aarch64-linux-gnu/
COPY libm.so.6 /lib/aarch64-linux-gnu/
WORKDIR /root/myapp/
USER openailab
CMD ["./demo_yolo_camera"]
```
115
如果需要自己编译并生成demo_yolo_camera程序,具体操作参考[demo_videocapture user manual](https://github.com/OAID/Tengine/blob/tengine-lite/doc/demo_videocapture_user_manual.md "demo_videocapture user manual")
B
BUG1989 已提交
116

117 118 119
### 3.编写 yolo.yaml 编排文件 

- 在SuperEdge Master节点上编辑k8s编排文件yolo.yaml
B
BUG1989 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yolo
  labels:
    name: yolo
spec:
  replicas: 1
  selector:
    matchLabels:
      name: yolo
  template:
    metadata:
      labels:
        name: yolo
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - khadas
      containers:
        - name: yolo
148
          image: tengine3/yolo:v1.0
B
BUG1989 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
          env:
          - name: DISPLAY
            value: :0
          volumeMounts:
            - name: dev
              mountPath: /dev
            - name: unix
              mountPath: /tmp/.X11-unix
          securityContext:
            privileged: true
      volumes:
        - name: dev
          hostPath:
            path: /dev
        - name: unix
          hostPath:
            path: /tmp/.X11-unix
```
167 168
### 4. Tengine物体识别应用应用部署

169
执行编排文件
170

B
BUG1989 已提交
171 172 173
```shell
kubectl apply -f yolo.yaml
```
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
### 5.案例效果与验证

通过命令查看部署状态

```
peter@peter-VirtualBox:~$ kubectl get deployment yolo -o wide
NAME   READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES               SELECTOR
yolo   1/1     1            1           21h   yolo         tengine3/yolo:v1.0   name=yolo

peter@peter-VirtualBox:~$ kubectl get pod yolo-76d95967bb-zxggk 
NAME                    READY   STATUS    RESTARTS   AGE
yolo-76d95967bb-zxggk   1/1     Running   3          79m

```

189 190
打开Khadas VIM设备的显示器,观察到如下效果

reachfoo's avatar
reachfoo 已提交
191
![img](../images/oal_demo.jpg)
192 193