前言

概述

该文档为NNN向导性使用指导,主要介绍在板上运行NNN业务的主要步骤。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

SS928

V100

SS927

V100

读者对象

本文档主要适用于NNN开发人员。开发人员必须具备以下经验和技能:

  • 了解图像分析工具的基本概念。

  • 有一定的图像分析工具开发经验。

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修订记录

修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。

文档版本

发布日期

修改说明

00B02

2025-11-15

第2次临时版本发布。

“3.1.1.2 交叉编译环境准备“、“4.2 前提条件“、“4.3 操作步骤“小节涉及修改

“3.1.1.3 交叉编译“小节工具链涉及修改

00B01

2025-09-15

第1次临时版本发布。

概述

Ascend NNN简介

Ascend NNN为新一代图像分析工具加速器,前端支持开源AA框架(Caffe/ONNX),后端支持NNN/CPU的异构计算,提供完整的软硬件计算加速方案。

部署架构

部署架构如图1所示。NNN环境包含PC端工具侧开发环境和单板侧板端环境,当一个训练好的模型过来后,首先可以经过AMCT(Advanced Model Compression Toolkit)进行量化,将模型中部分层量化为8bit计算,提升计算效率;其次使用ATC(Advanced Tensor Compiler)工具将量化后的模型或非量化的模型转换为Ascend NNN认识的离线模型;最后,离线模型放置在板端环境,即可进行推理。

图 1 部署架构

板端环境

板端环境中包含板端执行推理时需要的头文件、动态库、驱动ko以及sample。

开发环境

命令行方式开发环境:需要单独部署CANN软件包,采用命令行的方式进行安装和使用,具体方法请参见命令行方式开发环境安装。

该环境都可安装独立的AMCT工具,支持将原始的float32模型,量化为低bit,以提升推理性能。工具安装以及使用方法请参见《AMCT使用指南(Caffe)》、《AMCT使用指南(Pytorch)》等手册。

使用流程

本章节介绍原始训练好的模型如何在NNN上执行以及遇到问题的整体使用流程,运行流程如图1所示。

图 1 运行流程

下面以Caffe原始网络模型为例,说明运行流程:

  1. 当训练好的Caffe模型准备好后,可以直接使用ATC工具进行模型转换,也可以使用AMCT先进行量化,然后将量化后的Caffe模型再传给ATC工具进行离线模型转换。

  2. ATC离线模型转换后生成的om模型,可以在板端环境上使用ACL(Advanced Computing Language)做推理。

  3. 推理后如果遇到精度问题,可以选择Dump网络的中间层数据,和Caffe的Dump结果做比较,来定位是哪一层的问题。为了缩小范围,可以使用MindCmd上的子模型导出功能(当前仅支持Caffe模型),将问题范围缩小,再使用导出的子模型复现问题。

  4. 当推理性能不满足要求时,可以通过Profiling工具查看网络中每个算子的耗时以及带宽数据,可能通过分析瓶颈点,修改网络来提升整网性能。

说明: 上述流程中涉及参考手册如下:

  • AMCT:如果用户想使用量化特性提升推理性能,请参见《AMCT使用指南(Caffe)》、《AMCT使用指南(Pytorch)》,对训练好的模型进行量化,量化完成后再使用ATC工具进行模型转换。

  • ATC工具模型转换:请参见《ATC工具使用指南》,将训练好的模型转换成平台识别的离线模型,应用程序指定模型资源后即可进行推理;具体支持的Caffe算子规格请参见《ATC工具使用指南》算子规格说明章节。

  • 模型推理过程中精度或性能不达标:请参见《快速上手指南》“精度调优建议”和“性能问题分析及性能调优”章节。

NNN环境安装

板端环境安装

板端环境安装

  • 板端环境安装请参见《xxxx SDK 安装以及升级使用说明》。

  • SVP ACL接口使用说明请参见《应用开发指南》>“SVP ACL API参考”章节。

  • 需要将SVP_NNN相关库路径加入到系统环境变量LD_LIBRARY_PATH(如smp/a55_linux/mpp/out/lib/svp_nnn)。

  • 板端开发所依赖的文件清单如表1所示。

    表 1 板端开发依赖的文件

    文件类型

    文件名称

    头文件

    svp_acl.h

    svp_acl_base.h

    svp_acl_ext.h

    svp_acl_mdl.h

    svp_acl_prof.h

    svp_acl_rt.h

    库文件

    libsvp_acl.a

    libsvp_acl.so

    libsvp_aacpu.so

    libprotobuf-c.a

    libprotobuf-c.so.1

    ko文件

    xxxx_svp_nnn.ko

命令行方式开发环境安装

简介

CANN(Compute Architecture for Neural Networks)是针对AA场景推出的异构计算架构,通过提供多层次的编程接口,支持用户快速构建AA应用和业务。

本文档主要用于指导用户安装CANN开发环境,用于代码开发、编译等不依赖于设备的开发活动(例如ATC模型转换、算子和推理应用程序的纯代码开发)。开发环境搭建逻辑架构如图1所示。

图 1 开发环境

安装流程如图2所示。

图 2 安装流程

软件包获取

环境搭建前,请准备如表1所示CANN软件包,用户根据具体板端环境,选择其中一个软件包进行安装。

表 1 软件包说明

形态

包名

说明

Linux操作系统SoC形态软件包

Ascend-cann-toolkit_<version>_linux.x86_64.run

主要用于用户开发应用、自定义算子和模型转换。包含开发应用程序所需的库文件、开发辅助工具如ATC模型转换工具等。

其中_<version>_表示软件版本号。

安装前准备

环境要求

开发环境所要求的硬件及操作系统要满足以下条件。

表 1 Ubuntu系统所要求的环境信息

类别

版本限制

获取方式

注意事项

硬件

内存:最小4GB

-

  • 若Linux宿主机内存为4G,使用ATC工具进行模型转换时,建议Model文件大小不超过350M,如果超过此规格,操作系统可能会因为超过安全内存阈值而工作不稳定。
  • 若Linux宿主机配置升级,比如8G内存,则相应支持的操作对象规格按比例提升。

    例如,内存由4G升级到8G,则Model文件建议大小不超过700M。

操作系统

Ubuntu 18.04 x86_64

请从http://old-releases.ubuntu.com/releases/18.04.1/网站下载对应版本软件进行安装,可以下载桌面版:ubuntu-xxx-desktop-amd64.iso,或Server版:ubuntu-xxx-server-amd64.iso

-

Python

3.7.5

请参见安装依赖

-

gcc

7.4.0

请参见安装依赖

-

g++

7.4.0

请参见安装依赖

-

cmake

3.10.2

请参见安装依赖

-

protobuf

3.13.0+

请参见安装依赖

该依赖为精度比对工具和profiling工具使用,为python版本的软件。

创建安装及运行用户

运行用户为实际运行推理业务的用户;安装用户为实际安装软件包的用户,针对安装用户:

  • 若使用root用户安装,支持所有用户运行相关业务。

  • 若使用非root用户安装,该场景下安装及运行用户必须相同。

    • 若已有非root用户,则无需再次创建。

    • 若想使用新的非root用户,则需要先创建该用户,请参见如下方法创建。

创建非root用户操作方法如下,如下命令请以root用户执行。

  1. 创建非root用户。

    groupadd usergroup
    useradd -g usergroup -d /home/username -m username -s /bin/bash
    
  2. 设置非root用户密码。

    passwd username
    

说明: 密码有效期为90天,您可以在/etc/login.defs文件中修改有效期的天数,或者通过chage命令来设置用户的有效期,详情请参见设置用户有效期。

检查源

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

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

apt-get update

如果命令执行报错,请检查网络是否连接或者把“/etc/apt/sources.list“文件中的源更换为可用的源。

配置安装用户权限

如果使用非root用户安装,apt-get需要用到提权命令,请用户自行获取所需的sudo权限。使用完成后请取消涉及高危命令的权限,否则有sudo提权风险。

安装依赖

如果安装用户为root,即CANN软件包的使用者为所有用户,请使用root用户安装依赖的gcc、python3.7.5等软件。如果安装用户为非root,即CANN软件包的使用者仅限于指定的非root用户,请使用su - username命令切换到非root用户安装依赖软件。

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

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

    gcc --version
    g++ --version
    cmake --version
    make --version
    unzip --version
    dpkg -l build-essential | grep build-essential | 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 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
    

    若分别返回如下信息则说明已经安装。

    gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
    g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
    cmake version 3.10.2
    GNU Make 4.1
    UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
    build-essential 12.4ubuntu1  amd64        Informational list of build-essential packages
    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.2 amd64        SQLite 3 development files
    libssl-dev:amd64 1.1.1-1ubuntu2.1~18.04.5 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)
    

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

    sudo apt-get install -y gcc g++ cmake make unzip build-essential zlib1g-dev libbz2-dev libsqlite3-dev libssl-dev libxslt1-dev libffi-dev
    

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

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

    CANN软件包依赖python环境,分别使用命令python3.7.5 --versionpython3.7 --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“参数用于加载sqlite-devel依赖。

      本手册以--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. 如果python安装用户为root:

        该场景下CANN软件包使用root用户进行安装,请在当前终端窗口直接执行如下命令设置环境变量。

        #用于设置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
        

        须知: 运行用户是root,不建议修改.bashrc,否则可能会影响其它系统提供的python工具的使用,如果仍想使用系统默认工具,请重新开启终端窗口。

      2. 如果python安装用户为非root:

        该场景下CANN软件包使用非root用户进行安装,请以非root用户在任意目录下执行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命令使其立即生效。

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

      python3.7.5 --version
      pip3.7.5 --version
      python3.7 --version
      pip3.7  --version
      
  3. 安装CANN软件包的相关依赖。

    安装前请先使用pip3.7.5 list命令检查是否安装相关依赖,若未安装,则安装命令如下(如果只有部分软件未安装,则如下命令修改为只安装还未安装的软件即可)。

    • 请在安装前配置好pip源,具体可参考配置pip源。

    • 安装前,建议执行命令pip3 install --upgrade pip进行升级,避免因pip版本过低导致安装失败。

    • 如下命令如果使用非root用户安装,需要在安装命令后加上--user,例如:pip3 install pathlib2 --user,安装命令可在任意路径下执行。

    表 2 依赖列表

    依赖名称

    版本号

    安装命令

    软件包下载路径

    google.protobuf

    >=3.13.0

    pip3.7.5 install protobuf==3.13.0 --user

    -

    psutil

    5.7.0

    pip3.7.5 install psutil==5.7.0 --user

    https://pypi.org/project/psutil/5.7.0/#files

    numpy

    >=1.13.3

    pip3.7.5 install numpy==1.13.3 --user

    https://pypi.org/project/numpy/1.13.3/#files

    scipy

    1.4.1

    pip3.7.5 install scipy==1.4.1 --user

    https://pypi.org/project/scipy/1.4.1/#files

    decorator

    >=4.4.0

    pip3.7.5 install decorator==4.4.0 --user

    https://pypi.org/project/decorator/4.4.0/#files

    sympy

    >= 1.5.1

    pip3.7.5 install sympy==1.5.1 --user

    https://pypi.org/project/sympy/1.5.1/#files

    cffi

    1.12.3

    pip3.7.5 install cffi==1.12.3 --user

    https://pypi.org/project/cffi/1.12.3/#files

    pyyaml

    -

    pip3.7.5 install pyyaml --user

    https://pypi.org/project/PyYAML/#files

    pathlib2

    -

    pip3.7.5 install pathlib2 --user

    https://pypi.org/project/pathlib2/#files

说明: 上述安装成功后返回信息中的版本号只是样例,请以实际环境中的返回信息为准。

上传软件包

使用CANN软件包的安装用户将获取的软件包上传到开发环境任意路径下。软件包存放路径支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.(非相对路径))、单个/(文件名或目录不支持/)。

软件包安装

前提条件

请参见安装前准备完成安装前准备。

操作步骤

如下命令中的*****请替换为具体CANN软件包,命令中所涉及的${INSTALL_DIR}请替换为CANN软件包安装后文件存储路径。例如,$HOME/Ascend/ascend-toolkit/<version>/x86_64-linux。

  1. 以CANN软件包的安装用户登录开发环境,切换到软件包所在路径。

  2. 增加安装用户对软件包的可执行权限。

    在软件包所在路径执行ls -l命令检查安装用户是否有该文件的执行权限,若没有,请执行如下命令。

    chmod +x *.run
    
  3. 校验软件包。

    执行如下命令,校验软件包安装文件的一致性和完整性。

    ./*.run --check
    
  4. 执行如下命令进行安装(以下命令支持**--install-path=**_<path>_等参数,具体参数说明请参见参数说明/常用命令)。

    ./*.run --install
    

    说明:

    • 如果以root用户安装,建议不要安装在非root用户目录下,否则存在被非root用户替换root用户文件以达到提权目的的安全风险。

    • 如果要多个版本并存,请使用--install-path=<path>指定新版本的安装路径。

    • 如果默认安装路径下已经安装了其他架构NNN的版本,请使用--install-path=<path>指定新的安装路径。否则安装和更新将覆盖原有版本。

    若出现如下关键信息,则说明安装成功:

    [INFO] xxx install success
    
    • 软件包默认安装路径:root用户/usr/local/Ascend;非root用户$HOME/Ascend。

    • 安装详细日志路径:${INSTALL_DIR}/ascend_install.log。

    • 安装后软件包的安装路径、安装命令以及运行用户信息记录路径:${INSTALL_DIR}/<package_name>/ascend_install.info

    ${INSTALL_DIR}请替换为CANN软件包安装后文件存储路径。例如,$HOME/Ascend/ascend-toolkit/<version>/x86_64-linux。

  5. 配置环境变量。

    执行如下命令配置环境变量。

    source ${INSTALL_DIR}/script/setenv.sh
    

    ${INSTALL_DIR}请替换为CANN软件包安装后文件存储路径。例如,$HOME/Ascend/ascend-toolkit/<version>/x86_64-linux。

安装后处理

开发环境安装完毕,如果用户使用应用工程开发了相关程序,需要进行工程的编译和运行,用于生成相关二进制文件,进行工程编译之前,请先配置交叉编译环境。

根据开发环境安装时选择的CANN软件包的形态不同,交叉编译环境配置方法不同,当前版本仅支持Linux操作系统SoC形态的CANN软件包。

若安装的CANN软件包为Linux操作系统SoC形态,需要搭建交叉编译环境,具体方法请参考交叉编译环境准备。

常用操作

查询软件包版本号

  1. 以CANN软件包的安装用户登录软件包的安装环境。

  2. 进入CANN软件包安装后文件存储路径。 (如下以进入非root用户默认安装路径为例进行说明)

    cd $HOME/Ascend/ascend-toolkit/<version>/x86_64-linux
    
  3. 执行以下命令获取版本信息。

    cat ascend_toolkit_install.info
    

升级软件包

升级注意事项

  1. 升级过程禁止进行其他维护操作动作,软件版本升级过程中会导致业务中断,升级软件包后,不会影响正常业务。

  2. 为了减少对业务的影响,请提前切走业务或在业务量低时进行升级操作。

  3. 升级后,请确保所有组件的版本保持一致。

  4. 升级过程中的日志信息输出在:${INSTALL_DIR}/ascend_install.log文件中,${INSTALL_DIR}请替换为CANN软件包安装后文件存储路径。例如,$HOME/Ascend/ascend-toolkit/<version>/x86_64-linux。

操作步骤

  1. 以CANN软件包的安装用户将新的软件包上传到开发环境任意目录。

  2. 增加安装用户对软件包的可执行权限。

    在软件包所在路径执行ls -l命令检查安装用户是否有该文件的执行权限,若没有,请执行如下命令。

    chmod +x *.run
    
  3. 校验软件包。

    下载软件包后,执行如下命令校验软件包安装文件的一致性和完整性。

    ./*.run --check
    
  4. 执行如下命令进行升级。

    ./*.run --upgrade
    

    *****请替换为具体软件包名,如果升级过程中无错误信息提示,则表示升级成功。

  5. 检查升级后的版本号。

    升级后需要确保各组件的版本号一致。在软件包的安装路径下(例如,非root用户默认路径$HOME/Ascend/ascend-toolkit/<version>/x86_64-linux),执行如下命令查看所升级软件包版本是否正确。

    cat ascend_toolkit_install.info
    

关于升级保留文件的说明:

  • 如果用户在CANN软件包安装后文件存储路径有写权限的目录,自定义了文件,则升级时不会删除此类文件,保留的文件数据会继承到升级的版本中。

  • 如果用户修改了安装路径下的有写权限的已有文件(非用户自定义的),则升级时会删除此类文件。

解压软件包

如果用户想要解压CANN软件包,查看软件包中文件详细内容,则可以执行如下命令:

./*.run --noexec --extract=<path>

*****请替换为具体软件包名,<path>表示解压后文件所在目录,该目录无需用户手动建立,解压过程中会自动创建,例如:

./*.run --noexec --extract=./package,则命令执行后会自动将解压后的内容放在package目录。

卸载软件包

支持两种方式卸载,请使用软件包的安装用户根据实际情况选择其中一个方式卸载即可。

如下命令中的*****请替换为具体CANN软件包,命令中所涉及的${INSTALL_DIR}请替换为CANN软件包安装后文件存储路径。例如,$HOME/Ascend/ascend-toolkit/<version>/x86_64-linux。

软件包卸载

  1. 以软件包的安装用户登录软件包所在安装环境。

  2. 进入软件包所在路径,执行以下命令进行卸载。

    ./*.run --uninstall
    

    卸载完成后,若显示如下信息,则说明软件卸载成功:

    [INFO] xxx uninstall success
    

    xxx表示卸载的实际软件包名。

    • 如果安装时使用了--install-path指定了安装路径,卸载时需要使用--install-path指定卸载路径。

    • 如果安装路径包含多个版本,卸载时需要使用--install-path指定卸载版本的路径。

脚本卸载

  1. 以CANN软件包的安装用户登录软件包所在安装环境。

  2. 在任意路径分别执行如下命令卸载软件包:

    bash ${INSTALL_PATH}/ascend-toolkit/<version>/x86_64-linux/script/uninstall.sh
    
    

    其中,

    • ${INSTALL_PATH}为软件包基础安装路径,例如root用户默认安装路径/usr/local/Ascend;非root用户默认安装路径$HOME/Ascend,请根据实际情况进行替换。

    • <version>表示软件版本号。

    卸载完成后,若显示如下信息,则说明软件卸载成功:

    [INFO] xxx uninstall success
    

    xxx表示卸载的实际软件包名。卸载完成后,如果在原安装路径下存在未删除的软链接,则需要用户手动删除。

关于卸载保留文件的说明:

  • 如果用户在CANN软件包安装后文件存储路径有写权限的目录,自定义了文件,则卸载时不会删除此类文件,保留的文件数据会继承到新安装的版本中。

  • 如果用户修改了安装路径下的有写权限的已有文件(非用户自定义的),则卸载时会删除此类文件。

设置用户有效期

为保证用户的安全性,应设置用户的有效期,使用系统命令chage来设置用户的有效期。

命令为:

chage [-m mindays] [-M maxdays] [-d lastday] [-I inactive] [-E expiredate] [-W warndays] username

相关参数请参见表1

表 1 设置用户有效期

参数

参数说明

-m

口令可更改的最小天数。设置为“0”表示任何时候都可以更改口令。

-M

口令保持有效的最大天数。设置为“-1”表示可删除这项口令的检测。

-d

上一次更改的日期。

-I

停滞时期。过期指定天数后,设定密码为失效状态。

-E

用户到期的日期。超过该日期,此用户将不可用。

-W

用户口令到期前,提前收到警告信息的天数。

-l

列出当前的设置。由非特权用户来确定口令或帐户何时过期。

说明:

  • 表1只列举出常用的参数,用户可通过chage --help命令查询详细的参数说明。

  • 日期格式为YYYY-MM-DD,如chage -E 2020-12-01 username表示用户username的口令在2020年12月1日过期。

  • username必须填写,填写时请替换为具体用户,默认为root用户。

举例说明:修改用户username的有效期为2020年12月01日。

chage -E 2020-12-01 username

配置pip源

配置pip源,配置方法如下:

  1. 使用软件包安装用户,执行如下命令:

    cd ~/.pip
    

    如果提示目录不存在,则执行如下命令创建:

    mkdir ~/.pip 
    cd ~/.pip
    

    在.pip目录下创建pip.conf 文件,命令为:

    touch pip.conf
    
  2. 编辑pip.conf文件。

    使用vi pip.conf命令打开pip.conf文件,写入如下内容:

    [install]
    #可信主机,请根据实际情况进行替换。
    trusted-host=xxx
    [global]
    #可用的源,请根据实际情况进行替换。
    index-url=http://xxx
    
  3. 执行:wq!命令保存文件。

  4. (可选)如果更换pip源之后,仍旧无法连接网络,则可能是域名服务器改变导致,需要更换域名服务器IP地址,方法如下:

    1. 获取pip源更新后的域名服务器IP地址。

      在linux服务器执行如下命令获取新的域名服务器IP地址:

      ping 新的域名地址
      

      域名地址可以从更新后的pip源中获取,例如上述的trusted-host取值:

      ping xxx
      
    2. 4.a中获取到的新的域名服务器IP地址写入/etc/resolv.conf文件。

      切换到root用户,执行vi /etc/resolv.conf命令打开/etc/resolv.conf,在该文件最后增加如下内容:

      nameserver 新的域名服务器IP地址
      
    3. 增加完成后,执行:wq!命令保存文件并退出。

附录

参数说明/常用命令

参数说明

软件包支持根据命令行完成一键式安装,各个命令之间可以配合使用,用户根据安装需要选择对应参数完成安装,所有参数都是可选参数。

安装命令格式: ./*.run [options]

详细参数请参见表1

须知: 如果通过./*.run --help命令查询出的参数未解释在如下表格,则说明该参数预留或适用于其他芯片版本,用户无需关注。

表 1 安装包支持的参数说明

参数

说明

--help | -h

查询帮助信息。

--list

查询软件包文件列表。

--info

查询软件包构建信息。

--check

检查软件包的一致性和完整性。

--quiet

静默安装,跳过交互式信息。

使用该参数进行安装时,若安装目录权限大于755,则会提示安全风险,用户自行选择终止安装或选择其他权限为755的安装目录重新安装。

该参数需要与--install、--devel、--upgrade、--uninstall其中一个参数配合使用,例如./*.run --install --quiet

--noexec

不执行安装脚本。配套--extract=path使用。格式为:--noexec --extract=path

--extract=path

解压缩安装包中文件到指定目录。使用该参数时,用户无需手动建立指定的目录,解压过程中会自动创建,例如:

--noexec --extract=./package,则命令执行后会自动将解压后的内容放在package目录。

--tar arg1 [arg2 …]

对安装包执行tar命令,使用tar后面的参数作为命令的参数。例如执行--tar xvf命令,解压软件包的内容到当前目录。

--install

安装软件包。后面可以指定安装路径--install-path=<path>,也可以不指定安装路径,直接安装到默认路径下。

--uninstall

卸载已安装的软件。

--upgrade

升级已安装的软件。

  • 首次安装场景,系统默认安装到“/usr/local/Ascend”目录。
  • 非首次安装场景,仅支持从软件包所在路径升级。

--version

查询版本号。

--install-for-all

安装或升级时,允许其他用户具有安装群组的权限。

当安装或者升级携带该参数时,软件包中创建的目录及文件,其他用户权限=安装群组权限。

该参数需要与--install、--upgrade等其中一个参数配合使用,例如./*.run --install --install-for-all

说明:
  • 使用该参数将会存在权限过大的安全风险:其他所有用户都有权限访问安装目录,请谨慎使用。
  • 安装时如果使用该参数:
    • 如果安装路径不存在,则安装过程中会自动创建默认路径,例如$HOME/Ascend,该路径权限为755,其他用户可以正常使用。
    • 如果安装路径已存在,则请确保该目录权限至少为755,否则将会终止安装。

--install-path=<path>

指定安装路径,只支持指定绝对路径。

若通过该参数指定了安装路径,运行用户需要对指定的安装路径有可读写权限。安装路径支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.(非相对路径))、单个/(文件名或目录不支持/)。

  • 若指定路径不存在,则安装时会自动创建目录,若有多层目录,则只有最后一层目录不存在时会自动创建。
  • 若指定路径已存在,请确保安装用户对该目录有可读,可写,可执行权限,并且:

    root用户安装场景下,如果使用--install-path=<path>指定安装路径,则请确保所有层级目录属主为root,并且所有层级目录权限至少为755,否则需要用户自行修改目录属主或者目录层级权限。

如不指定安装路径:root用户默认安装路径为/usr/local/Ascend;非root用户默认安装路径为$HOME/Ascend。

调试工具使用

板端环境部署好后,MindCmd通过ssh登录对应的板端环境,需要在板端环境搭建OpenSSH服务。

板端Linux环境OpenSSH服务搭建

交叉编译

依赖软件包准备

OpenSSH下载地址:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.0p1.tar.gz

zlib 1.2.11: https://zlib.net/fossils/zlib-1.2.11.tar.gz

OpenSSL 1.1.1g: https://www.openssl.org/source/openssl-1.1.1g.tar.gz

交叉编译环境准备

获取发布包中的对应交叉编译器,aarch64-v01c01-linux-musl-clang或aarch64-v01c01-linux-gnu。交叉编译环境这里以x86_64的Ubuntu 18.04,交叉工具链aarch64-v01c01-linux-gnu为例。

前提条件

请使用软件包的安装用户切换到/opt/linux/x86-arm/aarch64-v01c01-linux-gnu-gcc/bin路径查看是否存在aarch64-v01c01-linux-gnu-g++交叉编译器:

  • 如果存在:

    在当前目录执行./aarch64-v01c01-linux-gnu-g++ --help命令检查交叉编译工具是否可用,若返回参数信息则说明可用。

  • 如果不存在,则说明aarch64-v01c01-linux-gnu-g++交叉编译器未安装,请参见如下步骤进行配置。

配置步骤

  • 解压工具链aarch64-v01c01-linux-gnu,工具链包名以发布包中版本为准。

    tar xvf gcc-*-aarch64-v01c01-linux-gnu.tgz
    cd gcc-*-aarch64-v01c01-linux-gnu
    
  • 执行安装脚本(可以参考readme指定其他安装路径):

    aarch64-v01c01-linux-musl安装方式为:

    sudo ./install_gcc_toolchain.sh
    
  • 查看安装情况:

    此时交叉编译器已被安装至/opt/linux/x86-arm路径下,所需的环境变量也已自动更新到/etc/profile中。执行以下命令应该能正常显示gcc版本。

    source /etc/profile && aarch64-v01c01-linux-gnu-gcc -v
    

交叉编译

zlib

解压zlib的源码压缩包,并进入解压后的目录

cd /home/yc
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/

配置交叉编译器及安装路径:

CC=aarch64-v01c01-linux-gnu-gcc ./configure --prefix=$HOME/install/zlib

编译及安装:

make -j
make install
OpenSSL

解压OpenSSL的源码压缩包,并进入解压后的目录。

cd /home/yc
tar xf openssl-1.1.1g.tar.gz
cd openssl-1.1.1g

配置编译选项、交叉编译器及安装路径:

./config no-asm shared --cross-compile-prefix=aarch64-v01c01-linux-gnu- --prefix=$HOME/install/openssl

将生成的Makefile中的所有"-m64"修改为"-mabi=lp64":

sed -i 's/-m64/-mabi=lp64/g' ./Makefile

图 1 修改前

图 2 修改后

注意: 如果是aarch64-v01c01-linux-musl-clang编译器,上述配置编译选项需改为:CC=aarch64-v01c01-linux-musl-clang ./config no-asm shared --prefix=$HOME/openssl,同时不需要做替换Makefile中的所有"-m64"的操作。

编译及安装:

注:make -j并行编译可能会失败,若失败可直接make

make -j 
make install
OpenSSH

解压OpenSSH的源码压缩包,并进入:

cd /home/yc
tar xf openssh-8.0p1.tar.gz
cd openssh-8.0p1

配置:

./configure --host=aarch64-linux --with-libs --with-zlib=$HOME/install/zlib --with-ssl-dir=$HOME/install/openssl CC=aarch64-v01c01-linux-gnu-gcc AR=aarch64-v01c01-linux-gnu-ar --prefix=$HOME/install/openssh --exec-prefix=$HOME/install/openssh --disable-etc-default-login --disable-strip

编译及安装:

make -j
make install

注:install时若提示无权限创建/var/empty(privilege separation directory),则可以使用sudo创建后再使用chown改变owner,如果没有sudo权限,则修改Makefile文件中/var/empty路径为个人用户下路径:如:/tmp/install/var/empty,只要在板端也有相同路径即可,如图1所示。

图 1 OpenSSH安装路径配置

再次执行make install,此时若提示ssh-keygen执行失败,如下代码所示,这是由于arm架构的可执行文件不识别,可暂时忽略,因为所需的文件(sshd, scp, ssh-keygen等)都已安装至目标路径。

/bin/mkdir -p /home/xxx/install/openssh/etc
/home/xxx/install/openssh/etc/ssh_config already exists, install will not overwrite
/home/xxx/install/openssh/etc/sshd_config already exists, install will not overwrite
/home/xxx/install/openssh/etc/moduli already exists, install will not overwrite
/bin/sh: line 1: ./ssh-keygen: cannot execute binary file: Exec format error
Makefile:388: recipe for target 'host-key' failed
make: *** [host-key] Error 126

图 2 OpenSSH安装完成

部署

挂载命令

  • 板端环境的操作系统为Linux时,在部署与调试后,使用过程中,若板端环境上的空间不足时,您可以使用mount命令将NFS服务器上的目录挂载到板端环境的指定目录。

    • 以root用户登录Linux服务器(Ubuntu操作系统),安装NFS服务并配置共享目录。

      在确保环境连网且源可用的前提下,安装NFS服务,可参考如下命令安装,如果安装过程中提示已安装NFS服务,则无需重复安装:

      apt-get install nfs-kernel-server
      

      在“/etc/exports”文件中配置共享目录,配置完成后,执行**/etc/init.d/nfs-kernel-server restart**命令重启NFS服务使配置生效。可参考如下配置段(添加在文件的末尾),斜体部分请根据实际情况替换,_服务器绝对路径_表示Linux服务器的共享目录,如不存在,请提前创建。

      服务器绝对路径 *(rw,sync,root_squash,anonuid=id*,anongid=gid*)
      
    • 命令示例如下,其中,_path_表示板端环境上的目录,需根据实际情况修改。

      mount -t nfs -o nolock,tcp NFS服务器IP地址:服务器绝对路径 path
      

首次部署操作

  1. 挂载

    mount -t nfs -o rsize=32768,wsize=32768 -o nolock -o tcp xx.xx.xx.xx:/home/$USER/ /tmp
    
  2. 切换至挂载目录,部署zlib和OpenSSL相关产物

    cd /tmp/install
    cp zlib/lib/libz.so.1 /usr/lib/
    cp openssl/lib/libcrypto.so.1.1 /usr/lib
    
  3. 切换至挂载目录,部署OpenSSH所需的可执行文件

    cd /tmp/install
    cp openssh/sbin/sshd /usr/sbin/
    cp openssh/bin/scp openssh/bin/ssh-keygen /usr/bin
    
  4. 使用ssh-keygen生成秘钥对

    mkdir /etc/ssh
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
    # 回车两次打印如下:
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
    Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
    The key fingerprint is:
    SHA256:sirIxKjt/OtcVQh1bNSaHU6CQp7L6rI5tm8CtKznEF8 root@(none)
    The key's randomart image is:
    +---[RSA 3072]----+
    |     .o..+o.     |
    |     ..o.o+ +    |
    |      o....B .   |
    | .   . . .o o    |
    |* . E + S        |
    |oB . . +         |
    |*+. . o          |
    |++O+.o           |
    | =B%O.           |
    +----[SHA256]-----+
    
  5. 配置/etc/passwd

    vi /etc/passwd
    # 添加如下配置
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    
  6. 配置/etc/group

    vi /etc/group
    # 添加如下配置
    sshd:x:74:
    
  7. 创建privilege separation directory

    mkdir -p /var/empty
    
  8. 拷贝config至/etc并修改

    cp openssh/etc/sshd_config /etc/
    vi /etc/sshd_config
    # 1.修改sshd_config文件,使得可以使用root账号的账号密码登录
    # PermitRootLogin prohibit-password改为
    PermitRootLogin yes
    # 2.修改在subsystem条目配置正确的sftp-server路径:
    Subsystem       sftp    internal-sftp
    
  9. 修改ssh密码不为空

    #**注意**,[ssh默认不允许通过空密码登录],如果登录账号原密码为空,需要通过passwd命令修改为非空密码。
    
  10. 启动sshd,需指定config和key的路径

    /usr/sbin/sshd -f /etc/sshd_config -h /etc/ssh/ssh_host_rsa_key
    

若发生如下报错:

  • 错误1:报错权限问题

    /tmp/install/var/empty must be owned by root and not group or world-writable.
    # 解决:修改归属权限
    chown -R root:root /var/
    
  • 错误2:修改ssh登陆密码,输入密码,如root,提示错误,忽略继续输入,则账号密码是root root

    passwd
    Changing password for root
    New password:
    Bad password: too short
    Retype password:
    passwd: password for root changed by root
    

快速部署操作

完成交叉编译和首次部署操作操作后,下次启动sshd,可参考如下快速启动。

  1. 挂载

    mount -t nfs -o rsize=32768,wsize=32768 -o nolock -o tcp xx.xx.xx.xx:/home/$USER/ /tmp
    
  2. 启动sshd,需指定config和key的路径

    /usr/sbin/sshd -f /etc/sshd_config -h /etc/ssh/ssh_host_rsa_key
    

容器镜像构建

宿主机与容器操作系统兼容性关系

当前采用Ubuntu 18.04 x84_64 作为宿主机操作系统和容器的操作系统构建容器镜像,兼容性关系如表1所示。

表 1 宿主机与容器操作系统

宿主机OS

容器镜像OS

Ubuntu 18.04 x84_64

Ubuntu 18.04 x84_64

说明: 容器镜像OS场景只支持客户运行态业务,不支持开发态。

前提条件

操作步骤

  1. 登录服务器。

  2. 创建软件包上传路径,在Dockerfile文件同级目录下新建Resources目录。

    以“/home/$USER”为例,若/home/$USER下存放构建镜像所需的Dockerfile,则需在该路径下新建一个Resources文件夹存放项目所需软件包及相关文件(如 表1所示)。

    mkdir -p /home/$USER/Resources
    
  3. 将表1所示软件包及相关文件上传至服务器“/home/$USER/Resources”目录下。

    用户也可将prebuild.sh上传至Resources目录下,通过执行prebuild.sh脚本,通过执行脚本下载镜像构建所需的第三方软件包。

    chmod 755 ./prebuild.sh
    ./prebuild.sh
    

    说明: 用户可根据指定编译的平台,如GPU或CPU,更改prebuild.sh中软件包的下载版本(默认下载GPU版本的软件包)。

  4. 准备Dockerfile上传至服务器“/home/$USER”(即软件包文件夹Resources的同级目录下)。

    已为用户提供了多种场景下的基础镜像Dockerfile文件,请用户根据实际情况结合自身理解进行二次开发。

    如若用户不需进行修改,可将提供的基础镜像Dockerfile直接拷贝到“/home/$USER”目录下。

    镜像构建文件夹层级目录如下。

    ├── /home/$USER    
          ├──Resources                  
               ├── aarch64-{version}-linux.tgz 
               ├── SVP_NNN_PC_{version}.tgz
               ├── Makefile.config                            
               ├── Mirror_conf.sh
               ├── ......
          ├──Dockerfile
    

    说明:

    • $USER表示用户自定义文件夹,该目录为Docker镜像构建目录,用户在该目录下新建Resources文件夹。

    • 由于Dockerfile文件里有安装第三方软件包,如第三方软件出现漏洞,请用户自行修复。

    • 对于 gcc-{version}-aarch64-v01c01-linux-gnu.tgz和 SVP_NNN_PC_{version}.tgz ,仅允许放置一个版本的软件包在 /home/$USER/Resources 进行Docker镜像构建。

    • 请检查Resources目录下是否仅存放表1中所提及的文件及软件包,引入其他文件或软件包可能导致镜像构建失败。

  5. 进入软件包所在目录,执行以下命令,构建容器镜像。

    其中 image 表示镜像名称,tag 表示标签,用户根据实际情况进行修改。

    docker build -t image:tag .
    

    当出现“Successfully built xxx”表示镜像构建成功,注意不要遗漏命令结尾的“.”。

    说明:

    • 如使用docker build 命令进行镜像构建时,出现下载超时问题或无法下载的问题,请用户核对 Mirror_conf.sh 中的镜像源是否配置正确,考虑是否更换更为合适的镜像源。

    • 生态开源构建版本使用dockerfile进行构建时,如果使用的是欧拉工具链,欧拉工具链需要在构建后的docker容器中单独安装,请先按以下命令修改原有Dockerfile校验:

    sed -i '/Missing cross-compilation chain/d' Dockerfile
    
  6. 构建完成后,执行以下命令查看镜像信息。

    docker images
    

    显示示例:

编写示例

  1. Dockerfile 编写示例

    用户可根据需要自行修改Dockerfile中的内容。

    From ubuntu:18.04
    
    ARG Resources_PATH=/root/Resources
    ENV Install_PATH=/usr/local
    
    COPY /Resources ${Resources_PATH}
    RUN apt-get update \
    && apt-get install vim
    ......
    RUN mkdir ${Install_PATH}/caffe \
    && cd ${Install_PATH}/caffe
    ......
    WORKDIR /root
    EXPOSE 22
    
  2. Mirror_conf.sh 编写示例

    如用户Ubuntu 18.04 中配置的镜像源在Docker镜像构建中无法正常下载所需软件包,则用户需参考Mirror_conf.sh修改合适的镜像源。

    下述示例中,设置了http://mirrors.aliyun.com为镜像源,该镜像源并不一定适用所有的环境,请用户选择适合的镜像源进行替换。

    #!/bin/bash
    # Mirror source configuration
    
    # The following configuration of mirror sources is for reference only. 
    # You need to configure proper mirror sources based on your environment requirements.
    # Configure the image source according to the following example to ensure that the software package can be downloaded during image construction.
    
    ############## Modify the following information as required .##################
    # cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
    # sed -i "s@http://.*archive.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
    # sed -i "s@http://.*security.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
    # mkdir -p /root/.pip/
    # echo '[global]' >> /root/.pip/pip.conf
    # echo 'trusted-host=mirrors.aliyun.com' >> /root/.pip/pip.conf
    # echo 'index-url=http://mirrors.aliyun.com/pypi/simple' >> /root/.pip/pip.conf
    

部署容器

说明: 在docker容器中使用MindCmd时,启动容器指令有差异,如需在容器中使用MindCmd,请参考《MindCmd使用指南》“13.3 Docker容器中使用MindCmd”章节。

  1. 运行容器

    在运行环境中执行如下命令基于新的镜像运行一个容器,相关参数说明如表1所示。

    CPU启动容器示例:

    docker run -itd
         --shm-size=1g
         -v /tmp/.X11-unix:/tmp/.X11-unix
         -v ${host_mount_dir}:${host_mount_dir}
         -p ${port}:22 
         --name ${container_name} 
         ${image_name}
    

    GPU启动容器示例:

    docker run -itd
         --gpus all
         --shm-size=1g
         -v /tmp/.X11-unix:/tmp/.X11-unix 
         -v ${host_mount_dir}:${host_mount_dir}
         -p ${port}:22
         --name ${container_name} 
         ${image_name}
    

    说明:

    • 上下文参数中以变量符"${ }"形式描述的参数需要用户根据自己的环境进行填写,其他参数直接添加到执行命令中即可。 示例:如果用户挂载的数据卷为“/home/xxx”,那么对应填写的参数 -v ${host_mount_dir}:${host_mount_dir}为“-v /home/xxx:/home/xxx”。 示例:如果用户分配的端口为“40001”,那么对应填写的参数 :“-p ${port}:22”为“-p 40001:22”。 类似-itd、--gpus all等参数则直接拼接到命令当中,无需进行修改。

    • 当容器中没有配置与宿主机同uid、gid的用户时,挂载目录会被修改权限,可通过“sudo chown -R ${user}:${group} ${mount_path}”的方式修改挂载目录权限。

    • 上下文参数中以变量符"${ }"形式描述的参数需要用户根据自己的环境进行填写,其他参数直接添加到执行命令中即可。

    • Docker启动命令参数有顺序限制,请勿自行调整参数顺序,否则在使用上可能受到影响。

    表 1 运行容器命令参数说明

    参数

    说明

    -itd

    -i:以交互模式运行容器

    -t:为容器重新分配一个伪输入终端

    -d: 后台运行容器

    -v /tmp/.X11-unix:/tmp/.X11-unix

    设置容器共享主机unix套接字

    -v ${host_mount_dir}:${host_mount_dir}

    挂载文件夹,用于宿主机与容器文件资源共享。${host_mount_dir}路径要求为服务器侧已存在路径,且前后${host_mount_dir}填写的路径应该保持一致。如需在容器中使用MindCmd上板功能,该参数不可省略。

    -p ${port}:22

    将容器ssh端口22映射到宿主机的某个端口,宿主机上的端口不能被占用,可执行“netstat -anp |grep 端口号 ”,如果没有回显,表示端口未被占用。

    --name ${container_name}

    为容器指定一个名称

    ${image_name}

    运行容器使用的镜像。格式为“镜像名称:镜像标签”,请根据实际情况修改

    --gpus all

    gpu编译模式下,初始化cuda容器

    --shm-size=1g

    推荐设置共享内存大小为1g,不加该参数时docker默认shm大小为64MB,用户可根据实际需要调整设置该参数。

  2. 容器使用示例。

  3. 启动容器并进入容器(如容器关闭),其中${container_name}为启动容器时配置的容器名称。

     docker start ${container_name}
     docker exec -it ${container_name} /bin/bash
    

    执行该命令后,如果命令行显示带有“<SVP_Docker>”标识,则表示已经运行并进入该容器。

    <SVP_Docker> [root@g5500-cuda]:~$
    
  4. 初次使用时,进入容器后需执行passwd指令设置root用户密码,并启动ssh服务。

     passwd root
     service ssh start
    
  5. 新建终端,登录宿主机服务器,以ssh方式连接容器,并输入步骤2设置的密码,其中${port}为启动时容器时分配的映射端口。

     ssh -X root@{宿主机IP} -p ${port}
    

注意:

  • 镜像构建过程中,软件的安装路径为:/usr/local,用户进入容器后如需确认软件安装位置,可定位到该路径下。

  • 用户如果需要引入自定义算子层,请自行通过custom.proto重新编译Caffe。

  • 如果在docker容器的用户路径下手动安装CANN软件包出现报错,如图1所示。 请为用户文件夹配置权限为755,示例:chmod -R 755 /root。 步骤3的操作,用户也可使用Xserver新建ssh连接,ip填写docker宿主机的ip,端口选择运行容器时配置的端口号。(可选)

图 1 CANN软件包报错示意图