ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Atlas 200 DK 垃圾分类实验踩坑指南:基于 CANN 的 atc 模型转换与 atlas_utils 配置避坑

Atlas 200 DK 垃圾分类实验踩坑指南:基于 CANN 的 atc 模型转换与 atlas_utils 配置避坑 1. 为什么垃圾分类实验总在 atc 和 atlas_utils 上翻车Atlas 200 DK 垃圾分类实验本质是把一个训练好的图片分类模型通常是 ResNet 或 MobileNet 系列通过 CANN 的 atc 工具转成昇腾能跑的 om 离线模型再在开发板上用 atlas_utils 这套 Python 封装库做推理。听起来链路清晰但真正动手时绝大多数人卡在两个地方一是 atc 模型转换报一堆看不懂的错二是 atlas_utils 装完 import 就失败。我见过太多人把 atc 命令直接敲在开发板上结果提示找不到工具也见过 atlas_utils 解压后目录多了一层 master 后缀PYTHONPATH 怎么配都 import 不进来。这些坑的共同点是官方文档默认你清楚开发机和开发板是两个不同的执行环境但教程里往往一笔带过。这篇内容面向正在做 Atlas 200 DK 垃圾分类实验、被 atc 转换和 atlas_utils 配置卡住的开发者。我会把可复制的 atc 转换命令、atlas_utils 环境配置骨架、以及一次完整的推理验证动作拆开讲重点放在报错定位和绕过方式上。你不需要重新搭一遍环境只需要对照自己的报错找到对应段落。先说清楚一个前提atc 是 CANN 工具链里的模型转换器它跑在装有 Ascend Toolkit 的开发机x86 Linux 或 ARM Linux 服务器上不是跑在 Atlas 200 DK 板子上。板子上只有推理运行时没有 atc。这个认知错位是后面一连串报错的根源。2. TaoToken 前置把模型对话和接入文档放在手边做垃圾分类实验时模型结构、输入输出节点名、预处理参数这些信息经常需要反复确认。我习惯在浏览器里开一个 TaoToken 的模型对话页面遇到不确定的算子支持情况或者 atc 参数含义直接问比翻文档快。它的模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 适合做这种即时的技术确认。如果你后面要写推理脚本、调 atlas_utils 的接口接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 里面有 API 调用和参数说明。需要生成 Key 的话走 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 控制台在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。这些不是实验的必需步骤但能帮你少查几次资料。真正跟实验强相关的是当你不确定某个模型能不能转、某个算子支不支持时先用模型对话确认一下比盲目跑 atc 再对着报错猜要高效。API 地址是 https://taotoken.net/api 不带多余参数。3. 可复制的 atc 转换命令与 atlas_utils 配置骨架3.1 atc 转换在开发机上跑不在板子上跑先确认你在开发机上且已经 source 过 Ascend 的环境变量。CANN 安装后一般会有类似/usr/local/Ascend/ascend-toolkit/set_env.sh的脚本执行source /usr/local/Ascend/ascend-toolkit/set_env.sh然后验证 atc 是否可用atc --version如果提示 command not found说明环境变量没生效或者你根本在板子上。板子上没有 atc别在这浪费时间。垃圾分类常用的模型输入是 224x224 的 RGB 图片假设你的模型是 caffe 或 onnx 格式转换命令骨架如下。以 onnx 为例atc --model./garbage.onnx \ --framework5 \ --output./garbage \ --input_formatNCHW \ --input_shapeinput:1,3,224,224 \ --logerror \ --soc_versionAscend310 \ --output_typeFP32几个参数必须对上--framework5表示 onnxcaffe 是 0tensorflow 是 3--input_shape里的节点名input必须和模型实际输入节点名一致写错会报 input name not found--soc_version对 Atlas 200 DK 是 Ascend310写错会报不支持的 soc 版本。转换成功后会在当前目录生成garbage.om。这个 om 文件才是要传到板子上的东西不是原始模型。3.2 atlas_utils 配置目录结构和 PYTHONPATH 是关键atlas_utils 不是 pip 能装到的包它是昇腾样例仓里的 Python 公共库。从仓库下载后解压出来的目录经常带-master后缀比如samples-master。这个后缀本身不影响但你的 PYTHONPATH 必须指到common目录的上一级。假设你把样例仓放在$HOME/samples目录结构应该是$HOME/samples/ └── python/ └── common/ └── atlas_utils/ ├── __init__.py ├── acl_resource.py └── ...配置环境变量export PYTHONPATH$HOME/samples/python/common/:$PYTHONPATH验证是否能 importpython3 -c from atlas_utils.acl_resource import AclResource; print(ok)输出 ok 就说明路径对了。如果报ModuleNotFoundError: No module named atlas_utils九成是 PYTHONPATH 指错了层级或者目录名被改过。注意atlas_utils 的版本要和 CANN 版本匹配。CANN 5.0.x 对应样例仓的 v5.0.0 分支版本错配会出现接口对不上的报错。3.3 推理脚本的输入输出对齐垃圾分类推理脚本一般长这样核心是加载 om 模型、做预处理、送推理、取结果import numpy as np from atlas_utils.acl_resource import AclResource from atlas_utils.acl_model import Model from atlas_utils.acl_image import AclImage acl_resource AclResource() acl_resource.init() model Model(./garbage.om) image AclImage(./data/banana.jpg) result model.execute([image, ]) print(result[0])这里model.execute的输入列表要和模型输入个数一致输出是个列表取result[0]拿到分类得分。如果报维度不匹配回去检查 atc 转换时的--input_shape和预处理是否一致。4. 验证请求与成功结果4.1 先验证 atc 转换产物转换完成后在开发机上确认 om 文件存在且大小合理ls -lh garbage.om一个 224x224 的轻量分类模型om 文件通常在几 MB 到几十 MB。如果只有几 KB说明转换中途失败了回去看 atc 的完整日志把--logerror改成--loginfo能看到更多细节。4.2 再验证板子上的推理把 om 文件和测试图片传到板子上scp garbage.om HwHiAiUser192.168.1.2:/home/HwHiAiUser/ scp -r ./data HwHiAiUser192.168.1.2:/home/HwHiAiUser/登录板子配好 PYTHONPATH跑推理ssh HwHiAiUser192.168.1.2 export PYTHONPATH$HOME/samples/python/common/:$PYTHONPATH python3 classify_test.py ./data/成功的输出会打印每张图片的类别和置信度类似banana.jpg: 0.923 bottle.jpg: 0.887如果输出全是同一个类别或者置信度都在 0.1 附近说明预处理或标签映射有问题不是 atc 的锅。4.3 用模型对话交叉确认当你对某个中间结果不确定时可以把模型结构、输入输出信息贴到模型对话里问一下确认节点名和维度。这一步能省掉很多来回试错的时间。5. 本篇常见错排查5.1 atc 报 input name not found原因--input_shape里的节点名和模型实际输入名不一致。用 netron 打开 onnx 模型看第一层的输入名或者用atc --modelxxx --framework5 --mode1先跑一次看它提示的输入名。5.2 atc 报 unsupported soc version原因--soc_version写错。Atlas 200 DK 是 Ascend310Atlas 800 是 Ascend910。写错就报这个。5.3 import atlas_utils 失败原因PYTHONPATH 层级不对。正确层级是.../python/common/不是.../python/common/atlas_utils/。多一层少一层都会失败。5.4 板子上 pip3 install 报网络错误原因板子默认没配源。换清华的 ubuntu-ports 源注意是 arm64 架构用ubuntu-ports不是ubuntu。改完/etc/apt/sources.list后apt update再装。5.5 推理结果全是同一类原因预处理和模型训练时的预处理不一致。检查归一化参数、通道顺序RGB 还是 BGR、resize 方式。atlas_utils 的 AclImage 默认读出来是 BGR如果模型训练用的是 RGB需要转换。5.6 板子连不上原因USB 网卡 IP 冲突。开发板默认 IP 是 192.168.1.2如果你本地网络也是这个网段会冲突。改本地网卡 IP 到 192.168.1.x 的其他地址或者改板子 IP。6. 继续做下去的几个入口垃圾分类实验跑通之后下一步通常是换模型、加类别、或者把推理接到摄像头做实时分类。这时候你会需要更频繁地查接口和调参数。长期做编码和 Agent 方向的话Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 适合把这类实验脚本的调试过程沉淀下来。ClaudeCodeAnthropic 入口在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 做代码辅助时可以用。回到实验本身我踩过最深的坑是以为 atc 能在板子上跑折腾了半天才发现工具链根本不在板子上。第二个坑是 atlas_utils 解压后目录名带后缀PYTHONPATH 怎么配都不对最后把目录 mv 掉才顺。这两个点确认清楚剩下的就是预处理对齐和版本匹配的细活。
返回列表