DLAP221开发环境部署

DLAP221开发环境部署

1. 概述

开发者基于DLAP221进行AI应用开发前,需要在制作SD卡时准备的Ubuntu服务器中部署开发环境,有以下三种场景:

  • 独立部署开发套件包,基于后台命令行的方式进行交叉开发。

  • 部署MindStudio,基于MindStudio开发工具进行AI应用开发,MindStudio安装时需要同时安装开发套件包(Cann Toolkit)。Cann Toolkit为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的人工智能算法开发。

    MindStudio在Cann Toolkit的基础上进行了工具集成,为用户提供了简洁、友好的工程管理、代码编写、编译、模型转换、日志和性能分析等功能。
    MindStudio与Cann Toolkit的架构图如下所示。
    图1 MindStudio与Cann Toolkit架构图
    DLAP221开发环境部署_第1张图片
    开发套件包中的组件功能如下所示:

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

2. 独立部署开发套件包

软件安装前,请首先获取以下软件包,*{version}*表示软件包版本号,版本号需要保持一致。

名称 软件包 获取链接 功能描述
开发套件包 Ascend-cann-toolkit_{version}_linux-x86_64.run 获取链接请从“CANN软件包”中选择对应版本的软件包下载。支持的CANN版本请参见版本配套说明。 主要用于用户开发应用、自定义算子和模型转换。开发套件包包含开发应用程序所需的库文件、开发辅助工具(如ATC模型转换工具)。两种架构包统一安装:开发环境为x86架构,但运行环境是arm架构,所以再安装一个arm64的开发套件包,用于应用的交叉编译。
Ascend-cann-toolkit_{version}_linux-aarch64.run 获取链接请从“CANN软件包”中选择对应版本的软件包下载。支持的CANN版本请参见版本配套说明。

2.1配置Ubuntu X86系统

检查root用户的umask

  1. 以root用户登录安装环境。

  2. 检查root用户的umask值。

    umask
    
  3. 如果umask不等于0022,请执行如下操作配置,在该文件的最后一行添加umask 0022后保存。

    vi ~/.bashrc
    source ~/.bashrc
    

创建安装用户

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

  1. 创建非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
    
  2. 设置非root用户密码。

    passwd username
    

    示例如下:

    passwd HwHiAiUser
    

    说明

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

配置安装用户权限

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

  1. 以root用户打开
    “/etc/sudoers”
    文件:
    chmod u+w /etc/sudoers
    vi /etc/sudoers
    
  2. 在该文件
    “# 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”**为开发套件包的安装用户。
    须知:
    • 请确保“/etc/sudoers”文件的最后一行为**“#includedir /etc/sudoers.d”**,如果没有该信息,请手动添加。
    • 用户在安装完开发套件包后,可自行取消sudo权限。
    • 用户在卸载或升级开发套件包时,也需要配置以上用户权限。
  3. 添加完成后,执行**:wq!**保存文件。
  4. 执行以下命令取消
    “/etc/sudoers”
    文件的写权限:
    chmod u-w /etc/sudoers
    

检查源

开发套件包安装过程需要下载相关依赖,请确保安装环境能够连接网络。

请在root用户下执行如下命令检查源是否可用。

apt-get update

如果命令执行报错或者后续安装依赖时等待时间过长甚至报错,则检查网络是否连接或者把“/etc/apt/sources.list”文件中的源更换为可用的源或使用镜像源(以配置华为镜像源为例,可参考华为开源镜像站)。如需配置网络代理,请参见配置系统网络代理。

安装依赖

说明:

请使用开发套件包安装用户执行以下命令安装依赖。

  1. 检查系统是否安装python依赖以及gcc等软件。

    分别使用如下命令检查是否安装gcc,make以及python依赖软件等。

    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 libbz2-dev| grep libbz2-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 libxslt1-dev| grep libxslt1-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
    

    若分别返回如下信息则说明已经安装,进入下一步(以下回显仅为示例,请以实际情况为准)。

    gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
    g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
    GNU Make 4.1
    cmake version 3.10.2
    zlib1g:amd64   1:1.2.11.dfsg-0ubuntu2 amd64        compression library - runtime
    zlib1g-dev:amd64  1:1.2.11.dfsg-0ubuntu2  amd64        compression library - development
    libbz2-dev:amd64    1.0.6-8.1ubuntu0.2 amd64        high-quality block-sorting file compressor library - development
    libsqlite3-dev:amd64    3.22.0-1ubuntu0.3 amd64        SQLite 3 development files
    openssl        1.1.1-1ubuntu2.1~18.04.6 amd64        Secure Sockets Layer toolkit - cryptographic utility
    libssl-dev:amd64    1.1.1-1ubuntu2.1~18.04.6 amd64        Secure Sockets Layer toolkit - development files
    libxslt1-dev:amd64 1.1.29-5ubuntu0.2 amd64        XSLT 1.0 processing library - development kit
    libffi-dev:amd64 3.2.1-8      amd64        Foreign Function Interface library (development files)
    unzip          6.0-21ubuntu1 amd64        De-archiver for .zip files
    pciutils       1:3.5.2-1ubuntu1 amd64        Linux PCI Utilities
    net-tools      1.60+git20161116.90da8a0-1ubuntu1 amd64        NET-3 networking toolkit
    

    否则请执行如下安装命令(如果只有部分软件未安装,则如下命令修改为只安装还未安装的软件即可):

    sudo apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev libbz2-dev libsqlite3-dev libssl-dev libxslt1-dev libffi-dev unzip pciutils net-tools libncursesw5-dev 
    

    说明:

    libsqlite3-dev需要在python安装之前安装,如果用户操作系统已经安装python3.7.5环境,在此之后再安装libsqlite3-dev,则需要重新编译python环境。

  2. 检查系统是否安装python开发环境。

    开发套件包依赖python环境,分别使用命令python3.7.5 --versionpip3.7.5 --version检查是否已经安装,如果返回如下信息则说明已经安装,进入下一步。

    Python 3.7.5
    pip 19.2.3 from /usr/local/python3.7.5/lib/python3.7/site-packages/pip (python 3.7)
    

    否则请根据如下方式安装python3.7.5。

    1. 使用wget下载python3.7.5源码包,可以下载到

      开发环境

      任意目录,命令为:

      wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
      
    2. 进入下载后的目录,解压源码包,命令为:

      tar -zxvf Python-3.7.5.tgz
      
    3. 进入解压后的文件夹,执行配置、编译和安装命令:

      cd Python-3.7.5
      ./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared
      make
      sudo make install
      

      其中**“–prefix”参数用于指定python安装路径,用户根据实际情况进行修改,“–enable-shared”参数用于编译出libpython3.7m.so.1.0动态库,“–enable-loadable-sqlite-extensions”**参数用于加载libsqlite3-dev依赖。

      本手册以–prefix=/usr/local/python3.7.5路径为例进行说明。执行配置、编译和安装命令后,安装包在/usr/local/python3.7.5路径,libpython3.7m.so.1.0动态库在/usr/local/python3.7.5/lib/libpython3.7m.so.1.0路径。

    4. 执行如下命令设置软链接:

      sudo ln -s /usr/local/python3.7.5/bin/python3 /usr/local/python3.7.5/bin/python3.7.5
      sudo ln -s /usr/local/python3.7.5/bin/pip3 /usr/local/python3.7.5/bin/pip3.7.5
      
    5. 设置python3.7.5环境变量。

      1. 以安装用户在任意目录下执行

        vi ~/.bashrc

        命令,打开

        .bashrc

        文件,在文件最后一行后面添加如下内容。

        #用于设置python3.7.5库文件路径
        export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
        #如果用户环境存在多个python3版本,则指定使用python3.7.5版本
        export PATH=/usr/local/python3.7.5/bin:$PATH
        
      2. 执行**:wq!**命令保存文件并退出。

      3. 执行source ~/.bashrc命令使其立即生效。

    6. 安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。

      python3.7.5 --version
      pip3.7.5  --version
      python3.7 --version
      pip3.7  --version
      
  3. 安装Python3相关依赖。

    安装前请先使用pip3.7.5 list命令检查是否安装相关依赖,若已经安装,则请跳过该步骤;若未安装,则安装命令如下(如果只有部分软件未安装,则如下命令修改为只安装还未安装的软件即可)。其中:toolkit包中算子比对工具依赖:protobuf、scipy。

    pip3.7.5 install attrs --user
    pip3.7.5 install psutil --user
    pip3.7.5 install decorator --user
    pip3.7.5 install numpy --user
    pip3.7.5 install protobuf==3.11.3 --user
    pip3.7.5 install scipy --user
    pip3.7.5 install sympy --user
    pip3.7.5 install cffi --user
    

    如果执行上述命令时无法连接网络,且提示“Could not find a version that satisfies the requirement xxx”,请参见使用pip3.7.5 install软件时提示" Could not find a version that satisfies the requirement xxx"解决。

2.2 安装开发套件包

前提条件

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

安装步骤

  1. 以套件包安装用户登录开发环境。

  2. 上传获取软件包所获取的开发套件包到系统任意路径,并进入套件包所在路径。

  3. 执行如下命令为安装包增加可执行权限。

    chmod +x *.run
    *****表示开发套件包名,请用户根据实际替换。

  4. 执行如下校验安装包的一致性和完整性。

    ./Ascend-cann-toolkit_{version}linux-x86_64.run --check
    ./Ascend-cann-toolkit
    {version}_linux-aarch64.run --check

  5. 执行以下命令安装软件。

  • 使用默认路径安装:

     ./Ascend-cann-toolkit_{version}_linux-x86_64.run --install
     ./Ascend-cann-toolkit_{version}_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*}***为指定的安装路径,请用户先创建文件夹自行替换。

    更多安装参数请参见参数说明。

安装路径说明

默认路径请参见以下表 软件包安装路径。

项目 路径
软件包默认安装路径 非root用户:“${HOME}/Ascend/ascend-toolkit/latest”root用户:“/usr/local/Ascend/ascend-toolkit/latest”
详细日志路径 非root用户:“${HOME}/var/log/ascend_seclog/ascend_toolkit_install.log”root用户:“/var/log/ascend_seclog/ascend_toolkit_install.log”
软件包版本、CPU架构、GCC版本和安装路径等信息的记录路径 “${HOME}/Ascend/ascend-toolkit/latest/*{arch}-*linux/ascend_toolkit_install.info”
参数 含义
${HOME} 当前用户目录。例如:"/home/xxxx"
*{arch}-*linux 形态目录,以软件包的CPU架构、Linux分支的组合命名。例如:“x86_64-linux”

2.3 安装后处理

配置交叉编译环境

因为开发环境与运行环境的架构不同,所以需要在开发环境安装交叉编译工具,具体如表1所示:

开发环境架构 运行环境架构 编译环境配置
x86_64 aarch64 请使用软件包的安装用户,在开发环境执行aarch64-linux-gnu-g++ --version命令检查是否已安装g++交叉编译器,若有如下回显信息,则表示已经安装。
aarch64-linux-gnu-g++ (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0
若未安装g++交叉编译器,则需要进行安装,安装命令示例如下(以下命令仅为示例,请用户根据实际情况替换):
sudo apt-get install g+±aarch64-linux-gnu<>

配置环境变量

安装完成后,需要设置如下环境变量才能进行正常开发流程(如下环境变量中${install_path}以软件包使用默认安装路径为例进行说明):

通过export方式设置环境变量,该种方式设置的环境变量只在当前窗口有效,设置完成后立即生效。

export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/latest     # 以安装用户为HwHiAiUser为例
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

​ 用户也可以通过修改~/.bashrc文件方式设置永久环境变量,如下以bash shell为例进行说明:

  1. 以安装用户在任意目录下执行vi ~/.bashrc命令,打开**.bashrc**文件,在文件最后一行后面添加上述内容。
  2. 执行**:wq!**命令保存文件并退出。
  3. 执行source ~/.bashrc命令使其立即生效。

3. 创建sysroot

3.1 创建ssh密钥

如果您还没有 ssh 密钥,请生成一个并将其安装在DLAP221上,这样您就不用接收密码请求,也不需要在每次执行 rsync 命令时输入用户名和密码。

$ ssh-keygen -t rsa			#运行此命令,后续的提示可以直接回车
Generating public/private rsa key pair.
Enter file in which to save the key (/home/HwHiAiUser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/HwHiAiUser/.ssh/id_rsa.
Your public key has been saved in /home/HwHiAiUser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:YxUf/fq7k0l2cIjwgjP5gFz6+mRuC2fwkYJhQT0CtSU HwHiAiUser@CN05508NB01
The key's randomart image is:
+---[RSA 2048]----+
|  .+E..   . ..   |
|    .=o . .o ..  |
|    +o = o.o.. o |
|   . o+ *o. o o o|
|    . o.S= .   + |
|       =.o.   .o.|
|      ..*     o.+|
|      .B.      +.|
|       o+.     o+|
+----[SHA256]-----+

将生成的公钥上传到DLAP221设备的HwHiAiUser用户下:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub HwHiAiUser@<您的DLAP221 IP地址>
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/HwHiAiUser/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'HwHiAiUser@<您的DLAP221 IP地址>'"
and check to make sure that only the key(s) you wanted were added.

3.2 修改用户的sudo属性

为了在运行rsync时不出现以下错误信息,我们需要修改HwHiAiUser的sudo属性。

sudo: no tty present and no askpass program specified
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [Receiver=3.1.2]

修改DLAP221设备的HwHiAiUser用户的sudo权限,改为如下:

vim /etc/sudoers
#includedir /etc/sudoers.d
HwHiAiUser      ALL=(ALL:ALL) NOPASSWD:ALL #将HwHiAiUser属性改成不需要输密码

3.3 提取库文件和头文件

从DLAP221的系统中提取库文件和头文件,创建一个脚本:extract_sysroot.sh,内容如下:

#!/bin/bash
mkdir -p sysroot/usr/local/opencv
mkdir -p sysroot/usr/local/ffmpeg/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:/lib sysroot/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:/usr/include sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:/usr/lib sysroot/usr/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:~/ascend_ddk/arm/lib sysroot/usr/local/opencv/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:~/ascend_ddk/arm/include sysroot/usr/local/opencv/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:/usr/local/ffmpeg/include sysroot/usr/local/ffmpeg/
rsync -avz --rsync-path="sudo rsync" --delete HwHiAiUser@<您的DLAP221设备IP地址>:/usr/local/ffmpeg/lib sysroot/usr/local/ffmpeg/

赋予脚本执行权限,并在你的PC上执行

chmod +x extract_sysroot.sh
./extract_sysroot.sh

现在我们还需要清理 rsync 操作复制的符号链接,以便指向正确的原始文件。这个可供下载的 Python 小脚本可以解决此问题:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py

让脚本处于可执行状态,然后调用该脚本:

chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

修改PC端的~/.bashrc文件,添加以下环境变量指向sysroot的ffmpeg和opencv。

#FFMPEG
export FFMPEG_PATH=/home/HwHiAiUser/sysroot/usr/local/ffmpeg
export LD_LIBRARY_PATH=$FFMPEG_PATH/lib:$LD_LIBRARY_PATH

#OpenCV
export OPENCV_PATH=/home/HwHiAiUser/sysroot/usr/local/opencv
export LD_LIBRARY_PATH=$OPENCV_PATH/lib:$LD_LIBRARY_PATH

4. 交叉编译工程并部署

现在以InferOfflineVideo这个工程来演示如何编译和部署。

4.1 下载APISamples样例库

cd /home/HwHiAiUser
mkdir workspace
cd workspace
git clone https://gitee.com/shiner-chen/APISamples.git

4.2 添加cross.cmake 文件

按如下方式在InferOfflineVideo工程目录下添加一个cross.cmake文件。

cd APISamples/src/Samples/InferOfflineVideo
vim cross.cmake

添加以下内容到cross.cmake文件

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(SYSROOT_PATH  /home/HwHiAiUser/sysroot/)  ##此处修改为您生成的sysroot目录
set(CMAKE_SYSROOT "${SYSROOT_PATH}")
message(STATUS  "Using sysroot path as ${SYSROOT_PATH}")

set(TOOLCHAIN_HOST /usr/bin/aarch64-linux-gnu) ##此处修改为您安装的交叉编译器的路径

set(TOOLCHAIN_CC "${TOOLCHAIN_HOST}-gcc")
set(TOOLCHAIN_CXX "${TOOLCHAIN_HOST}-g++")

set(CMAKE_C_COMPILER ${TOOLCHAIN_CC})
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_CXX})

include_directories(${SYSROOT_PATH}/usr/include/aarch64-linux-gnu) ##添加sysroot下的头文件目录
link_directories(${SYSROOT_PATH}/usr/lib ${SYSROOT_PATH}/lib)  ##添加sysroot下的库文件目录

#add_link_options("LINKER:-rpath-link,/home/HwHiAiUser/workspace/sysroot_making_log/squashfs-root/usr/lib/aarch64-linux-gnu:/home/HwHiAiUser/workspace/sysroot_making_log/squashfs-root/usr/lib/aarch64-linux-gnu/")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

4.3 修改和添加相关文件

在CMakeLists.txt文件中添加对cross.cmake的引用

# Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
cmake_minimum_required(VERSION 3.5.1)
project(InferOfflineVideo)

set(PROJECT_SRC_ROOT ${CMAKE_CURRENT_LIST_DIR})
include(cross.cmake) 							##此处添加对cross.cmake文件的引用
set(CMAKE_MODULE_PATH ${PROJECT_SRC_ROOT}/CMake)
set(CMAKE_SKIP_BUILD_RPATH True)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SRC_ROOT}/dist)

add_compile_options(-std=c++11 -fPIE -fstack-protector-all -Wall)
add_definitions(-DENABLE_DVPP_INTERFACE)
add_definitions(-DASCEND_MODULE_USE_ACL)

# Check environment variable
if(NOT DEFINED ENV{ASCEND_HOME})
    message(FATAL_ERROR "please define environment variable:ASCEND_HOME")
endif()

# Set include directory and library directory
if (NOT DEFINED ENV{FFMPEG_PATH})
    message(FATAL_ERROR "Please define FFMPEG_PATH first!")
else()
    #message("FFMPEG_PATH $ENV{FFMPEG_PATH}")
    set(FFMPEG_PATH $ENV{FFMPEG_PATH})
endif()

.......

修改build.sh文件

..... ## 此处 省略若干行
# copy config file and model into dist
if [ ! -d dist ]; then
    echo "Build failed, dist directory does not exist."
    exit 1
fi

rm -rf ./dist/data
mkdir ./dist/data
cp ./data/*.264 ./dist/data				##添加拷贝测试视频到dist/data,以便于部署时一并拷贝到DLAP221上
mkdir -p ./dist/data/models/label
if [ ${model_type} -eq 1 ]; then
    mkdir ./dist/data/config
    cp -r ./data/config/yolov5/* ./dist/data/config
    mkdir -p ./dist/data/models/yolov5
    cp ./data/models/yolov5/coco.names ./dist/data/models/label
    om_num=$(ls ./data/models/yolov5/*.om 2>/dev/null |wc -l)
    if [ ${om_num} -eq 0 ]; then
        echo "[Warning] No .om file in ./data/models/yolov5, please convert the model to .om file first."
    else
        cp ./data/models/yolov5/*.om ./dist/data/models/yolov5
    fi
else
... ## 此处 省略若干行

修改data/config/yolov5/setup.config文件

# configuration for the system
SystemConfig.deviceId = 0
SystemConfig.channelCount = 1
#stream url, the number is SystemConfig.channelCount
stream.ch0 = ./data/0_720P_25.264  			 ##修改此处,指向实际的测试文件
#stream.ch1 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264
#stream.ch2 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264
#stream.ch3 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264
#stream.ch4 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264
#stream.ch5 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264
#stream.ch6 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264
#stream.ch7 = rtsp://xxx.xxx.xxx.xxx:xxxx/input.264

VideoDecoder.resizeWidth = 640
VideoDecoder.resizeHeight = 640

ModelInfer.modelWidth = 640
ModelInfer.modelHeight = 640
ModelInfer.modelName = YoloV5
ModelInfer.modelType = 2 # 0: YoloV3 Caffe, 1: YoloV3 Tensorflow, 2: Yolov5 Pytorch
ModelInfer.modelPath = ./data/models/yolov5/yolov5s_640.om

skipInterval = 5 # One frame is selected for inference every  frames

在工程目录下创建部署脚本deploy.sh,内容如下:

#!/bin/bash
rsync -avz --rsync-path="sudo rsync" dist [email protected]:~/deploy ## 注意修改ip地址为您的设备IP地址,并事先在DLAP221上创建好deploy目录

4.4 编译工程

运行如下命令编译工程

bash build.sh YOLOV5 #因为工程代码中已经包含了yolov5s的模型文件,为方便起见,此处编译YOlOV5的演示demo
Set ASCEND_VERSION to the default value: ascend-toolkit/latest
ARCH_PATTERN is set to arm64-linux by user, reset it to arm64-linux/acllib
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using sysroot path as /home/HwHiAiUser/sysroot/
-- Configuring done
-- Generating done
-- Build files have been written to: /home/HwHiAiUser/workspace/APISamples/src/Samples/InferOfflineVideo/build
Scanning dependencies of target main
[  4%] Building CXX object CMakeFiles/main.dir/Module/StreamPuller/StreamPuller.cpp.o
[  9%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[ 14%] Building CXX object CMakeFiles/main.dir/Common/Singleton.cpp.o
[ 19%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/ErrorCode/ErrorCode.cpp.o
[ 23%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/Common/PostProcess/Yolo/src/Yolov5Post.cpp.o
[ 28%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/FileManager/FileManager.cpp.o
[ 33%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/DvppCommon/DvppCommon.cpp.o
[ 38%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/Framework/ModuleManager/ModuleBase.cpp.o
[ 42%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/Log/Log.cpp.o
[ 47%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/Framework/ModuleManager/ModuleManager.cpp.o
[ 52%] Building CXX object CMakeFiles/main.dir/Module/VideoDecoder/VideoDecoder.cpp.o
[ 57%] Building CXX object CMakeFiles/main.dir/Module/ModelInfer/ModelInfer.cpp.o
[ 61%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/AsynLog/AsynLog.cpp.o
[ 66%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/Statistic/Statistic.cpp.o
[ 71%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/ConfigParser/ConfigParser.cpp.o
[ 76%] Building CXX object CMakeFiles/main.dir/Module/PostProcess/PostProcess.cpp.o
[ 80%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/Common/PostProcess/Yolo/src/Yolov3Post.cpp.o
[ 85%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/Framework/ModelProcess/ModelProcess.cpp.o
[ 90%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/CommandParser/CommandParser.cpp.o
[ 95%] Building CXX object CMakeFiles/main.dir/home/HwHiAiUser/workspace/APISamples/src/Samples/ascendbase/src/Base/ResourceManager/ResourceManager.cpp.o
[100%] Linking CXX executable ../dist/main
[100%] Built target main

确认编译结果,看看否是生成ARM64架构的执行文件

file dist/main
dist/main: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=6f08748925546d393c26d5826a163688167b3363, stripped

结果中有:ARM aarch64 表示交叉编译成功!

4.5 部署工程

运行deploy.sh将工程部署到DLAP221上执行

./deploy.sh
sending incremental file list
dist/
dist/main
dist/data/
dist/data/0_720P_25.264
dist/data/config/
dist/data/config/acl.json
dist/data/config/setup.config
dist/data/models/
dist/data/models/label/
dist/data/models/label/coco.names
dist/data/models/yolov5/
dist/data/models/yolov5/yolov5s_640.om

sent 649 bytes  received 74,313 bytes  29,984.80 bytes/sec
total size is 58,789,368  speedup is 784.26

4.6 执行工程

登录到DLAP221设备,工程部署到了/home/HwHiAiUser/deploy/dist目录下

cd /home/HwHiAiUser/deploy/dist
ls 
data  logs  main  result
./main ##运行程序,显示以下内容代表程序运行正常
[Info ][2021-09-30 16:32:09:966370][main.cpp InitModuleManager:61] InitModuleManager begin
[Info ][2021-09-30 16:32:09:966797][main.cpp InitModuleManager:79] ModuleManager: begin to init
[Info ][2021-09-30 16:32:10:002617][ResourceManager.cpp InitResource:75] Initialized acl successfully.
[Info ][2021-09-30 16:32:10:070226][ResourceManager.cpp InitResource:84] Open device 0 successfully.
[Info ][2021-09-30 16:32:10:071830][ResourceManager.cpp InitResource:91] Created context for device 0 successfully
[Info ][2021-09-30 16:32:10:071967][ResourceManager.cpp InitResource:102] Init resource successfully.
[Info ][2021-09-30 16:32:10:072243][VideoDecoder.cpp Init:144] thread create ID = 281470262304528
[Info ][2021-09-30 16:32:10:072395][VideoDecoder.cpp DecoderThread:107] DecoderThread start
[Info ][2021-09-30 16:32:10:085122][ModelProcess.cpp Init:240] ModelProcess:Begin to init instance.
[Info ][2021-09-30 16:32:10:359338][PostProcess.cpp Init:99] Loaded label successfully.
[Info ][2021-09-30 16:32:10:359597][ModuleManager.cpp RunPipeline:247] ModuleManager: begin to run pipeline.
[Info ][2021-09-30 16:32:10:359984][ModuleManager.cpp RunPipeline:268] ModuleManager: run pipeline success.
[Info ][2021-09-30 16:32:10:360081][main.cpp main:131] wait for exit signal
Input #0, h264, from './data/0_720P_25.264':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1200k tbn, 50 tbc
[Info ][2021-09-30 16:32:10:405054][StreamPuller.cpp StartStream:108] Start the stream......
[Info ][2021-09-30 16:32:10:407181][DvppCommon.cpp InitVdec:205] Vdec init resource successfully.
[Info ][2021-09-30 16:32:10:480942][VideoDecoder.cpp VideoDecoderCallBack:76] [Channel:0 Frame:0] Decode cost time(ms):5.50032
... #此处省略若干log!!

3. 部署MindStudio(可选)

若您想基于MindStudio开发工具进行AI应用开发,需要额外在开发环境中部署MindStudio工具包,操作步骤如下:

  1. 请单击下载链接下载MindStudio安装包。
  2. 请参见安装MindStudio章节中的“操作步骤”,解压安装包,执行安装脚本进行安装。

除非开发算子,否则不推荐用MindStudio来开发AI推理应用!!

4. 在线开发环境

所谓在线开发环境就是指直接在DLAP221上安装开发套件包,进行开发,直接在DLAP221上编译与运行程序。此处与独立部署开发套件包不一样的是,不需要安装Ascend-cann-toolkit_{version}_linux-x86_64.run包。

4.1 安装开发套件

登录到DLAP221设备,将Ascend-cann-toolkit_{version}_linux-aarch64.run上传到/home/HwHiAiUser目录,运行以下命令安装:

./Ascend-cann-toolkit_*{version}*_linux-aarch64.run --install --chip=Ascend310

如果安装报写文件权限错,可以尝试以sudo方式安装:

sudo ./Ascend-cann-toolkit_*{version}*_linux-aarch64.run --install --chip=Ascend310

4.2 修改环境变量

根据开发套件包安装的路径,修改以下环境变量的路径并添加到/home/HwHiAiUser/.bashrc文件,注意注释掉文件中已有的环境变量:

export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/acllib/lib64:/usr/lib64
export PYTHONPATH=/home/HwHiAiUser/Ascend/pyACL/python/site-packages/acl
export ASCEND_AICPU_PATH=/home/HwHiAiUser/Ascend
export FFMPEG_PATH=/usr/local/ffmpeg
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:/home/HwHiAiUser/ascend_ddk/arm/lib:$LD_LIBRARY_PATH

#env for ascend-toolkit
export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64/stub
export ASCEND_HOME=/home/HwHiAiUser/Ascend/ascend-toolkit
export ASCEND_VERSION=latest
export ARCH_PATTERN=arm64-linux
export PYTHONPATH=$PYTHONPATH:$DDK_PATH/toolkit/python/site-packages:$DDK_PATH/atc/python/site-packages
export PATH=$PATH:$DDK_PATH/atc/bin:$DDK_PATH/atc/ccec_compiler/bin:$DDK_PATH/fwkacllib/ccec_compiler/bin:$DDK_PATH/fwkacllib/bin:
export ASCEND_OPP_PATH=$DDK_PATH/opp
export TOOLCHAIN_HOME=$DDK_PATH/toolkit
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DDK_PATH/atc/lib64:$DDK_PATH/fwkacllib/lib64

#FFMPEG
export PATH=$PATH:/usr/local/ffmpeg/bin
export FFMPEG_PATH=/usr/local/ffmpeg
export LD_LIBRARY_PATH=$FFMPEG_PATH/lib:$LD_LIBRARY_PATH

#OpenCV
export OPENCV_PATH=/home/HwHiAiUser/ascend_ddk/arm
export LD_LIBRARY_PATH=$OPENCV_PATH/lib:$LD_LIBRARY_PATH

关于如何在线调试AI推理应用,请参考我以前写的博文:如何利用Vscode远程调试atlas200设备上程序

5. 参考资料

Atlas200 DK 开发者套件文档:https://support.huaweicloud.com/environment-deployment-Atlas200DK202/atlased_04_0017.html

你可能感兴趣的:(Atlas,人工智能)