安装离线推理引擎包

前提条件

安装步骤

获取并安装离线推理引擎包,详细安装步骤如下。

  1. 以软件包的安装用户登录安装环境。
  2. 将获取到的离线推理引擎包上传到安装环境任意路径(如“/home/package”)。
  3. 进入软件包所在路径。
  4. 执行如下命令增加对软件包的可执行权限。

    chmod +x 软件包名.run

    软件包名.run表示软件包名,例如离线推理引擎包Ascend-cann-nnrt_{version}_linux-{arch}.run。请根据实际包名进行替换。

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

    ./软件包名.run --check

  6. 执行如下命令安装软件(以下命令支持--install-path=<path>等参数,具体参数说明请参见参数说明)。

    ./软件包名.run --install
    • 离线推理引擎包支持不同用户在同一运行环境安装,但安装版本必须保持一致,不同用户所属的属组也必须和驱动运行用户所属属组相同;如果不同,请用户自行添加到驱动运行用户属组。
    • 用户想使用默认签署华为企业业务最终用户许可协议(EULA)的方式安装软件包时,可以添加--quiet参数配合安装命令使用,如:./软件包名.run --install --quiet 添加该参数后会跳过7的确认操作。
    • 如果以root用户安装,不允许安装在非root用户目录下
    • 如果用户未指定安装路径,则软件会安装到默认路径下,默认安装路径如下。
      • root用户:“/usr/local/Ascend”
      • 非root用户:“${HOME}/Ascend”

        其中${HOME}为当前用户目录。软件包支持多版本安装,同一安装路径下,可以安装多个版本的软件包,不同版本的软件通过版本目录来区分。默认使用最后安装的版本(即通过软件包名/latest建立软连接到最后安装的版本)。

    • 软件包安装详细日志路径如下。
      • root用户:“/var/log/ascend_seclog/ascend_nnrt_install.log”
      • 非root用户:“${HOME}/var/log/ascend_seclog/ascend_nnrt_install.log”

        其中${HOME}为当前用户目录。

  7. 用户需签署华为企业业务最终用户许可协议(EULA)后进入安装流程,根据回显页面执行y或Y确认协议,输入其他任意字符为拒绝协议,确认接受协议后开始安装。

    若当前语言环境不满足要求,可以执行如下命令配置系统的默认语言环境。
    #配置为中文(简体)
    export LANG=zh_CN.UTF-8
    #配置为英文
    export LANG=en_US.UTF-8
    安装完成后,若显示如下信息,则说明软件安装成功:
    xxx install success

    xxx表示安装的实际软件包名。

添加业务进程到Cgroup

针对Atlas 200I A2 加速模块(RC场景)和Atlas 500 A2 智能小站场景,提供了基于cgroup(Control Groups)机制的内存限制功能,当业务进程的cgroup达到特定的内存限额后,内核会尝试回收内存。添加方法如下:

在启动过程中通过getpid() 函数获取到当前进程的pid,再将其写入/sys/fs/cgroup/memory/usermemory/cgroup.procs文件中。示例代码如下,加粗部分是关键代码。

int write_task(void)
{
    int pid = getpid();
    int fd = -1;
    char buf[100] = {0};
    int ret;
    fd = open("/sys/fs/cgroup/memory/usermemory/cgroup.procs", O_RDWR, S_IRUSR | S_IWUSR);
    if (fd < 0) {
        printf("can't open pidfile\n");
        return (-1);
    }
    ret = sprintf(buf, "%ld", (long)getpid());
    if (ret < 0) {
        printf("sprintf_s failed.");
        close(fd);
        return (1);
    }
    ret = write(fd, buf, strlen(buf) + 1);
    if (ret != (strlen(buf) + 1)) {
        printf("write failed, errno.\n");
        close(fd);
        return (1);
    }
    close(fd);
    return 0;
}