Atlas500开发环境搭建

Atlas 500 开发过程

一、Atlas500和电脑直连 修改电脑网络配置

IP 192.168.2.112

子网掩码255.255.255.0

网关 192.168.2.1

电脑网页进入Atlas500 默认IP地址 https://192.168.2.113

ssh admin@192.168.3.111 

#默认密码:Huawei12#$

develop

#默认密码:Huawei@SYS3

进入Atlas500设置网络

IP 192.168.** . ***

子网掩码255.255.0.0

网关 192.168.*** . *

ssh admin@192.168.**. ***  password: *****

进入IES:  输入develop   

password:*****

进入root

取消ssh一段时间不操作就断开:

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

Atlas500固件版本升级:

https://www.hiascend.com/en/hardware/firmware-drivers?tag=community

升级到 A500-3000-3010-firmware_21.0.4。

Atlas200CANN版本5.1.RC2 驱动和固件1.0.13

Atlas500CANN版本5.0.4 驱动和固件1.0.33

原始版本是2.2.X 需要要先升级到20.0.3,然后在升级到21.0.4。

如果直接升级20.0.3失败,就先升级到20.0.2,然后再升级到20.0.3,如果在升级20.0.3的时候失败,

先恢复出厂设置 然后系统自动就会升级到20.0.3,随后在升级到21.0.4。

挂载硬盘:

mount /dev/sda 挂载文件夹
eg:
mount /dev/sda /home/HwHiAiUser/data

挂载PC端到atlas500:

mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 IP地址:挂载文件夹 atlas500挂载文件夹
eg:
mount -t nfs -o nolock -o tcp -o rsize=32768,wsize=32768 192.168.51.104:/home/john/data/Atlas500 zzz

开放/tmp目录进行文件传输:

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

添加DNS:

Error response from daemon: Get "https://ascendhub.huawei.com/v2/": dial tcp: lookup ascendhub.huawei.com on [::1]:53: read udp [::1]:50827->[::1]:53: read: connection refused


vi /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4 

systemctl restart network

启动IPv4服务:

WARNING: IPv4 forwarding is disabled. Networking will not work


vi /etc/sysctl.conf

# 新增一行
 net.ipv4.ip_forward=1
 
#  重启network服务
systemctl restart network

# 查看是否修改成功
sysctl net.ipv4.ip_forward

(返回为“net.ipv4.ip_forward = 1”,表示成功)

二、环境部署

2.1 开发环境部署(基于docker基础镜像)

说明:

  • 开发环境指编译开发代码的环境,运行环境指运行推理程序的环境,运行环境必须带昇腾AI处理器。
  • 开发环境与运行环境合设场景指带昇腾AI处理器的机器既作为开发环境又作为运行环境,此种场景下,代码开发与代码运行在同一台机器上。
  • 开发环境与运行环境分设场景指开发者使用其他独立机器进行代码开发与编译,而不使用带有昇腾AI处理器的机器。

开发套件包(Cann Toolkit)中的组件功能如下所示:

  • ACLlib:用来编译和运行应用程序。包含AscendCL编译依赖的相关库,并具有GE模型的加载、执行功能。
  • ATC:模型和算子编译器。用于离线模型转换、自定义算子开发、IR构图开发等场景。
  • OPP:算子库,包含算子原型库及算子实现库、算子插件、融合规则。算子实现包含TBE算子、AICPU算子,另外包含算子parser。
  • Toolkit:调测工具包,主要包含开发者调测应用、算子需要使用的工具包。
1、获取安装软件包,

Ascend-cann-toolkit_{version}_linux-x86_64.run: 主要用于用户开发应用、自定义算子和模型转换。开发套件包包含开发应用程序所需的库文件、开发辅助工具(如ATC模型转换工具) Ascend-cann-toolkit_{version}_linux-aarch64.run: arm64的开发套件包,用于应用的交叉编译。 [下载链接]https://www.hiascend.com/software/cann/community-history [查看驱动与开发套件的版本匹配说明]https://gitee.com/ascend/tools/blob/master/makesd/Version_Mapping_CN.md {version}表示软件包版本号,版本号需要保持一致

2、配置ubuntu系统

Ubuntu操作系统的版本可以为:18.04.4、18.04.5

# 导入基础镜像
docker pull ubuntu:18.04
# 启动镜像
docker run -it --name Atlas500 --privileged --entrypoint=/bin/bash -v /home/:/mnt -p host_port:docker_port ubuntu:18.04

2.1 检查源

# 更新apt源
apt-get update

# 安装vim
apt-get install vim

# 检测是否存在sudo指令,若没有则
apt-get install sudo

apt源不好用时可尝试换成华为开源源或者清华源,修改“/etc/apt/sources.list”文件中的更换源 [华为开源源]https://mirrors.huaweicloud.com/home [清华源]https://mirrors.tuna.tsinghua.edu.cn/

2.2 检查root用户的umask

  • 以root用户登录安装环境。
  • 检查root用户的umask值。 umask
  • 如果umask值不等于0022,在该文件的最后一行添加umask 0022后保存。
# 在系统配置文件的最后一行添加umask 0022后保存
vi ~/.bashrc
source ~/.bashrc

2.3 创建安装用户 开发套件包建议以非root用户进行安装,创建非root用户的命令如下所示(请以root用户执行以下命令)

# 创建非root用户
groupadd usergroup     
useradd -g usergroup -d /home/username -m username -s /bin/bash

# 以创建HwHiAiUser用户为例:
groupadd HwHiAiUser
useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash

# 设置非root用户密码。
passwd username

# 示例如下:
passwd HwHiAiUser

说明: 您可以通过chage命令来设置用户的有效期,详情请参见设置用户有效期。 如果您以root用户安装开发套件包,环境中需要存在用户名与用户组都为“HwHiAiUser”的用户。

2.4 配置安装用户权限 开发套件包安装前需要下载相关依赖软件,请执行如下操作为非root用户加权。

# 添加“/etc/sudoers”文件写权限:
chmod u+w /etc/sudoers
vi /etc/sudoers

# 在/etc/sudoers文件中“# User privilege specification”下面增加如下内容:
username ALL=(ALL:ALL) NOPASSWD:SETENV:/usr/bin/apt-get, /usr/bin/pip, /bin/tar, /bin/mkdir, /bin/rm, /bin/sh, /bin/cp, /bin/bash, /usr/bin/make install, /bin/ln -s /usr/local/python3.7.5/bin/python3 /usr/local/python3.7.5/bin/python3.7.5, /bin/ln -s /usr/local/python3.7.5/bin/pip3 /usr/local/python3.7.5/bin/pip3.7.5, /usr/bin/unzip, /usr/bin/find /etc -name openssl.cnf

# 示例,“username”为开发套件包的安装用户。
HwHiAiUser ALL=(ALL:ALL) NOPASSWD:SETENV:/usr/bin/apt-get, /usr/bin/pip, /bin/tar, /bin/mkdir, /bin/rm, /bin/sh, /bin/cp, /bin/bash, /usr/bin/make install, /bin/ln -s /usr/local/python3.7.5/bin/python3 /usr/local/python3.7.5/bin/python3.7.5, /bin/ln -s /usr/local/python3.7.5/bin/pip3 /usr/local/python3.7.5/bin/pip3.7.5, /usr/bin/unzip, /usr/bin/find /etc -name openssl.cnf

# 添加完成后,保存文件
:wq!

# 执行以下命令取消“/etc/sudoers”文件的写权限:
chmod u-w /etc/sudoers

须知: 请确保“/etc/sudoers”文件的最后一行为“#includedir /etc/sudoers.d”,如果没有该信息,请手动添加。 用户在安装完开发套件包后,可自行取消sudo权限。 用户在卸载或升级开发套件包时,也需要配置以上用户权限。

2.5 安装依赖

# 说明:请使用开发套件包安装用户执行以下命令安装依赖。
su HwHiAiUser

# a-检查系统是否安装python依赖以及gcc等软件。
gcc --version
g++ --version
make --version
cmake --version
dpkg -l zlib1g| grep zlib1g| grep ii
dpkg -l zlib1g-dev| grep zlib1g-dev| grep ii
dpkg -l libsqlite3-dev| grep libsqlite3-dev| grep ii
dpkg -l openssl| grep openssl| grep ii
dpkg -l libssl-dev| grep libssl-dev| grep ii
dpkg -l libffi-dev| grep libffi-dev| grep ii
dpkg -l unzip| grep unzip| grep ii
dpkg -l pciutils| grep pciutils| grep ii
dpkg -l net-tools| grep net-tools| grep ii
dpkg -l libblas-dev| grep libblas-dev| grep ii
dpkg -l gfortran| grep gfortran| grep ii
dpkg -l libblas3| grep libblas3| grep ii
dpkg -l libopenblas-dev| grep libopenblas-dev| grep ii
# b-查看打印信息,那些软件包已安装

# c-安装未安装的软件
sudo apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 libopenblas-dev

# d-检查系统是否安装python开发环境
python3.7.5 --version
pip3.7.5  --version
python3.7 --version
pip3.7  --version

# e-若无Python则进行下一步
sudo apt-get install wget
wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
tar -zxvf Python-3.7.5.tgz
cd Python-3.7.5

# f-编译
# cmake和编译可能需要切换到root用户进行
# 其中“--prefix”参数用于指定python安装路径,用户根据实际情况进行修改,“--enable-shared”参数用于编译出libpython3.7m.so.1.0动态库,“--enable-loadable-sqlite-extensions”参数用于加载libsqlite3-dev依赖。
./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared
make
# 安装
sudo make install

# h-添加系统环境变量
vi ~/.bashrc
#用于设置python3.7.5库文件路径
#如果用户环境存在多个python3版本,则指定使用python3.7.5版本
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/python3.7.5/bin:$PATH
source ~/.bashrc

# 安装Python3相关依赖
pip3 install attrs --user
pip3 install numpy==1.17.2 --user
pip3 install decorator --user
pip3 install sympy --user
pip3 install cffi --user
pip3 install pyyaml --user
pip3 install pathlib2 --user
pip3 install psutil --user
pip3 install protobuf --user
pip3 install scipy --user
pip3 install requests --user
3、安装开发套件包

前提条件

  • 已获取获取软件包章节所述的x86_64和aarch64架构开发者的.run包。
  • 请参见2、配置Ubuntu X86系统完成安装前环境准备。

安装步骤

# 1-以套件包安装用户登录开发环境。***
su HwHiAiUser

# 2-上传获取软件包所获取的开发套件包到系统任意路径,并进入套件包所在路径。
# 执行如下命令为安装包增加可执行权限
chmod +x *.run

# 3-执行如下校验安装包的一致性和完整性
./Ascend-cann-toolkit_5.0.4.alpha005_linux-x86_64.run --check
./Ascend-cann-toolkit_5.0.4.alpha005_linux-aarch64.run --check

# 执行以下命令安装软件。
# 方式一:使用默认路径安装:
./Ascend-cann-toolkit_5.0.4.alpha005_linux-x86_64.run --install
./Ascend-cann-toolkit_5.0.4.alpha005_linux-aarch64.run --install

# 默认安装路径详细介绍请参见表1,安装完成后,若显示以下对应架构信息,则说明软件安装成功。
[INFO] x.xx install success

# 方式二:使用自定义路径安装:
./Ascend-cann-toolkit_{version}_linux-x86_64.run --install --install-path={path}
./Ascend-cann-toolkit_{version}_linux-aarch64.run --install --install-path={path}
# 其中{path}为指定的安装路径,请用户先创建文件夹自行替换。
4、安装后处理
# 配置交叉编译环境
sudo apt-get install g++-aarch64-linux-gnu
# 查看交叉编译环境版本号
aarch64-linux-gnu-g++ --version

第一种:
# 添加系统环境变量
vi ~/.bashrc
# 在文件最后添加如下内容:
# 以安装用户为HwHiAiUser为例
export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest
export ASCEND_OPP_PATH=${install_path}/opp
export ASCEND_AICPU_PATH=${install_path}
export TOOLCHAIN_HOME=${install_path}/toolkit
#开发离线推理程序时配置
export LD_LIBRARY_PATH=${install_path}/acllib/lib64:$LD_LIBRARY_PATH
export PATH=${install_path}/toolkit/bin:$PATH
export PYTHONPATH=${install_path}/toolkit/python/site-packages:${install_path}/pyACL/python/site-packages/acl:$PYTHONPATH
#进行模型转换/算子编译时配置
export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH
export PATH=${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:${install_path}/toolkit/bin:$PATH
export PYTHONPATH=${install_path}/toolkit/python/site-packages:${install_path}/atc/python/site-packages:$PYTHONPATH
source ~/.bashrc

第二种:
# 添加系统环境变量
vi ~/.bashrc
# 在文件最后添加如下内容:
# 以安装用户为HwHiAiUser为例
source /home/HwHiAiUser/Ascend/ascend-toolkit/set_env.sh
source ~/.bashrc

# 保存搭建环境
docker commit CONTAINER_ID atlas200:ubuntu18.04
4、OpenCV+FFmpeg安装

OpenCV

  • 开发环境与运行环境合设场景

    在环境上执行如下命令安装OpenCV:

    sudo apt-get install libopencv-dev

  • 开发环境与运行环境分设场景

    • 若开发环境与运行环境操作系统架构相同,请分别在开发环境与运行环境上执行如下命令安装OpenCV:

      sudo apt-get install libopencv-dev

    • 若开发环境与运行环境操作系统架构不同,例如开发环境架构为X86,运行环境架构为AArch64,此种场景下,需要在开发环境上通过源码的方式对OpenCV进行交叉编译、安装,但此种方式操作复杂,所以此处采用直接在运行环境上安装opencv,然后将安装后的文件拷贝到开发环境的方式,详细步骤如下:

      1. 在运行环境上执行如下命令安装OpenCV,需要确保运行环境已接入互联网。

        sudo apt-get install libopencv-dev

      2. 在开发环境上执行如下命令,拷贝运行环境上对应的库文件。

        # 将运行环境下AArch64形态的opencv相关文件拷贝到开发环境(X86架构)的aarch64-linux-gnu目录,不会对本地开发环境本身使用产生任何影响。以下命令在开发环境中执行
        cd /usr/lib/aarch64-linux-gnu
        # 拷贝OpenCV相关库文件,其中X.X.X.X为运行环境IP地址,HwHiAiUser为运行环境的运行用户,此处仅为示例。
        sudo scp -r HwHiAiUser@X.X.X.X:/lib/aarch64-linux-gnu/* ./
        sudo scp -r HwHiAiUser@X.X.X.X:/usr/lib/aarch64-linux-gnu/* ./
        sudo scp -r HwHiAiUser@X.X.X.X:/usr/lib/*.so.* ./
        # 拷贝opencv相关头文件。
        sudo scp -r HwHiAiUser@X.X.X.X:/usr/include/opencv* /usr/include
        

FFmpeg

  • 开发环境与运行环境合设场景

    在环境上参考如下命令使用源码编译的方式安装FFmpeg:

    # 下载并解压缩FFmpeg安装包,此处以将FFmpeg安装包存储在用户家目录下为例,开发者也可以自定义FFmpeg安装包存储路径。
    cd ${HOME}
    wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate
    tar -zxvf ffmpeg-4.1.3.tar.gz
    cd ffmpeg-4.1.3
    # 安装ffmpeg
    ./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=${THIRDPART_PATH}
    make -j8
    make install
    
  • 开发环境与运行环境分设场景

    此种场景下,需要在开发环境上以源码的方式安装FFmpeg,详细步骤如下所示:

    1. 下载FFmpeg。

      # 下载并解压缩FFmpeg安装包,此处以将FFmpeg安装包存储在用户家目录下为例,开发者也可以自定义FFmpeg安装包存储路径。
      cd ${HOME}
      wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate
      tar -zxvf ffmpeg-4.1.3.tar.gz
      cd ffmpeg-4.1.3
      
    2. 安装FFmpeg。

      • 若运行环境的操作系统架构为X86,在开发环境上执行如下命令安装FFmpeg。

         ./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=${THIRDPART_PATH}
         make -j8
         make install
        
      • 若运行环境的操作系统架构为AArch64,在开发环境上执行如下命令安装FFmpeg。

        ./configure --enable-shared --enable-pic --enable-static --disable-x86asm --cross-prefix=aarch64-linux-gnu- --enable-cross-compile --arch=aarch64 --target-os=linux --prefix=${THIRDPART_PATH}
        make -j8
        make install
        
5、验证开发环境
# 启动镜像
docker run -it --user HwHiAiUser --name Atlas500 --privileged --entrypoint=/bin/bash -v /home/john/data/Atlas500:/home/HwHiAiUser/zhaojun -p 201:22 atlas500:ubuntu18.04
# 转换模型工具atc
atc 
# 若提示缺少libascend_hal.so
# for开发环境x86_64
export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/5.0.4.alpha005/x86_64-linux/x86_64-linux/devlib:$LD_LIBRARY_PATH
# for开发环境arm64-linux
# export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/5.0.4.alpha005/arm64-linux/aarch64-linux/devlib:$LD_LIBRARY_PATH

三、模型转换

说明:

3.1 ATC工具转换模型流程

开始 -> 环境准备 -> 模型准备(Caffe、TensorFlow、ONNX、MindScpore)/单算子描述文件(json文件)准备 -> ATC模型转换(可配置AIPP -> 结束 关键概念

  • AIPP AIPP(AI Pre Process)是昇腾AI处理器提供的硬件图像预处理模块,包括色域转换,图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等功能。
  • YUV420SP 有损图像颜色编码格式,常用为YUV420SP_UV、YUV420SP_VU两种格式。
  • 知识库 存储auto tune调优后的Schedule,在后续算子编译中直接使用。
  • cost model 评估器,auto tune过程中如果没有命中知识库,则通过cost model评估tiling空间中tiling的优劣,选择最优tiling数据。
  • 数据排布格式(format) 在深度学习框架中,多维数据通过多维数组存储,比如卷积神经网络的特征图用四维数组保存,四个维度分别为批量大小(Batch, N)、特征图高度(Height, H)、特征图宽度(Width, W)以及特征图通道(Channels, C)。 由于数据只能线性存储,因为这四个维度有对应的顺序。不同深度学习框架会按照不同的顺序存储特征图数据,比如Caffe,排列顺序为[Batch, Channels, Height, Width],即NCHW。TensorFlow中,排列顺序为[Batch, Height, Width, Channels],即NHWC。 以一张格式为RGB的图片为例,NCHW实际存储的是“RRRRRRGGGGGGBBBBBB”,同一通道的所有像素值顺序存储在一起,而NHWC实际存储的则是“RGBRGBRGBRGBRGBRGB”,多个通道的同一位置的像素值顺序存储在一起。 昇腾AI软件栈中,为了提高数据访问效率,所有张量数据统一采用NC1HWC0的五维数据格式。其中C0与微架构强相关,等于AI Core中矩阵计算单元的大小,对于FP16类型为16,对于INT8类型则为32,这部分数据需要连续存储;C1=C/C0。如果结果不整除,向上取整。

例如,将NHWC -> NC1HWC0的转换过程为: 将NHWC数据在C维度进行分割,变成C1份NHWC0。 将C1份NHWC0在内存中连续排列,由此变成NC1HWC0。 NHWC->NC1HWC0的转换场景示例: 首层RGB图像通过AIPP转换为NC1HWC0格式。 中间层Feature Map每层输出为NC1HWC0格式,在搬运过程中需要重排。

3.2 ATC模型转换环境变量配置

1、必须环境变量
# 若安装环境使用上述教程,此步骤可跳过 ${install_path}=/home/HwHiAiUser/Ascend/ascend-toolkit/latest
export PATH=${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH
export ASCEND_OPP_PATH=${install_path}/opp
export ASCEND_AICPU_PATH=${install_path}
2、可选环境变量

日志落盘与打屏

  • 日志落盘:atc命令执行过程中,由于–log参数默认值为null,即不输出日志,若想日志能落盘到文件,则可以尝试将–log设置为其他取值,比如–log=info。
  • 日志打屏:atc命令执行过程中,日志默认不打屏,如需打屏显示,则请在执行atc命令的当前窗口设置如下环境变量,然后再执行atc命令: export ASCEND_SLOG_PRINT_TO_STDOUT=1 若设置上述环境变量后,仍旧未打屏,则请在atc命令设置–log=xx参数显示相应的日志级别,关于该参数的使用方法请参见–log。

开启算子并行编译功能

  • 若网络模型较大,模型转换过程中,可设置如下环境变量,开启算子的并行编译功能。 export TE_PARALLEL_COMPILER=xx TE_PARALLEL_COMPILER的值代表算子并行编译进程数(配置为整数),默认值为8,当大于0时开启并行编译。建议配置为:CPU核数*80%/昇腾AI处理器个数,向上取整。

打印模型转换过程中各个阶段的图描述信息 export DUMP_GE_GRAPH=1 上述环境变量控制dump图的内容多少:取值为1,全量dump;取值为2:不含有权重等数据的基本版dump;取值为3:只显示节点关系的精简版dump。

设置上述环境变量后,还可以设置如下环境变量,控制dump图的个数。 export DUMP_GRAPH_LEVEL=1 取值为1,dump所有图;取值为2:dump除子图外的所有图;取值为3:dump最后的生成图,默认值为2。设置上述变量后,在执行atc命令的当前路径会生成相应的图文件。

3.3 模型转换样例

1、for caffe
atc --model=$HOME/test/resnet50.prototxt --weight=$HOME/test/resnet50.caffemodel --framework=0 --output=$HOME/test/out/caffe_resnet50 --soc_version=${soc_version} 
# 打印输出为以下结果则说明成功
ATC run success

# 如果模型转换过程中指定了输出节点(即使用了--out_nodes参数),转换成.om模型后无法查看算子的输出信息,则可以将.om模型转换成json格式后查看,使用命令为:
atc --mode=1 --om=$HOME/test/caffe_resnet50.om  --json=$HOME/test/out/resnet.json
2、for TensorFlow
atc --model=$HOME/test/resnet18_tensorflow.pb --framework=3 --output=$HOME/test/out/tf_resnet18 --soc_version=${soc_version} 
# 打印输出为以下结果则说明成功
ATC run success
3、for ONNX
atc --model=$HOME/test/resnet50.onnx --framework=5 --output=$HOME/test/out/onnx_resnet50 --soc_version=${soc_version}  
# 打印输出为以下结果则说明成功
ATC run success
4、for MindSpore
atc --model=$HOME/test/ReLU.pb --framework=1 --output=$HOME/test/out/ReLU_mindspore --soc_version=${soc_version}  
# 打印输出为以下结果则说明成功
ATC run success
5、for 单算子描述文件
# 以ATC运行用户登录开发环境,并将模型转换过程中用到的单算子描述文件(json格式)上传到开发环境$HOME/singleop/目录下,本章节以format为ND的GEMM单算子为例进行说明。
# 执行如下命令生成离线模型
atc --singleop=$HOME/singleop/gemm.json --output=$HOME/test/out/op_model --soc_version=${soc_version} 

# 若提示如下信息,则说明模型转换成功。
ATC run success

# 成功执行命令后,在output参数指定的路径下,可查看离线模型,例如: 0_GEMM_1_2_16_16_1_2_16_16_1_2_16_16_1_2_1_2_1_2_16_16.om。

# 其中生成的离线模型文件命名规则为:序号_opType_输入的描述(dataType_format_shape)_输出的描述(dataType_format_shape)。

# dataType以及format对应枚举值请从${install_path}/atc/include/graph/types.h文件中查看,枚举值从0开始依次递增

3.4 模型转换参数详解

1、前提约束

1、如果要将FasterRCNN等网络模型转成适配昇腾AI处理器的离线模型,则务必参见定制网络修改(Caffe)先修改prototxt模型文件。 2、支持原始框架类型为Caffe、TensorFlow、MindSpore、ONNX的模型转换,当原始框架类型为Caffe、MindSpore、ONNX时,输入数据类型为FP32、FP16 (通过设置入参–input_fp16_nodes实现,MindSpore框架不支持该参数)、UINT8(通过配置数据预处理实现);当原始框架类型为TensorFlow时,输入数据 类型为FP16、FP32、UINT8、INT32、INT64、BOOL(原始框架类型为TensorFlow时,不支持输入输出数据类型为INT64,需要用户自行将INT64的数据类型修改为INT32类型)。 3、当原始框架类型为Caffe时,模型文件(.prototxt)和权重文件(.caffemodel)的op name、op type必须保持名称一致(包括大小写)。 4、当原始框架类型为TensorFlow时,只支持FrozenGraphDef格式。 5、不支持动态shape的输入,例如:NHWC输入为[?,?,?,3]多个维度可任意指定数值。模型转换时需指定固定数值。 6、对于Caffe框架网络模型:输入数据最大支持四维,转维算子(reshape、expanddim等)不能输出五维。 7、模型中的所有层算子除const算子外,输入和输出需要满足dim!=0。 8、只支持算子规格说明中的算子,并需满足算子限制条件。

2、AIPP参数说明

aipp.cfg文件,使用atc --insert_op_conf==***.cfg

2.1.静态配置

​ 支持多组AIPP配置,不同模型可以进行不同AIPP处理。 使用related_input_rank参数标识,分别对模型第一个和第二个输入进行AIPP处理

aipp_op {
       aipp_mode : static
       related_input_rank : 0  # 标识对第几个参数做aipp
       src_image_size_w : 608
       src_image_size_h : 608
       crop : false
       input_format : YUV420SP_U8
       csc_switch : true
       rbuv_swap_switch : false
       matrix_r0c0 : 298
       matrix_r0c1 : 0
       matrix_r0c2 : 409
       matrix_r1c0 : 298
       matrix_r1c1 : -100
       matrix_r1c2 : -208
       matrix_r2c0 : 298
       matrix_r2c1 : 516
       matrix_r2c2 : 0
       input_bias_0 : 16
       input_bias_1 : 128
       input_bias_2 : 128
       mean_chn_0 : 104
       mean_chn_1 : 117
       mean_chn_2 : 123
}
aipp_op {
       aipp_mode : static
       related_input_rank : 1   # 标识对第几个参数做aipp
       src_image_size_w : 608
       src_image_size_h : 608
       crop : false
       input_format : YUV420SP_U8
       csc_switch : true
       rbuv_swap_switch : false
       matrix_r0c0 : 298
       matrix_r0c1 : 0
       matrix_r0c2 : 409
       matrix_r1c0 : 298
       matrix_r1c1 : -100
       matrix_r1c2 : -208
       matrix_r2c0 : 298
       matrix_r2c1 : 516
       matrix_r2c2 : 0
       input_bias_0 : 16
       input_bias_1 : 128
       input_bias_2 : 128
       mean_chn_0 : 104
       mean_chn_1 : 117
       mean_chn_2 : 123
}

​ 使用related_input_name参数标识,此处需要填写为模型输入的name(input对应的值)或者模型首层节点的输出(top参数对应的取值)

aipp_op {
       aipp_mode : static
      related_input_name : "data"  # 标识对第几个输入做aipp
       src_image_size_w : 608
       src_image_size_h : 608
       crop : false
       input_format : YUV420SP_U8
       csc_switch : true
       rbuv_swap_switch : false
       matrix_r0c0 : 298
       matrix_r0c1 : 0
       matrix_r0c2 : 409
       matrix_r1c0 : 298
       matrix_r1c1 : -100
       matrix_r1c2 : -208
       matrix_r2c0 : 298
       matrix_r2c1 : 516
       matrix_r2c2 : 0
       input_bias_0 : 16
       input_bias_1 : 128
       input_bias_2 : 128
       mean_chn_0 : 104
       mean_chn_1 : 117
       mean_chn_2 : 123
}
aipp_op {
       aipp_mode : static
      related_input_name : "im_info"   # 标识对第几个输入做aipp
       src_image_size_w : 608
       src_image_size_h : 608
       crop : false
       input_format : YUV420SP_U8
       csc_switch : true
       rbuv_swap_switch : false
       matrix_r0c0 : 298
       matrix_r0c1 : 0
       matrix_r0c2 : 409
       matrix_r1c0 : 298
       matrix_r1c1 : -100
       matrix_r1c2 : -208
       matrix_r2c0 : 298
       matrix_r2c1 : 516
       matrix_r2c2 : 0
       input_bias_0 : 16
       input_bias_1 : 128
       input_bias_2 : 128
       mean_chn_0 : 104
       mean_chn_1 : 117
       mean_chn_2 : 123
}
2.1.1 AIPP模板

注意: 1、aipp不支持resize操作; 2、aipp设置padding值时需注意取值范围(0,32)

# AIPP的配置以aipp_op开始,标识这是一个AIPP算子的配置,aipp_op支持配置多个
aipp_op {

#========================= 全局设置(start) ===========================================================================================================================================================
# aipp_mode指定了AIPP的模式,必须配置
# 类型:enum
# 取值范围:dynamic/static,dynamic 表示动态AIPP,static 表示静态AIPP
# aipp_mode: 

# related_input_rank参数为可选,标识对模型的第几个输入做AIPP处理,从0开始,默认为0。例如模型有两个输入,需要对第2个输入做AIPP,则配置related_input_rank为1。
# 类型: 整型
# 配置范围 >= 0
# related_input_rank: 0

# related_input_name参数为可选,标识对模型的第几个输入做AIPP处理,此处需要填写为模型输入的name(input对应的值)或者模型首层节点的输出(top参数对应的取值)。该参数只适用于Caffe网络模型,且不能与related_input_rank参数同时使用。
# 例如模型有两个输入,且输入name分别为data、im_info,需要对第二个输入做AIPP,则配置related_input_name为im_info。
# 类型:string
# 配置范围:无
# related_input_name: ""

#========================= 全局设置(end) =============================================================================================================================================================

#========================= 动态AIPP需设置,静态AIPP无需设置(start) ===================================================================================================================================
# 输入图像最大的size,动态AIPP必须配置(如果为动态batch场景,N为最大档位数的取值)
# 类型:int
# max_src_image_size: 0
# 若输入图像格式为YUV400_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 1。
# 若输入图像格式为YUV420SP_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 1.5。
# 若输入图像格式为XRGB8888_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 4。
# 若输入图像格式为RGB888_U8,则max_src_image_size>=N * src_image_size_w * src_image_size_h * 3。

# 是否支持旋转,保留字段,暂不支持该功能
# 类型:bool
# 取值范围:true/false,true表示支持旋转,false表示不支持旋转
# support_rotation: false
#========================= 动态AIPP需设置,静态AIPP无需设置(end) =======================================================================================================================================

#========================= 静态AIPP需设置,动态AIPP无需设置 (start)======================================================================================================================================
# 输入图像格式,可选
# 类型: enum
# 取值范围:YUV420SP_U8、XRGB8888_U8、RGB888_U8、YUV400_U8
# input_format :
# 说明:模型转换完毕后,在对应的*.om模型文件中,上述参数分别以1、2、3、4枚举值呈现。

# 原始图像的宽度、高度
# 类型:int32
# 取值范围 & 约束:宽度取值范围为[2,4096]或0;高度取值范围为[1,4096]或0,对于YUV420SP_U8类型的图像,要求原始图像的宽和高取值是偶数
# src_image_size_w :0
# src_image_size_h :0
# 说明:请根据实际图片的宽、高配置src_image_size_w和src_image_size_h;只有crop,padding功能都没有开启的场景,src_image_size_w和src_image_size_h才能取值为0或不配置,该场景下会取网络模型输入定义的w和h,并且网络模型输入定义的w取值范围为[2,4096],h取值范围为[1,4096]。
# C方向的填充值,保留字段,暂不支持该功能
# 类型: float16
# 取值范围:[-65504, 65504]
# cpadding_value :0.0

#========= crop参数设置(配置样例请参见AIPP配置 > Crop/Padding配置说明) =========
# AIPP处理图片时是否支持抠图
# 类型:bool
# 取值范围:true/false,true表示支持,false表示不支持
# crop :false

# 抠图起始位置水平、垂直方向坐标,抠图大小为网络输入定义的w和h
# 类型:int32
# 取值范围 & 约束: [0,4095]、对于YUV420SP_U8类型的图像,要求取值是偶数
# 说明:load_start_pos_w<src_image_size_w,load_start_pos_h<src_image_size_h
# load_start_pos_w :0
# load_start_pos_h :0

# 抠图后的图像size
# 类型:int32
# 取值范围 & 约束: [0,4096]、load_start_pos_w + crop_size_w <= src_image_size_w、load_start_pos_h + crop_size_h <= src_image_size_h
# crop_size_w :0
# crop_size_h :0
说明:若开启抠图功能,并且没有配置padding,该场景下crop_size_w和crop_size_h才能取值为0或不配置,此时抠图大小(crop_size[W|H])的宽和高取值来自模型文件--input_shape中的宽和高,并且--input_shape中的宽和高取值范围为[1,4096]。

# 抠图约束如下:
# 若input_format取值为YUV420SP_U8,则load_start_pos_w、load_start_pos_h必须为偶数。
# 若input_format取值为其他值,对load_start_pos_w、load_start_pos_h无约束。
# 若开启抠图功能,则src_image_size[W|H] >= crop_size[W|H]+load_start_pos[W|H]。


#================================== resize参数设置 ================================
# AIPP处理图片时是否支持缩放,保留字段,暂不支持该功能
# 类型:bool
# 取值范围:true/false,true表示支持,false表示不支持
resize :false
 
# 缩放后图像的宽度和高度,保留字段,暂不支持该功能
# 类型:int32
# 取值范围 & 约束:resize_output_h:[16,4096]或0;resize_output_w:[16,1920]或0;resize_output_w/resize_input_w∈[1/16,16]、resize_output_h/resize_input_h∈[1/16,16]
resize_output_w :0
resize_output_h :0
# 说明:若开启了缩放功能,并且没有配置padding,该场景下resize_output_w和resize_output_h才能取值为0或不配置,此时缩放后图像的宽和高取值来自模型文件--input_shape中的宽和高,并且--input_shape中的高取值范围为[16,4096],宽取值范围为[16,1920]。


#======== padding参数设置(配置样例请参见AIPP配置 > Crop/Padding配置说明) =========
# AIPP处理图片时padding使能开关
# 类型:bool
# 取值范围:true/false,true表示支持,false表示不支持
# padding :false
 
# H和W的填充值,静态AIPP配置(left_padding_size、right_padding_size、top_padding_size、bottom_padding_size 取值范围为[0,32])
# 类型: int32
# left_padding_size :0
# right_padding_size :0
# top_padding_size :0
# bottom_padding_size :0
# AIPP经过padding后,输出的H和W要与模型需要的H和W保持一致,其中W取值要<=1080。


#================================ rotation参数设置 ==================================
# AIPP处理图片时的旋转角度,保留字段,暂不支持该功能
# 类型:uint8
# 范围:{0, 1, 2, 3} 0不旋转,1顺时针90°,2顺时针180°,3顺时针270°
# rotation_angle :0


#========= 色域转换参数设置(配置样例请参见AIPP配置 > 色域转换配置说明) =============
# 色域转换开关,静态AIPP配置
# 类型:bool
# 取值范围:true/false,true表示开启色域转换,false表示关闭
# csc_switch :false

# R通道与B通道交换开关/U通道与V通道交换开关
# 类型:bool
# 取值范围:true/false,true表示开启通道交换,false表示关闭
# rbuv_swap_switch :false

# RGBA->ARGB, YUVA->AYUV交换开关
# 类型:bool
# 取值范围:true/false,true表示开启,false表示关闭
# ax_swap_switch :false

# 单行处理模式(只处理抠图后的第一行)开关,保留字段,暂不支持该功能
# 类型:bool
# 取值范围:true/false,true表示开启单行处理模式,false表示关闭
# single_line_mode :false

# 若色域转换开关为false,则本功能不起作用。
# 若输入图片通道数为4,则忽略A通道或X通道。
# YUV转BGR:
# | B |   | matrix_r0c0 matrix_r0c1 matrix_r0c2 | | Y - input_bias_0 |
# | G | = | matrix_r1c0 matrix_r1c1 matrix_r1c2 | | U - input_bias_1 | >> 8
# | R |   | matrix_r2c0 matrix_r2c1 matrix_r2c2 | | V - input_bias_2 |
# BGR转YUV:
# | Y |   | matrix_r0c0 matrix_r0c1 matrix_r0c2 | | B |        | output_bias_0 |
# | U | = | matrix_r1c0 matrix_r1c1 matrix_r1c2 | | G | >> 8 + | output_bias_1 |
# | V |   | matrix_r2c0 matrix_r2c1 matrix_r2c2 | | R |        | output_bias_2 |

# 3*3 CSC矩阵元素
# 类型:int16
# 取值范围:[-32677 ,32676] 
# matrix_r0c0 :298
# matrix_r0c1 :516
# matrix_r0c2 :0
# matrix_r1c0 :298
# matrix_r1c1 :-100
# matrix_r1c2 :-208
# matrix_r2c0 :298
# matrix_r2c1 :0
# matrix_r2c2 :409

# RGB转YUV时的输出偏移
# 类型:uint8
# 取值范围:[0, 255]
# output_bias_0 :16
# output_bias_1 :128
# output_bias_2 :128

# YUV转RGB时的输入偏移
# 类型:uint8
# 取值范围:[0, 255]
# input_bias_0 :16
# input_bias_1 :128
# input_bias_2 :128


#============================== 减均值、乘系数设置 =================================
# 计算规则如下:
# 当uint8->uint8时,本功能旁路
# 当uint8->fp16时,pixel_out_chx(i) = [pixel_in_chx(i) – mean_chn_i – min_chn_i] * var_reci_chn

# 每个通道的均值
# 类型:uint8
# 取值范围:[0, 255]
# mean_chn_0 :0
# mean_chn_1 :0
# mean_chn_2 :0
# mean_chn_3 :0

# 每个通道的最小值
# 类型:float16
# 取值范围:[0, 255]
# min_chn_0 :0.0
# min_chn_1 :0.0
# min_chn_2 :0.0
# min_chn_3 :0.0

# 每个通道的方差
# 类型:float16
# 取值范围:[-65504, 65504]
# var_reci_chn_0 :1.0
# var_reci_chn_1 :1.0
# var_reci_chn_2 :1.0
# var_reci_chn_3 :1.0
}

#========================= 静态AIPP需设置,动态AIPP无需设置 (end)=====================================================================================================================================
2.1.2 单batch+固定shape+静态AIPP+单模型推理

只需要在使用ATC模型转换时加上参数–insert_op_conf==***.cfg,其余操作不变。

静态AIPP进行ONNX模型转换时,ONNX模型输入必须是NCHW(我在转换NHWC时转换不成功,报错信息是ONNX不支持NHWC)

静态AIPP模型转换后进行正常的推理操作,组内代码不需要进行变动。

2.动态AIPP配置

动态AIPP场景下,用户无需手动配置csc_switch、rbuv_swap_switch等参数,根据如下配置文件配置好相关参数后,模型转换时,ATC会为动态AIPP新增一个模型输入

aipp_op
{
    aipp_mode: dynamic
    related_input_rank: 0       # 标识对第几个参数做aipp
    max_src_image_size: 752640  # 输入图像最大的size,参数必填
}
aipp_op
{
    aipp_mode: dynamic
    related_input_rank: 1         # 标识对第几个参数做aipp
    max_src_image_size: 752640    # 输入图像最大的size,参数必填
}
2.2.1 动态AIPP

1.单动态AIPP输入

​ 申请动态AIPP输入对应的内存前,需要先调用aclmdlGetInputIndexByName接口根据输入名称(固定为ACL_DYNAMIC_AIPP_NAME)获取模型中标识动态AIPP输入的index。

#define ACL_DYNAMIC_AIPP_NAME "ascend_dynamic_aipp_data"

调用aclrtMalloc接口根据上一步的大小申请内存。申请动态AIPP输入对应的内存后,无需用户设置内存中的数据,用户调用aclmdlSetInputAIPP中的接口后,系统会自动向内存中填入数据。

在成功加载模型之后,执行模型之前,设置动态AIPP参数

  1. 根据输入名称(固定为ACL_DYNAMIC_AIPP_NAME),获取模型中标识动态AIPP输入的index。

  2. 调用aclmdlCreateAIPP接口创建aclmdlAIPP类型。

  3. 根据实际需求,调用aclmdlAIPP数据类型下的操作接口设置动态AIPP参数值。

    动态AIPP场景下,aclmdlSetAIPPInputFormat接口、aclmdlSetAIPPSrcImageSize接口(设置原始图片的宽和高)必须调用。

  4. 调用aclmdlSetInputAIPP接口设置模型推理时的动态AIPP数据。

  5. 及时调用aclmdlDestroyAIPP接口销毁aclmdlAIPP类型。

2.多动态AIPP输入

多个动态AIPP输入与单个动态AIPP输入的不同点如下:

  • 需调用aclmdlGetAippType接口查询指定模型的指定输入是否有关联的动态AIPP输入,若有,则输出标识动态AIPP输入的index,该参数值可作为aclmdlSetAIPPByInputIndex接口的入参之一,来设置对应输入上的动态AIPP参数值。
  • 为避免在错误的输入上设置动态AIPP参数,用户可调用aclmdlGetInputNameByIndex接口先获取指定输入index的输入名称,根据输入名称所对应的index设置动态AIPP参数。

动态AIPP通过模型在转换后所有的图像操作在代码里修改参数进行操作。 建议使用静态AIPP进行图像预处理

四、DVPP使用

4.1 不同Atlas芯片支持的媒体数据处理功能差异

  • 说明如下表:
功能说明支持芯片
[batchcrop]crop接口,抠图,一图多框Ascend310,Ascend710,Ascend910
[crop]crop接口,从输入图片中抠出需要用的图片区域Ascend310
[cropandpaste]cropandpaste接口,从输入图片中抠出来的图,对抠出的图进行缩放后,放在用户输出图片的指定区域Ascend310
[ffmpegdecode]调用ffmpeg接口实现视频切帧功能样例Ascend310
[jpegd]jpegd接口,实现.jpg、.jpeg、.JPG、.JPEG图片的解码Ascend310
[jpege]jpege接口,将YUV格式图片编码成JPEG压缩格式的图片文件Ascend310
[resize]resize接口。针对图像做缩放操作Ascend310
[smallResolution_cropandpaste]cropandpaste接口。对指定输入图片进行抠图,再贴图到输出图片中Ascend310,Ascend710,Ascend910
[vdec]vdec接口,实现视频的解码,输出YUV420SP格式(包括NV12和NV21)的图片Ascend310
[vdecandvenc]vdec接口和venc接口,调用dvpp的venc和vdec接口,实现视频编码功能Ascend310
[venc]venc接口,将原始mp4文件数据编码成H264/H265格式的视频码流Ascend310
[venc_image]venc接口,将一张YUV420SP NV12格式的图片连续编码n次,生成一个H265格式的视频码流Ascend310,Ascend710
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值