已合并
[doc]:解决近期众测的问题 #102
孟广欣创建于 7月3日
[doc]:解决近期众测的问题 #102
已合并
共 3 个文件变更+62-69
| @@ -3,57 +3,49 @@ | |||
| 3 | <br> | 3 | <br> |
| 4 | 4 | ||
| 5 | > [!CAUTION]注意 | 5 | > [!CAUTION]注意 |
| 6 | -> 本文档及相关脚本仅用于学习目的,不保证在生产环境中的稳定性与安全性。使用者应自行评估相关风险并承担全部责任。 | 6 | +> 本文档及相关脚本仅供学习用途,不保证在生产环境中的稳定性与安全性。使用者须自行评估相关风险,并承担全部责任。 |
| 7 | 7 | ||
| 8 | ## 前置条件 | 8 | ## 前置条件 |
| 9 | 9 | ||
| 10 | 开始安装前,请确保服务器满足以下要求: | 10 | 开始安装前,请确保服务器满足以下要求: |
| 11 | 11 | ||
| 12 | -| 项目 | 要求 | 验证方法 | | 12 | +| 项目 | 要求 | 验证方法 | |
| 13 | -|------|------|----------| | 13 | +|------|-------------------------------------------------|--------------------------------------| |
| 14 | -| 操作系统 | Linux | `uname -s` 显示 `Linux` | | 14 | +| 操作系统 | Linux | `uname -s` 输出为 `Linux` | |
| 15 | -| NPU 卡 | 至少 1 张(基于昇腾 910B 或 310P 芯片,**推荐使用 910B**),驱动、固件安装好 | `npu-smi info` 能正常显示卡信息 | | 15 | +| NPU 卡 | 至少 1 张(基于昇腾 910B/310P/A3 芯片,**推荐使用 910B**),驱动与固件已正确安装 | `npu-smi info` 可正常显示设备信息 | |
| 16 | -| Docker 服务 | 已安装并启动 | `docker ps` 能正常执行(无报错即表示服务已启动) | | 16 | +| Docker 服务 | 已安装并处于运行状态 | `docker ps` 可正常执行(无报错即表示服务已启动) | |
| 17 | -| 其他软件 | Python 3、curl、git | 分别执行 `python3 --version`、`curl --version`、`git --version`,均有版本输出即可 | | 17 | +| 其他软件 | Python 3、curl | 分别执行 `python3 -V`、`curl -V` 均有有效版本输出 | |
| 18 | + | ||
| 19 | +> 👉 确认前置条件满足后,若环境具备互联网访问能力,后续命令可全程直接 **复制粘贴(Copy/Paste)** 执行,无需手动输入或拼接,以避免因输入错误导致命令执行失败。 | ||
| 18 | 20 | ||
| 19 | ## 1. 安装算子开发工具链(CANN 容器) | 21 | ## 1. 安装算子开发工具链(CANN 容器) |
| 20 | 22 | ||
| 21 | > [!NOTE]说明 | 23 | > [!NOTE]说明 |
| 22 | > | 24 | > |
| 23 | -> - 昇腾 AI 算子开发工具链随 CANN 统一发布,安装 CANN 即完成工具链安装。 | 25 | +> - 昇腾 AI 算子开发工具链随 CANN 统一发布,安装 CANN 即完成工具链部署。 |
| 24 | > - 鉴于算子编译环境依赖复杂,本教程**仅支持** CANN 容器化部署方式,不适用于裸机或虚拟机等非容器环境。 | 26 | > - 鉴于算子编译环境依赖复杂,本教程**仅支持** CANN 容器化部署方式,不适用于裸机或虚拟机等非容器环境。 |
| 25 | -> - 本节(1.1~1.2)所有命令均在**宿主机**执行;进入容器后的操作从第 2 节开始。 | ||
| 26 | 27 | ||
| 27 | ### 1.1 获取 CANN 官方容器镜像 | 28 | ### 1.1 获取 CANN 官方容器镜像 |
| 28 | 29 | ||
| 29 | #### 1.1.1 设置镜像变量 | 30 | #### 1.1.1 设置镜像变量 |
| 30 | 31 | ||
| 31 | -根据所用芯片类型执行对应命令(本学习环境仅支持昇腾 910B 与 310P 系列): | 32 | +执行以下命令,根据当前 NPU 芯片型号自动配置镜像信息环境变量: |
| 32 | 33 | ||
| 33 | ```bash | 34 | ```bash |
| 34 | -# 昇腾 910B 系列芯片 | 35 | +source /dev/stdin <<< "$(chip=$(npu-smi info -m 2>/dev/null | grep -oP 'Ascend\s*\S+' | head -1); case "$chip" in 'Ascend 910B'* ) echo "export MY_STUDY_VAR_CANN_IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-910b-openeuler24.03-py3.11-devel; echo '[PASS] Successfully identified chip [$chip] and completed environment configuration.'";; 'Ascend910'* ) echo "export MY_STUDY_VAR_CANN_IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-a3-openeuler24.03-py3.11-devel; echo '[PASS] Successfully identified chip [$chip] and completed environment configuration.'";; 'Ascend 310P'* ) echo "export MY_STUDY_VAR_CANN_IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-310p-openeuler24.03-py3.11-devel; echo '[PASS] Successfully identified chip [$chip] and completed environment configuration.'";; * ) echo "echo >&2; echo -e '\033[31m[FAIL] Get chip: $chip. Learning is not supported in the current environment.\033[0m' >&2";; esac)" |
| 35 | -export MY_STUDY_VAR_CANN_IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-910b-openeuler24.03-py3.11-devel | 36 | +[ -n "$MY_STUDY_VAR_CANN_IMAGE" ] && echo -e "\n\e[32m[PASS] Auto-selected image for detected chip:\n $MY_STUDY_VAR_CANN_IMAGE\e[0m" |
| 36 | - | ||
| 37 | -# 昇腾 310P 系列芯片 | ||
| 38 | -export MY_STUDY_VAR_CANN_IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-310p-openeuler24.03-py3.11-devel | ||
| 39 | ``` | 37 | ``` |
| 40 | 38 | ||
| 41 | > [!NOTE]说明 | 39 | > [!NOTE]说明 |
| 42 | > | 40 | > |
| 43 | -> **如何确定应使用哪个镜像?** | 41 | +> **命令原理说明** |
| 44 | -> 可通过执行 `npu-smi info` 命令判断。例如,在以下输出中,若 Name 列(芯片名称)包含 “910B” 字样,则选择 910B 镜像;若包含 “310P”,则选择 310P 镜像: | 42 | +> 通过 `npu-smi info` 获取 NPU 芯片型号,依据硬件信息自动匹配对应的镜像,并将结果赋值给环境变量 `MY_STUDY_VAR_CANN_IMAGE`,供后续容器启动等操作使用。 |
| 45 | -> | 43 | +> 所用镜像均源自华为云镜像仓库中 CANN 发布的官方镜像,如需了解镜像的详细信息,请访问 [CANN 官方镜像仓库](https://www.hiascend.com/developer/ascendhub/detail/17da20d1c2b6493cb38765adeba85884)。 |
| 46 | -> ```text | 44 | + |
| 47 | ->+------------------------------------------------------------------------------------------------+ | 45 | +若命令执行后输出 `[PASS]`,则表示执行成功;若输出为 `[FAIL]`,可能原因如下: |
| 48 | ->| npu-smi 25.5.0 Version: 25.5.0 | | 46 | + |
| 49 | ->+---------------------------+---------------+----------------------------------------------------+ | 47 | +1. NPU 环境异常导致 `npu-smi info` 命令执行失败,请联系环境管理员修复底层环境问题; |
| 50 | ->| NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page)| | 48 | +2. 当前硬件不在本教程支持范围内,本学习环境仅支持昇腾 910B、310P 及 A3 系列芯片,请切换至兼容的硬件环境后重试。 |
| 51 | ->| Chip | Bus-Id | AICore(%) Memory-Usage(MB) HBM-Usage(MB) | | ||
| 52 | ->+===========================+===============+====================================================+ | ||
| 53 | ->| 0 910B4 | OK | 94.0 39 0 / 0 | | ||
| 54 | ->| 0 | 0000:C1:00.0 | 0 0 / 0 2880 / 32768 | | ||
| 55 | ->+===========================+===============+====================================================+ | ||
| 56 | -> ``` | ||
| 57 | 49 | ||
| 58 | #### 1.1.2 拉取镜像 | 50 | #### 1.1.2 拉取镜像 |
| 59 | 51 | ||
| @@ -61,7 +53,7 @@ export MY_STUDY_VAR_CANN_IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9 | |||
| 61 | docker pull ${MY_STUDY_VAR_CANN_IMAGE} | 53 | docker pull ${MY_STUDY_VAR_CANN_IMAGE} |
| 62 | ``` | 54 | ``` |
| 63 | 55 | ||
| 64 | -若因处于企业内网导致拉取失败,请参考 [5.1 节](#51-docker-镜像获取) 的解决方案。 | 56 | +若因处于企业内网导致拉取失败,请参考 [5.1 节](#51-docker-镜像在隔离内网的获取方法) 的解决方案。 |
| 65 | 57 | ||
| 66 | ### 1.2 启动容器 | 58 | ### 1.2 启动容器 |
| 67 | 59 | ||
| @@ -71,7 +63,7 @@ docker pull ${MY_STUDY_VAR_CANN_IMAGE} | |||
| 71 | cd ~ && curl -O https://inst.obs.cn-north-4.myhuaweicloud.com/env/ctr_in.py && chmod +x ctr_in.py | 63 | cd ~ && curl -O https://inst.obs.cn-north-4.myhuaweicloud.com/env/ctr_in.py && chmod +x ctr_in.py |
| 72 | ``` | 64 | ``` |
| 73 | 65 | ||
| 74 | -若因网络限制无法下载,请参考 [5.2 节](#52-传输容器启动脚本)。 | 66 | +若因网络限制无法下载,请参考 [5.2 节](#52-传输容器启动脚本) 的解决方案。 |
| 75 | 67 | ||
| 76 | #### 1.2.2 启动容器 | 68 | #### 1.2.2 启动容器 |
| 77 | 69 | ||
| @@ -79,7 +71,7 @@ cd ~ && curl -O https://inst.obs.cn-north-4.myhuaweicloud.com/env/ctr_in.py && c | |||
| 79 | ~/ctr_in.py ${MY_STUDY_VAR_CANN_IMAGE} | 71 | ~/ctr_in.py ${MY_STUDY_VAR_CANN_IMAGE} |
| 80 | ``` | 72 | ``` |
| 81 | 73 | ||
| 82 | -**预期输出**:出现如下提示信息,并停留在 root shell 提示符,表示容器已成功启动: | 74 | +**预期输出**:出现类似如下提示信息,并停留在 root shell 提示符,表示容器已成功启动: |
| 83 | 75 | ||
| 84 | ```text | 76 | ```text |
| 85 | Welcome to 5.10.0-60.139.0.166.oe2203.aarch64 | 77 | Welcome to 5.10.0-60.139.0.166.oe2203.aarch64 |
| @@ -95,8 +87,9 @@ Users online: 0 | |||
| 95 | [root@xxxxxx ~]# | 87 | [root@xxxxxx ~]# |
| 96 | ``` | 88 | ``` |
| 97 | 89 | ||
| 98 | -> [!NOTE]说明 | 90 | +> [!CAUTION]注意 |
| 99 | -> 自此步骤起,后续所有操作均应在容器内部的 shell 中执行。 | 91 | +> |
| 92 | +> **自此步骤起,后续所有操作均应在容器内部的 shell 中执行。** | ||
| 100 | 93 | ||
| 101 | ## 2. 克隆示例代码仓库 | 94 | ## 2. 克隆示例代码仓库 |
| 102 | 95 | ||
| @@ -108,27 +101,25 @@ git clone https://gitcode.com/Ascend/msot.git ~/ot_demo/msot | |||
| 108 | 101 | ||
| 109 | 克隆完成后,示例代码路径为 `~/ot_demo/msot/example`。 | 102 | 克隆完成后,示例代码路径为 `~/ot_demo/msot/example`。 |
| 110 | 103 | ||
| 111 | -若因网络问题导致克隆失败,请参考 [5.3 节](#53-同步示例代码仓库)。 | 104 | +若因网络问题导致克隆失败,请参考 [5.3 节](#53-同步示例代码仓库) 的解决方案。。 |
| 112 | 105 | ||
| 113 | ## 3. 设置芯片 SoC 型号 | 106 | ## 3. 设置芯片 SoC 型号 |
| 114 | 107 | ||
| 115 | -后续多条命令均需引用芯片 SoC 型号(片上系统型号,用于标识芯片架构),此处统一查询并保存到环境变量 `MY_STUDY_VAR_CHIP_SOC_TYPE`,便于后续直接使用,在容器内执行: | 108 | +后续多条命令需引用芯片 SoC 型号(片上系统型号,用于标识芯片架构)。此处统一查询并保存至环境变量 `MY_STUDY_VAR_CHIP_SOC_TYPE`,便于后续直接调用。在容器内执行: |
| 116 | 109 | ||
| 117 | ```bash | 110 | ```bash |
| 118 | -# acl 模块随 CANN 安装 | 111 | +echo 'export MY_STUDY_VAR_CHIP_SOC_TYPE=$(python3 -c "import acl; print(acl.get_soc_name().replace(\"Ascend\", \"\"))")' > /etc/profile.d/custom-env.sh && chmod +x /etc/profile.d/custom-env.sh && source /etc/profile.d/custom-env.sh && { [ -n "$MY_STUDY_VAR_CHIP_SOC_TYPE" ] && echo -e "\033[32m[PASS] Chip SoC type: $MY_STUDY_VAR_CHIP_SOC_TYPE\033[0m" || echo -e '\033[31m[FAIL] Failed to set environment variable $MY_STUDY_VAR_CHIP_SOC_TYPE!\033[0m'; } |
| 119 | -export MY_STUDY_VAR_CHIP_SOC_TYPE=$(python3 -c "import acl; print(acl.get_soc_name().replace('Ascend', ''))") | ||
| 120 | - | ||
| 121 | -# 校验是否设置成功 | ||
| 122 | -[ -n "$MY_STUDY_VAR_CHIP_SOC_TYPE" ] && echo -e "\033[32m[PASS] 芯片型号: $MY_STUDY_VAR_CHIP_SOC_TYPE\033[0m" || echo -e "\033[31m[FAIL] 环境变量 \$MY_STUDY_VAR_CHIP_SOC_TYPE 设置失败!\033[0m" | ||
| 123 | ``` | 112 | ``` |
| 124 | 113 | ||
| 125 | -若显示 [PASS] 即表示设置成功;若显示 [FAIL],通常是因为未成功部署 CANN 容器,或误在宿主机(容器外)执行了本步骤——请确认已进入容器后重试。 | 114 | +若显示 `[PASS]`,表示设置成功;若显示 `[FAIL]`,通常是因为未成功部署 CANN 容器,或误在宿主机(容器外)执行了本步骤,请确认已进入容器后重试。 |
| 126 | 115 | ||
| 127 | > [!CAUTION]注意 | 116 | > [!CAUTION]注意 |
| 128 | > 环境变量 `MY_STUDY_VAR_CHIP_SOC_TYPE` 与 `MY_STUDY_VAR_CANN_IMAGE` 仅适用于本快速入门教程,请勿在商业开发中使用。 | 117 | > 环境变量 `MY_STUDY_VAR_CHIP_SOC_TYPE` 与 `MY_STUDY_VAR_CANN_IMAGE` 仅适用于本快速入门教程,请勿在商业开发中使用。 |
| 129 | 118 | ||
| 130 | 至此,学习环境安装完成。接下来,请返回快速入门文档继续后续操作。 | 119 | 至此,学习环境安装完成。接下来,请返回快速入门文档继续后续操作。 |
| 131 | 120 | ||
| 121 | +<br> | ||
| 122 | + | ||
| 132 | ## 4. 常见问题(FAQ) | 123 | ## 4. 常见问题(FAQ) |
| 133 | 124 | ||
| 134 | ### 4.1 退出容器后如何重新进入? | 125 | ### 4.1 退出容器后如何重新进入? |
| @@ -136,18 +127,13 @@ export MY_STUDY_VAR_CHIP_SOC_TYPE=$(python3 -c "import acl; print(acl.get_soc_na | |||
| 136 | **方法一(推荐)**:执行 `~/ctr_in.py`,交互式选择目标容器(若仅有一个容器则自动进入)。 | 127 | **方法一(推荐)**:执行 `~/ctr_in.py`,交互式选择目标容器(若仅有一个容器则自动进入)。 |
| 137 | **方法二(原生命令)**:执行 `docker exec -it alice_YYMMDD_HHMMSS bash`(请替换为实际容器名称)。 | 128 | **方法二(原生命令)**:执行 `docker exec -it alice_YYMMDD_HHMMSS bash`(请替换为实际容器名称)。 |
| 138 | 129 | ||
| 139 | -### 4.2 重新进入容器后环境变量丢失,如何处理? | 130 | +### 4.2 执行 docker 命令遇到 permission denied 类错误提示? |
| 140 | 131 | ||
| 141 | -通过 `export` 设置的环境变量仅在当前 shell 会话中有效,退出容器后将失效。重新进入后需再次执行 `export` 命令。 | 132 | +可能当前用户未加入 docker 用户组。可使用 root 权限执行 `usermod -aG docker <当前用户名>`,不建议以 root 身份进行日常操作。 |
| 142 | -如需持久化,可将相关 `export` 命令追加至容器内 `~/.bashrc` 文件末尾,使变量在每次登录时自动加载。 | ||
| 143 | - | ||
| 144 | -### 4.3 执行 docker 命令遇到 permission denied 类错误提示? | ||
| 145 | - | ||
| 146 | -可能当前用户不在 docker 组,用 root 权限执行 `usermod -aG docker <当前用户名>`,不建议切为 root 进行体验。 | ||
| 147 | 133 | ||
| 148 | ## 5. 内网环境无外网访问权限的应对方案 | 134 | ## 5. 内网环境无外网访问权限的应对方案 |
| 149 | 135 | ||
| 150 | -### 5.1 Docker 镜像获取 | 136 | +### 5.1 Docker 镜像在隔离内网的获取方法 |
| 151 | 137 | ||
| 152 | **方案一:配置 Docker 代理直接拉取** | 138 | **方案一:配置 Docker 代理直接拉取** |
| 153 | 139 | ||
| @@ -173,7 +159,7 @@ sudo systemctl restart docker | |||
| 173 | 159 | ||
| 174 | **方案二:离线导入 CANN 镜像** | 160 | **方案二:离线导入 CANN 镜像** |
| 175 | 161 | ||
| 176 | -在具备外网且 CPU 架构相同的机器上执行: | 162 | +如果代理服务器方案不可行,可在具备外网且 CPU 架构相同的机器上执行: |
| 177 | 163 | ||
| 178 | ```bash | 164 | ```bash |
| 179 | # 拉取镜像(需先按 1.1.1 节设置环境变量) | 165 | # 拉取镜像(需先按 1.1.1 节设置环境变量) |
| @@ -183,7 +169,7 @@ docker pull ${MY_STUDY_VAR_CANN_IMAGE} | |||
| 183 | docker save -o cann.tar ${MY_STUDY_VAR_CANN_IMAGE} | 169 | docker save -o cann.tar ${MY_STUDY_VAR_CANN_IMAGE} |
| 184 | ``` | 170 | ``` |
| 185 | 171 | ||
| 186 | -将 `cann.tar` 传输至内网服务器后,执行以下命令加载: | 172 | +将 `cann.tar` 通过优盘等方式传输至内网服务器后,执行以下命令加载: |
| 187 | 173 | ||
| 188 | ```bash | 174 | ```bash |
| 189 | docker load -i cann.tar | 175 | docker load -i cann.tar |
| @@ -193,7 +179,7 @@ docker load -i cann.tar | |||
| 193 | 179 | ||
| 194 | ### 5.2 传输容器启动脚本 | 180 | ### 5.2 传输容器启动脚本 |
| 195 | 181 | ||
| 196 | -在访问当前网页的浏览器中输入如下链接,下载 `ctr_in.py` 脚本文件,并将其手动拷贝至内网服务器的 `~/` 目录,随后执行权限设置命令 `chmod +x ctr_in.py`。 | 182 | +在可访问当前网页的浏览器中输入如下链接,下载 `ctr_in.py` 脚本文件,并将其手动拷贝至内网服务器的 `~/` 目录,随后执行权限设置命令 `chmod +x ctr_in.py`。 |
| 197 | 183 | ||
| 198 | ```text | 184 | ```text |
| 199 | https://inst.obs.cn-north-4.myhuaweicloud.com/env/ctr_in.py | 185 | https://inst.obs.cn-north-4.myhuaweicloud.com/env/ctr_in.py |
| @@ -201,7 +187,7 @@ https://inst.obs.cn-north-4.myhuaweicloud.com/env/ctr_in.py | |||
| 201 | 187 | ||
| 202 | ### 5.3 同步示例代码仓库 | 188 | ### 5.3 同步示例代码仓库 |
| 203 | 189 | ||
| 204 | -在访问当前网页的浏览器中输入如下链接,进入页面后点击“下载zip”按钮,将代码仓库压缩包下载至本地,再将其拷贝至内网服务器的目标工作目录,确保路径为 `~/ot_demo/msot/example`。 | 190 | +在可访问当前网页的浏览器中输入如下链接,进入页面后点击“下载zip”按钮,将代码仓库压缩包下载至本地,再将其拷贝至内网服务器的目标工作目录,确保路径为 `~/ot_demo/msot/example`。 |
| 205 | 191 | ||
| 206 | ```text | 192 | ```text |
| 207 | https://gitcode.com/Ascend/msot | 193 | https://gitcode.com/Ascend/msot |
| @@ -30,7 +30,7 @@ MindStudio 算子开发工具链包含多种工具。本文档以开发一个简 | |||
| 30 | ✅ **请严格按以下指南完成环境安装:** | 30 | ✅ **请严格按以下指南完成环境安装:** |
| 31 | 👉 **[《昇腾 AI 算子开发工具链学习环境安装指南》](installation_guide.md)** | 31 | 👉 **[《昇腾 AI 算子开发工具链学习环境安装指南》](installation_guide.md)** |
| 32 | 32 | ||
| 33 | -> ⏱️ **外网可达环境下预计耗时:约 3 分钟** | 33 | +> ⏱️ **外网可达环境下预计耗时:约 3 分钟(具体时间受网络状况影响)** |
| 34 | > 安装完成后,您将获得一个预装所有算子工具、示例代码和依赖库的标准化容器环境。 | 34 | > 安装完成后,您将获得一个预装所有算子工具、示例代码和依赖库的标准化容器环境。 |
| 35 | 35 | ||
| 36 | #### 2.1.2 执行环境自检脚本(必须通过!) | 36 | #### 2.1.2 执行环境自检脚本(必须通过!) |
| @@ -39,20 +39,17 @@ MindStudio 算子开发工具链包含多种工具。本文档以开发一个简 | |||
| 39 | 39 | ||
| 40 | ```bash | 40 | ```bash |
| 41 | # 1. 容器环境检查 | 41 | # 1. 容器环境检查 |
| 42 | -[ -f /.dockerenv ] && [ -n "$ASCEND_HOME_PATH" ] && [ -n "$ATB_HOME_PATH" ] && echo -e "\033[32m[PASS] CANN 容器环境 OK \033[0m" || echo -e "\033[31m[FAIL] 非标容器或未进入容器!\033[0m" | 42 | +[ -f /.dockerenv ] && [ -n "$ASCEND_HOME_PATH" ] && [ -n "$ATB_HOME_PATH" ] && echo -e "\033[32m[PASS] CANN container environment OK \033[0m" || echo -e '\033[31m[FAIL] Non-standard container or not inside the container!\033[0m' |
| 43 | # 2. 芯片型号变量检查 | 43 | # 2. 芯片型号变量检查 |
| 44 | -[ -n "$MY_STUDY_VAR_CHIP_SOC_TYPE" ] && echo -e "\033[32m[PASS] 芯片型号: $MY_STUDY_VAR_CHIP_SOC_TYPE\033[0m" || echo -e "\033[31m[FAIL] 缺失环境变量 \$MY_STUDY_VAR_CHIP_SOC_TYPE\033[0m" | 44 | +[ -n "$MY_STUDY_VAR_CHIP_SOC_TYPE" ] && echo -e "\033[32m[PASS] Chip Soc type: $MY_STUDY_VAR_CHIP_SOC_TYPE\033[0m" || echo -e "\033[31m[FAIL] Missing environment variable \$MY_STUDY_VAR_CHIP_SOC_TYPE\033[0m" |
| 45 | # 3. 示例代码仓检查 | 45 | # 3. 示例代码仓检查 |
| 46 | -[ -d ~/ot_demo/msot/example/quick_start ] && echo -e "\033[32m[PASS] 示例代码仓 OK\033[0m" || echo -e "\033[31m[FAIL] 代码仓缺失\033[0m" | 46 | +[ -d ~/ot_demo/msot/example/quick_start ] && echo -e "\033[32m[PASS] Example code repository OK\033[0m" || echo -e "\033[31m[FAIL] Code repository missing\033[0m" |
| 47 | ``` | 47 | ``` |
| 48 | 48 | ||
| 49 | 🚀 **后续体验环节全程支持 Copy/Paste 快速执行,请按照每节中的步骤顺序操作,勿跳过或打乱操作步骤。** | 49 | 🚀 **后续体验环节全程支持 Copy/Paste 快速执行,请按照每节中的步骤顺序操作,勿跳过或打乱操作步骤。** |
| 50 | 50 | ||
| 51 | ### 2.2【设计】算子建模设计(msKPP) | 51 | ### 2.2【设计】算子建模设计(msKPP) |
| 52 | 52 | ||
| 53 | -> [!CAUTION]注意 | ||
| 54 | -> 本工具仅支持昇腾 910B 系列芯片。如需体验,请切换至搭载昇腾 910B 芯片的环境;否则,请跳过本节内容。 | ||
| 55 | - | ||
| 56 | 首先,进行算子算法设计。借助 msKPP 工具,可在秒级时间内获得算子性能建模结果,在无硬件条件下预估性能,快速验证实现方案的可行性。先跟着操作体验效果,原理部分可稍后阅读: | 53 | 首先,进行算子算法设计。借助 msKPP 工具,可在秒级时间内获得算子性能建模结果,在无硬件条件下预估性能,快速验证实现方案的可行性。先跟着操作体验效果,原理部分可稍后阅读: |
| 57 | 54 | ||
| 58 | > [!NOTE]说明 | 55 | > [!NOTE]说明 |
| @@ -60,7 +57,17 @@ MindStudio 算子开发工具链包含多种工具。本文档以开发一个简 | |||
| 60 | > **知识点:msKPP 工具原理** | 57 | > **知识点:msKPP 工具原理** |
| 61 | > msKPP 并非传统可执行程序,而是一套专用于昇腾的 Python 类库。用户需通过 import 相关模块、编写并执行 Python 脚本,生成性能分析结果文件以完成建模。内部原理是预先采集真实环境中各类指令操作的性能数据,基于用户定义的算子执行流程,对各种性能开销进行建模与估算。 | 58 | > msKPP 并非传统可执行程序,而是一套专用于昇腾的 Python 类库。用户需通过 import 相关模块、编写并执行 Python 脚本,生成性能分析结果文件以完成建模。内部原理是预先采集真实环境中各类指令操作的性能数据,基于用户定义的算子执行流程,对各种性能开销进行建模与估算。 |
| 62 | 59 | ||
| 63 | -#### 2.2.1 编写 Python 建模脚本 | 60 | +#### 2.2.1 环境检查 |
| 61 | + | ||
| 62 | +本工具**仅支持昇腾 910B** 系列芯片。请执行以下命令: | ||
| 63 | + | ||
| 64 | +```bash | ||
| 65 | +chip=$(npu-smi info -m 2>/dev/null | grep -oP 'Ascend\s*\S+' | head -1); case "$chip" in 'Ascend 910B'* ) echo -e "\n\e[32m[PASS] Chip SoC type [$chip] check passed. Please continue with the experience.\e[0m";; * ) echo -e "\n\033[31m[FAIL] Get chip: ${chip:-None}. The current environment does not support this tool. Please skip this experience.\033[0m" >&2;; esac | ||
| 66 | +``` | ||
| 67 | + | ||
| 68 | +若输出为 `[PASS]`,请继续进行体验;若输出为 `[FAIL]`,请切换至搭载昇腾 910B 芯片的环境后再进行体验;否则,请跳过本节内容。 | ||
| 69 | + | ||
| 70 | +#### 2.2.2 编写 Python 建模脚本 | ||
| 64 | 71 | ||
| 65 | 1. 创建子工作区目录 | 72 | 1. 创建子工作区目录 |
| 66 | 73 | ||
| @@ -82,7 +89,7 @@ MindStudio 算子开发工具链包含多种工具。本文档以开发一个简 | |||
| 82 | \cp -f ~/ot_demo/msot/example/quick_start/mskpp/mskpp_demo.py ./ | 89 | \cp -f ~/ot_demo/msot/example/quick_start/mskpp/mskpp_demo.py ./ |
| 83 | ``` | 90 | ``` |
| 84 | 91 | ||
| 85 | -#### 2.2.2 执行性能建模 | 92 | +#### 2.2.3 执行性能建模 |
| 86 | 93 | ||
| 87 | 执行 Python 脚本开始性能建模,如果成功,将自动在当前目录下生成 "MSKPP{timestamp}" 结果目录: | 94 | 执行 Python 脚本开始性能建模,如果成功,将自动在当前目录下生成 "MSKPP{timestamp}" 结果目录: |
| 88 | 95 | ||
| @@ -90,9 +97,9 @@ MindStudio 算子开发工具链包含多种工具。本文档以开发一个简 | |||
| 90 | python3 mskpp_demo.py | 97 | python3 mskpp_demo.py |
| 91 | ``` | 98 | ``` |
| 92 | 99 | ||
| 93 | -如果脚本报错,提示 Chip is unsupported,请确认环境变量 `MY_STUDY_VAR_CHIP_SOC_TYPE` 是否正确设置,如变量为空,请参考《[算子开发工具链学习环境安装指南](./installation_guide.md)》的第 3 节重新设置。 | 100 | +如果脚本报错,提示 Chip is unsupported,请确认环境变量 `MY_STUDY_VAR_CHIP_SOC_TYPE` 是否正确设置,如变量为空,请参考《[算子开发工具链学习环境安装指南](./installation_guide.md)》的第 3 节重新设置;若变量非空,请核实当前芯片型号是否为 910B 系列——本工具仅支持 910B 系列芯片,请切换至 910B 系列芯片环境后再进行体验。 |
| 94 | 101 | ||
| 95 | -#### 2.2.3 查看建模结果 | 102 | +#### 2.2.4 查看建模结果 |
| 96 | 103 | ||
| 97 | 以下为部分生成结果文件的示例: | 104 | 以下为部分生成结果文件的示例: |
| 98 | 105 | ||
| @@ -290,7 +297,7 @@ Init acl failed. ERROR: 1 | |||
| 290 | 297 | ||
| 291 | ```bash | 298 | ```bash |
| 292 | cd ~/ot_demo/workspace/src/AddCustom | 299 | cd ~/ot_demo/workspace/src/AddCustom |
| 293 | -printf '%s\n' "if(COMMAND add_ops_compile_options)" " add_ops_compile_options(ALL OPTIONS -sanitizer)" "elseif(COMMAND npu_op_kernel_options)" " npu_op_kernel_options(ascendc_kernels ALL OPTIONS -sanitizer)" "endif()" | cat - op_kernel/CMakeLists.txt > tmp && mv -f tmp op_kernel/CMakeLists.txt; | 300 | +sed -i '1i npu_op_kernel_options(ascendc_kernels ALL OPTIONS -sanitizer)' op_kernel/CMakeLists.txt |
| 294 | ``` | 301 | ``` |
| 295 | 302 | ||
| 296 | #### 2.4.2 构造内存越界错误 | 303 | #### 2.4.2 构造内存越界错误 |
| @@ -388,7 +395,7 @@ echo 1 > /proc/debug_switch | |||
| 388 | 395 | ||
| 389 | ```bash | 396 | ```bash |
| 390 | cd ~/ot_demo/workspace/src/AddCustom | 397 | cd ~/ot_demo/workspace/src/AddCustom |
| 391 | - printf '%s\n' "if(COMMAND add_ops_compile_options)" " add_ops_compile_options(ALL OPTIONS -g -O0)" "elseif(COMMAND npu_op_kernel_options)" " npu_op_kernel_options(ascendc_kernels ALL OPTIONS -g -O0)" "endif()" | cat - op_kernel/CMakeLists.txt > tmp && mv -f tmp op_kernel/CMakeLists.txt; | 398 | + sed -i '1i npu_op_kernel_options(ascendc_kernels ALL OPTIONS -g -O0)' op_kernel/CMakeLists.txt |
| 392 | ``` | 399 | ``` |
| 393 | 400 | ||
| 394 | 2. 重新编译部署算子 | 401 | 2. 重新编译部署算子 |
| @@ -487,7 +494,7 @@ source ~/ot_demo/msot/example/quick_start/msdebug/set_kernel_obj_env.sh | |||
| 487 | 494 | ||
| 488 | ```bash | 495 | ```bash |
| 489 | cd ~/ot_demo/workspace/src/AddCustom | 496 | cd ~/ot_demo/workspace/src/AddCustom |
| 490 | - printf '%s\n' "if(COMMAND add_ops_compile_options)" " add_ops_compile_options(ALL OPTIONS -g)" "elseif(COMMAND npu_op_kernel_options)" " npu_op_kernel_options(ascendc_kernels ALL OPTIONS -g)" "endif()" | cat - op_kernel/CMakeLists.txt > tmp && mv -f tmp op_kernel/CMakeLists.txt; | 497 | + sed -i '1i npu_op_kernel_options(ascendc_kernels ALL OPTIONS -g)' op_kernel/CMakeLists.txt |
| 491 | ``` | 498 | ``` |
| 492 | 499 | ||
| 493 | > [!NOTE]说明 | 500 | > [!NOTE]说明 |
| @@ -85,7 +85,7 @@ class OpRunner: | |||
| 85 | npu_ids = OpRunner._extract_npu_ids(result.stdout) | 85 | npu_ids = OpRunner._extract_npu_ids(result.stdout) |
| 86 | print("[INFO] Detected NPU IDs: " + str(npu_ids)) | 86 | print("[INFO] Detected NPU IDs: " + str(npu_ids)) |
| 87 | 87 | ||
| 88 | - idle = list(re.findall(r"No running processes found in NPU (\d+)", result.stdout)) | 88 | + idle = list(re.findall(r"No running processes found in NPU\s+(\d+)", result.stdout)) |
| 89 | idle = [int(x) for x in idle] | 89 | idle = [int(x) for x in idle] |
| 90 | print("[INFO] Available (idle) NPU IDs:" + str(idle)) | 90 | print("[INFO] Available (idle) NPU IDs:" + str(idle)) |
| 91 | if len(idle) == 0: | 91 | if len(idle) == 0: |