开发者基于DLAP221进行AI应用开发前,需要在制作SD卡时准备的Ubuntu服务器中部署开发环境,有以下三种场景:
-
独立部署开发套件包,基于后台命令行的方式进行交叉开发。
-
部署MindStudio,基于MindStudio开发工具进行AI应用开发,MindStudio安装时需要同时安装开发套件包(Cann Toolkit)。Cann Toolkit为开发者提供基于昇腾AI处理器的相关算法开发工具包,旨在帮助开发者进行快速、高效的人工智能算法开发。
MindStudio在Cann Toolkit的基础上进行了工具集成,为用户提供了简洁、友好的工程管理、代码编写、编译、模型转换、日志和性能分析等功能。
MindStudio与Cann Toolkit的架构图如下所示。
图1 MindStudio与Cann Toolkit架构图
开发套件包中的组件功能如下所示:- ACLlib:用来编译和运行应用程序。包含AscendCL编译依赖的相关库,并具有GE模型的加载、执行功能。
- ATC:模型和算子编译器。用于离线模型转换、自定义算子开发、IR构图开发等场景。
- OPP:算子库,包含算子原型库及算子实现库、算子插件、融合规则。算子实现包含TBE算子、AICPU算子,另外包含算子parser。
- Toolkit:调测工具包,主要包含开发者调测应用、算子需要使用的工具包。
-
在线开发环境安装
软件安装前,请首先获取以下软件包,*{version}*表示软件包版本号,版本号需要保持一致。
名称 | 软件包 | 获取链接 | 功能描述 |
---|---|---|---|
开发套件包 | Ascend-cann-toolkit_{version}_linux-x86_64.run | 获取链接请从“CANN软件包”中选择对应版本的软件包下载。支持的CANN版本请参见版本配套说明。 | 主要用于用户开发应用、自定义算子和模型转换。开发套件包包含开发应用程序所需的库文件、开发辅助工具(如ATC模型转换工具)。两种架构包统一安装:开发环境为x86架构,但运行环境是arm架构,所以再安装一个arm64的开发套件包,用于应用的交叉编译。 |
Ascend-cann-toolkit_{version}_linux-aarch64.run | 获取链接请从“CANN软件包”中选择对应版本的软件包下载。支持的CANN版本请参见版本配套说明。 |
-
以root用户登录安装环境。
-
检查root用户的umask值。
umask
-
如果umask不等于0022,请执行如下操作配置,在该文件的最后一行添加umask 0022后保存。
vi ~/.bashrc source ~/.bashrc
开发套件包建议以非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”的用户。
开发套件包安装前需要下载相关依赖软件,请执行如下操作为非root用户加权。
- 以root用户打开
“/etc/sudoers”
文件:chmod u+w /etc/sudoers vi /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”**为开发套件包的安装用户。
须知:- 请确保“/etc/sudoers”文件的最后一行为**“#includedir /etc/sudoers.d”**,如果没有该信息,请手动添加。
- 用户在安装完开发套件包后,可自行取消sudo权限。
- 用户在卸载或升级开发套件包时,也需要配置以上用户权限。
- 添加完成后,执行**:wq!**保存文件。
- 执行以下命令取消
“/etc/sudoers”
文件的写权限:chmod u-w /etc/sudoers
开发套件包安装过程需要下载相关依赖,请确保安装环境能够连接网络。
请在root用户下执行如下命令检查源是否可用。
apt-get update
如果命令执行报错或者后续安装依赖时等待时间过长甚至报错,则检查网络是否连接或者把“/etc/apt/sources.list”文件中的源更换为可用的源或使用镜像源(以配置华为镜像源为例,可参考华为开源镜像站)。如需配置网络代理,请参见配置系统网络代理。
安装依赖说明:
请使用开发套件包安装用户执行以下命令安装依赖。
-
检查系统是否安装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环境。
-
检查系统是否安装python开发环境。
开发套件包依赖python环境,分别使用命令python3.7.5 --version、pip3.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。
-
使用wget下载python3.7.5源码包,可以下载到
开发环境
任意目录,命令为:
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 ./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路径。
-
执行如下命令设置软链接:
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
-
设置python3.7.5环境变量。
-
以安装用户在任意目录下执行
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
-
执行**:wq!**命令保存文件并退出。
-
执行source ~/.bashrc命令使其立即生效。
-
-
安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。
python3.7.5 --version pip3.7.5 --version python3.7 --version pip3.7 --version
-
-
安装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"解决。
- 已获取获取软件包章节所述的x86_64和aarch64架构开发者的.run包。
- 请参见配置Ubuntu X86系统完成安装前环境准备。
-
以套件包安装用户登录开发环境。
-
上传获取软件包所获取的开发套件包到系统任意路径,并进入套件包所在路径。
-
执行如下命令为安装包增加可执行权限。
chmod +x *.run
*****表示开发套件包名,请用户根据实际替换。 -
执行如下校验安装包的一致性和完整性。
./Ascend-cann-toolkit_{version}linux-x86_64.run --check
./Ascend-cann-toolkit{version}_linux-aarch64.run --check -
执行以下命令安装软件。
-
使用默认路径安装:
./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” |
因为开发环境与运行环境的架构不同,所以需要在开发环境安装交叉编译工具,具体如表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为例进行说明:
- 以安装用户在任意目录下执行vi ~/.bashrc命令,打开**.bashrc**文件,在文件最后一行后面添加上述内容。
- 执行**:wq!**命令保存文件并退出。
- 执行source ~/.bashrc命令使其立即生效。
如果您还没有 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 HwHiAiUser@192.168.31.21'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_PATH4. 交叉编译工程并部署
现在以InferOfflineVideo这个工程来演示如何编译和部署。
4.1 下载APISamples样例库cd /home/HwHiAiUser mkdir workspace cd workspace git clone https://gitee.com/shiner-chen/APISamples.git4.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 everyframes
在工程目录下创建部署脚本deploy.sh,内容如下:
#!/bin/bash rsync -avz --rsync-path="sudo rsync" dist HwHiAiUser@192.168.31.21:~/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.264.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工具包,操作步骤如下:
- 请单击下载链接下载MindStudio安装包。
- 请参见安装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=Ascend3104.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