保姆级教程 - atlas500部署yolov3-tiny检测实时视频流 [1] - 内网环境下docker部署atlas500

网友投稿 893 2022-05-29

保姆级教程 - atlas500部署yolov3-tiny检测实时视频流 [1] - 内网环境下docker部署atlas500 开发环境

— 本教程详细介绍在华为atlas500智能小站上,部署自己的darknet版本的yolov3-tiny目标检测模型

保姆级教程 - atlas500部署yolov3-tiny检测实时视频流 [1] - 内网环境下docker部署atlas500 开发环境

1、内网环境下atlas500 docker镜像部署开发环境

(1)前言

(2)镜像构建方式

(3)镜像构建前置操作

(4)DockerFile 构建docker 镜像

dockerfile 构建镜像

将镜像文件导出,通过/tmp目录上传至atlas500

atlas500运行镜像生成容器

经过多次踩坑,总结到,还是要多看官方文档,论坛文章仅能作为借鉴。毕竟软件生态版本迭代较快。相关技术文章具有时效性,和您的软件环境也不一定匹配,但还是想系统整理出文章,一起沟通讨论。

本教程主要涉及以下四部分:

(一)内网环境下DockerFile构建docker容器,并部署在atlas500(无法访问互联网)

(二)原生darknet yolov3-tiny的weight -> om 模型转换教程

(三)om模型在atlas500边端部署,实现有效推理

(四)前、后处理优化,aipp + dvpp 实现推理流程的速度优化

本文的设备情况:

本文默认读者已经根据500小站用户指南,完成设备上电等前置操作:https://support.huawei.com/enterprise/zh/doc/EDOC1100133176/c6355e39

小站是华为欧拉linux系统(aarch64架构),Ascend310芯片,本文的500完全隔绝外网 (正常的500可以连接外网),也没有apt-get install等方式安装软件,但是小站系统自带docker软件,仅用于模型边缘部署。

uname -a 查看系统架构信息:

Linux Euler 4.19.36-vhulk1907.1.0.h1017.eulerosv2r8.aarch64 #1 SMP Sat Mar 27 10:04:38 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

由于内网部署网络的限制,同时为软件环境修改方便,本文借助其他外网设备,通过DockerFile方式构建docker镜像,再把打包好的镜像文件上传至500小站使用。由于小站是aarch64架构,所用的apt源和开发软件的架构也要是aarch64架构,我们镜像构建和后续的模型转换在另一台可连接外网的atlas200 DK(arrch64)设备上操作。

由于设备不在身边,完全内网环境,通过公网ip远程登录。我们在构建docker时,需要了解后续的开发方式,准备所需软件环境。

经过研究文档发现,在昇腾设备上开发主要有两种方式:

使用MindX SDK推理,MindX SDK是一种插件化编程方式,我理解是一个简化的推理SDK,少量代码开发,拼接几个预定义好的插件就可以实现应用开发,尝试过但遇到一些程序崩溃问题,同时觉得过于模板化,自主性不强,没有使用。

保姆级教程 - atlas500部署yolov3-tiny检测实时视频流 [1] - 内网环境下docker部署atlas500

基于ACL架构进行开发,这种算是采用ascend的API进行自主开发编译运行,并不需要从0开发,昇腾的样例仓中有很多参考项目,可以基于昇腾的sample开发:https://gitee.com/ascend/samples,同时参考Ascend的开发工具包 CANN推理的API文档,本文也是这种思路.

拿到atlas500,可以ssh远程登录后,进入的初始系统是类似启动项,还不是Euler系统:

登录Euler系统之前,我们要在IES界面做一些操作:

ssh远程登录a500后,在IES:/ -> 界面,首先输入 sftp enable,终端返回 set enable success,即可开放atlas500的 /tmp 目录,进行远程文件传输。

但/tmp目录仅有2G空间。并且是临时目录,固件升级等操作会将该目录清空,可仅用于文件传输目录,不可长时间存放文件。博主曾经将代码放到该目录下用Xftp打开文件编辑代码,这样很危险,/tmp被清空没有备份就凉凉了。

重置会话超时时间,否则超时后,ssh会话会自动关闭,远程终端中断。

在IES界面输入timeout 0 ,终端返回set success;然后输入develop (开发者模式),进入欧拉系统。再输入TMOUT=0:

Euler:~ # TMOUT=0

docker --version 查看atlas500 docker信息:

Euler:~ # docker --version Docker version 18.09.0, build ebc4987

npu-smi info 查看gpu芯片信息:

其中,我的driver固件版本为21.0.4,CANN版本必须和固件版本配套,否则会遇到很多不可预料的问题。关于版本不匹配导致的问题见issues:https://gitee.com/ascend/samples/issues/I532OI?from=project-issue

下载固件时,会有版本的对应关系:https://www.hiascend.com/hardware/firmware-drivers?tag=community

比如下图:CANN的5.0.4版本,必须对应21.0.4的固件版本。但我在使用时发现,社区版的固件更新是滞后的。导致一直在使用低版本的固件,出现很多玄学问题,最后版本匹配后就解决了。

固件升级,选择智能边缘管理系统升级最方便,参考文档:(https://support.huawei.com/enterprise/zh/doc/EDOC1100133173/dede8113)

在构建docker 镜像前我们要确定CANN的版本,本文选用 昇腾CANN社区版(5.0.4.alpha002),后续的操作应严格按照CANN对应的文档来,CANN文档分为训练和推理,请移步: 昇腾CANN社区版(5.0.4.alpha002)(训练)、 昇腾CANN社区版(5.0.4.alpha002)(推理)

由于a500的网络原因,我们用身边的一台atlas200 dk进行docker 镜像部署,好处在于都是aarch64 架构,感觉构建镜像时会更顺利。用其他linux设备是一样的。

DockerFile基于ubuntu18.04进行构建,包括安装atlas500部署所用的Ascend-cann-nnrt_5.0.4.alpha002_linux-aarch64.run、以及后台AI引擎所需的python依赖、redis、linux所需的必要软件。

在此解释一下CANN分为cann-toolkit 和 cann-nnrt ;区别大致是toolkit包更完整,包含开发,推理训练都可以;nnrt是离线推理引擎包,较为轻量,包含开发、推理应用。像模型转换操作就只能用cann-toolkit包。因为我们只在500部署,所以选用nnrt包。

- Dockerfile文件作为参考

基于sample样例进行开发时,要看清楚软件版本,比如python版本

其中的MindX SDK安装是可选操作,后续的文章没有用到。

其中,以root用户登录小站,执行id HwHiAiUser命令查询并记录宿主机上HwHiAiUser用户的UID和GID。

groupadd -g gid HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && usermod -u uid HwHiAiUser &&\

为在容器内创建HwHiAiUser用户。gid、uid为宿主机上HwHiAiUser用户的UID和GID,容器内的HwHiAiUser用户的UID和GID需要和宿主机保持一致。

FROM ubuntu:18.04 # 更换aliyun镜像源,安装linux必要的依赖 RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list RUN set -ex && apt-get update -y 2> /dev/null && apt install vim -y 2> /dev/null && apt install sudo -y 2> /dev/null \ && apt-get install -y cmake curl g++ pkg-config libxcb-shm0-dev libxcb-xfixes0-dev tesseract-ocr libblas3 liblapack3 liblapack-dev libblas-dev gfortran libhdf5-dev libffi-dev ffmpeg wget # install redis-server5.0.5 WORKDIR /root RUN apt-get update && mkdir /root/redis WORKDIR /root/redis RUN apt-get install software-properties-common -y \ && apt-get update \ && apt-get install gcc -y \ && apt-get install --reinstall make \ && wget http://download.redis.io/releases/redis-5.0.5.tar.gz \ && tar zxvf redis-5.0.5.tar.gz WORKDIR ./redis-5.0.5 RUN make && make install # 复制配置文件到容器,并运行redis COPY ./redis.conf /etc/ CMD redis-server /etc/redis.conf #Using douban pipy mirror setup software RUN apt-get install python3.6 -y \ && rm /usr/bin/python3 \ && ln -s /usr/bin/python3.6 /usr/bin/python3 \ && apt-get install python3-pip -y \ && /usr/bin/python3 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simple \ && /bin/bash -c "source ~/.bashrc" WORKDIR /home/docker/docker_atlas500/ COPY packages/ ./packages # 很多库没有在线安装arm版,下载离线包安装, 安装包放在dockerfile同级的packages目录 RUN ls -la ./packages \ && echo `pwd` \ && echo `ls` \ && pip3 install --upgrade pip \ && cd packages/requests-offline \ && pip3 install certifi-2019.9.11-py2.py3-none-any.whl \ && pip3 install chardet-3.0.4-py2.py3-none-any.whl \ && pip3 install idna-2.8-py2.py3-none-any.whl \ && pip3 install urllib3-1.25.7-py2.py3-none-any.whl \ && cd requests-2.22.0 \ && cd ../../ \ && rm -rf packages/ \ && pip3 install opencv-python-headless redis tqdm tzlocal==2.1 pytesseract -i https://pypi.tuna.tsinghua.edu.cn/simple # 无法直接安装opencv-python,解决方法是安装opencv-python-headless #设置离线推理引擎包参数 ARG NNRT_PKG #设置环境变量 ARG ASCEND_BASE=/usr/local/Ascend ENV LD_LIBRARY_PATH=\ $LD_LIBRARY_PATH:\ $ASCEND_BASE/nnrt/latest/acllib/lib64:\ /home/data/miniD/driver/lib64 # 关联宿主机npu的路径 ENV ASCEND_AICPU_PATH=\ $ASCEND_BASE/nnrt/latest #设置进入启动后的容器的目录 WORKDIR /root #拷贝离线推理引擎包 COPY $NNRT_PKG . #安装CANN离线推理引擎包,此处参考:官方文档,要保证和HwHiAiUser用户的UID和GID一致 RUN umask 0022 && \ groupadd -g 1001 HwHiAiUser && useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser && usermod -u 1001 HwHiAiUser &&\ chmod +x ${NNRT_PKG} &&\ ./${NNRT_PKG} --quiet --install &&\ rm ${NNRT_PKG} # Ascend-mindxsdk-mxmanufacture_2.0.1_linux-aarch64(可选) ARG SDK_PKG # 设置工作路径 WORKDIR /root # 安装到home COPY $SDK_PKG . # 安装MindX SDK mxmanufacture RUN chmod +x ${SDK_PKG} &&\ ./${SDK_PKG} --quiet --install &&\ rm ${SDK_PKG} &&\ /bin/bash -c "source ~/.bashrc"

docker 镜像构建过程,也可以参考官方文档https://support.huawei.com/enterprise/zh/doc/EDOC1100133176/63895f14

在200dk或其他linux设备均可构建镜像:

docker build -t atlas500_last:v5 --build-arg NNRT_PKG=Ascend-cann-nnrt_20.3.0_linux-aarch64.run --build-arg SDK_PKG=Ascend-mindxsdk-mxmanufacture_2.0.1_linux-aarch64.run .

其中,-t指明镜像名和版本号;–build-arg NNRT_PKG=“输入cann-nnrt包的路径” ;–build-arg SDK_PKG= “输入MindX SDK的路径” (可选)

构建镜像结束:

docker images # 查看镜像

可以看到我的镜像已经很大了,我们在dockerfile中构建时,可以将不用的软件包删除,比如MindX sdk

docker save a920 > atlas500_last.tar

docker run --privileged --network=host --device=/dev/davinci0 --device=/dev/davinci_manager --device=/dev/hisi_hdc --device /dev/devmm_svm -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /home/data/miniD/driver/lib64:/home/data/miniD/driver/lib64 -v /run/board_cfg.ini:/run/board_cfg.ini -it atlas500_last:v5 /bin/bash

其中,–privileged开启特权模式,容器才能调用宿主机的npu芯片,即device。

–network=host 开启宿主机的网络映射,容器才能和宿主机一样访问网络。

-it atlas500_last:v5,指明容器的名称: 版本号

简单docker操作

docker ps 查看容器:

如果没有刚生成的容器,可能是挂起了, docker ps --all查看所有容器。

docker start containerID 即可启动容器

Euler:~ # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 06654b02ee44 atlas500 "/bin/bash" 2 months ago Up 4 days gagarin

docker exec -it 0665 /bin/bash 进入容器

进入容器后,检查输入npu-smi info 出现芯片信息,检查相关软件环境,即安装成功。

进行推理之前,需要到容器中CANN的安装目录下,激活环境

我的路径在:

cd /usr/local/Ascend/nnrt/ source set_env.sh

至此,我们完成atlas上CANN等开发环境的docker镜像部署!

Atlas 200 DK开发者套件 Docker Linux 镜像服务

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:云技术会颠覆IT平台吗?
下一篇:计算机网络探究一之利用双网卡主机共享上网
相关文章