ARTICLE DETAIL

资讯详情

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

银河麒麟V10 CANN安装排查:version.cfg查版本、驱动找不到、nnrt无输出

银河麒麟V10 CANN安装排查:version.cfg查版本、驱动找不到、nnrt无输出 1. 从一次驱动装好了却查不到版本的现场说起如果你正在银河麒麟 V10 上折腾 CANN大概率会遇到这样一幕安装脚本一路回车跑完npu-smi info能出卡但nnrt --version敲下去光标闪两下就回到提示符什么都不打印。再翻文档让你去看version.cfg结果find半天不知道这个文件藏在哪一层。这三个现象——version.cfg 查版本、银河麒麟找不到驱动、nnrt --version 无输出——几乎是同一批人踩的同一串坑而且它们之间是有因果链的不是三个孤立问题。这篇内容就是把这串坑按我实际排查的顺序拆开讲。适合谁看手上有一台鲲鹏/飞腾/海光平台的银河麒麟机器正在装或升级 CANN异构计算架构Compute Architecture for Neural Networks被版本号、驱动路径、环境变量搞得头大的人。不管你是刚接触昇腾生态的新手还是从 CentOS 迁过来的老运维这里面的路径逻辑和排查手法都能直接抄。先说结论性的判断nnrt --version无输出九成不是 CANN 没装而是环境变量没生效或者装的是 runtime 包而非 toolkit 包银河麒麟找不到驱动八成是驱动装到了默认路径但系统不认识/usr/local/Ascend这个位置version.cfg 是查真实版本最靠谱的入口比任何--version都准。下面逐个展开。2. version.cfg 才是版本号的户口本2.1 为什么--version经常骗你很多人查 CANN 版本的第一反应是敲npu-smi info或者某个组件的--version。问题是昇腾这套软件栈是分层装的驱动driver、固件firmware、CANN toolkit、CANN runtimennrt、算子包每一层版本可以不一样。npu-smi info报的是驱动和固件的版本跟 CANN 的版本完全是两码事。你升级了 CANN 但没动驱动npu-smi显示的版本号纹丝不动这时候你以为升级失败了其实成功了。version.cfg不一样它是 CANN 安装时写进去的元数据文件记录的是这一层软件包自己的版本、安装路径、组件清单。它不会因为驱动没升级而失真所以查 CANN 真实版本认它最稳。2.2 version.cfg 到底在哪几个位置CANN 的安装路径取决于你装的时候选的是默认路径还是自定义路径。默认情况下root 用户装一般在/usr/local/Ascend普通用户装可能在$HOME/Ascend。version.cfg 通常出现在这几个地方/usr/local/Ascend/ascend-toolkit/latest/version.cfg—— toolkit 主包的版本信息/usr/local/Ascend/ascend-toolkit/latest/arch-linux/version.cfg—— 按架构分的子目录/usr/local/Ascend/nnrt/latest/version.cfg—— runtime 包的版本信息/usr/local/Ascend/driver/version.info—— 注意驱动这里是version.info不是.cfg我一般用一条命令直接扫find /usr/local/Ascend -name version.cfg -o -name version.info 2/dev/null如果这条命令什么都没输出那基本可以判定CANN 根本没装成功或者装到了非标准路径。这时候别急着怀疑驱动先确认安装脚本到底把东西放哪了。2.3 读懂 version.cfg 里的字段打开 version.cfg内容大概长这样version8.0.RC1 package_nameascend-toolkit install_path/usr/local/Ascend/ascend-toolkit/8.0.RC1 archaarch64几个关键字段要会看字段含义排查用途versionCANN 版本号判断是否需要升级、和文档对照package_name包名区分 toolkit / nnrt / nnaeinstall_path实际安装路径配环境变量时用这个别猜arch架构银河麒麟 ARM 版必须是 aarch64提示latest是个软链接指向具体版本目录。升级后如果latest没更新环境变量还指着旧版本就会出现装了新版但用的还是旧版的诡异现象。用ls -l /usr/local/Ascend/ascend-toolkit/看一眼软链接指向谁。2.4 一个容易被忽略的坑多版本共存机器上如果装过多个 CANN 版本/usr/local/Ascend/ascend-toolkit/下面会有8.0.RC1、8.0.RC2这样的多个目录latest只指向其中一个。这时候你source的环境变量脚本如果写死了旧版本路径version.cfg查出来是新版实际跑的却是旧版。我的习惯是每次升级后都重新确认三件事软链接指向、环境变量里的路径、version.cfg的 version 字段三者必须一致。3. 银河麒麟找不到驱动的真实原因3.1 报错长什么样先对号入座银河麒麟上找不到驱动有好几种表现别混为一谈npu-smi命令不存在 —— 驱动没装或没进 PATHnpu-smi info报 no device found —— 驱动装了但没识别到卡安装 CANN 时报 driver not found —— 安装脚本找不到驱动目录lsmod | grep drv没输出 —— 内核模块没加载这四种的根因完全不同。第一种是路径问题第二种可能是硬件或固件问题第三种是安装顺序问题第四种是内核模块编译问题。下面重点讲银河麒麟上最常见的第三种和第四种。3.2 驱动安装顺序先驱动后 CANN不能反昇腾的软件栈有严格的依赖顺序固件 → 驱动 → CANN toolkit/runtime。很多人图省事先装了 CANN再装驱动结果 CANN 安装时找不到驱动目录报错退出。这时候你重装 CANN 也没用因为驱动是后装的CANN 的安装脚本在装的时候做了一次驱动检查没通过就中断了。正确顺序装固件包firmware./firmware.bin之类装驱动包driver./Ascend-hdk-*-npu-driver_*.run --full重启驱动装完必须重启让内核模块加载验证npu-smi info能出卡再装 CANN toolkit 和 runtime注意银河麒麟 V10 基于较新的内核驱动包里的内核模块需要针对当前内核重新编译。如果驱动安装脚本报 kernel module build failed先确认kernel-devel和kernel-headers装了没有版本要和uname -r完全一致。3.3 银河麒麟特有的路径与权限问题银河麒麟的目录结构和标准 Linux 略有差异加上默认启用了更严格的安全策略驱动装完后经常出现文件在但系统不认的情况。几个高频点第一/usr/local/Ascend权限。如果安装时用的是普通用户目录属主是那个用户root 跑npu-smi时反而读不到。统一用 root 装或者装完chmod -R 755放开读权限。第二内核模块签名。银河麒麟默认可能开启内核模块签名校验第三方驱动模块加载会被拒。检查dmesg | grep -i module verification如果有 module verification failed需要在 BIOS 里关掉 Secure Boot或者给模块签名。第三ldconfig缓存没更新。驱动装完把库放到了/usr/local/Ascend/driver/lib64但系统动态链接器不知道。手动加一下echo /usr/local/Ascend/driver/lib64 /etc/ld.so.conf.d/ascend.conf ldconfig这一步做完很多找不到驱动的报错会直接消失。3.4 用lsmod和dmesg定位驱动加载失败驱动装完重启后先别急着跑 CANN按这个顺序验证# 1. 看内核模块加载了没 lsmod | grep -E drv|ascend # 2. 看设备节点在不在 ls -l /dev/davinci* /dev/devmm_svm # 3. 看内核日志有没有报错 dmesg | grep -iE davinci|ascend|drv | tail -50如果lsmod没输出说明模块没加载。手动加载试试modprobe drv_davinci modprobe drv_devmm_svm报错的话dmesg里会有具体原因常见的是 Unknown symbol依赖模块没加载或 Invalid module format内核版本不匹配。后者基本就是驱动包和当前内核不兼容得换匹配的驱动版本。4.nnrt --version无输出环境变量与包类型的双重陷阱4.1 先搞清楚 nnrt 是什么nnrt是 CANN runtime 包提供的命令行工具全称 Neural Network Runtime。它和npu-smi驱动层工具、atc模型转换工具toolkit 提供不是一回事。很多人装的是 toolkit 包里面根本没有nnrt这个命令敲下去当然没反应——但 shell 会报 command not found而不是无输出。无输出这个现象更微妙命令存在执行了但什么都没打印。这通常是两种情况一是环境变量没 source命令找到了但依赖库加载失败静默退出二是 nnrt 的版本信息输出被重定向或依赖某个环境变量没设置。4.2 环境变量到底要 source 哪个脚本CANN 装完后环境变量脚本在安装目录下名字类似set_env.sh。位置/usr/local/Ascend/ascend-toolkit/set_env.sh /usr/local/Ascend/nnrt/set_env.shsource 的时候要注意source /usr/local/Ascend/ascend-toolkit/set_env.sh如果只装了 runtime 没装 toolkit就 source nnrt 的那个。两个都装了一般 source toolkit 的就行它会带上 runtime 的路径。提示set_env.sh里会设置ASCEND_HOME_PATH、LD_LIBRARY_PATH、PATH等。source 完之后用echo $ASCEND_HOME_PATH确认一下如果为空说明脚本没生效或者路径不对。4.3 为什么 source 了还是无输出source 了环境变量nnrt --version还是没输出按这个链路排查第一步确认命令真的存在。which nnrt type nnrt如果which找不到说明 PATH 里没有 nnrt 所在目录。手动找find /usr/local/Ascend -name nnrt -type f 2/dev/null第二步确认动态库能加载。ldd $(which nnrt) | grep not found如果有 not found就是LD_LIBRARY_PATH没包含对应的 lib64 目录。手动补export LD_LIBRARY_PATH/usr/local/Ascend/nnrt/latest/lib64:$LD_LIBRARY_PATH第三步直接跑二进制看报错。/usr/local/Ascend/nnrt/latest/bin/nnrt --version 21把 stderr 也抓出来很多时候错误信息被吞了。如果报 error while loading shared libraries就是上一步的库路径问题。4.4 一个真实案例软链接断裂导致静默失败我遇到过一台银河麒麟机器nnrt命令在ldd也没报 not found但就是无输出。最后发现是latest软链接指向了一个已经被删掉的旧版本目录nnrt二进制本身能执行但它启动时去读同目录下的配置文件文件不存在程序内部捕获异常后直接exit(0)什么都不打印。排查方法ls -l /usr/local/Ascend/nnrt/latest readlink -f /usr/local/Ascend/nnrt/latest如果readlink -f输出的路径不存在就是软链接断了。修复cd /usr/local/Ascend/nnrt ln -sfn 8.0.RC1 latest这种坑最恶心的地方在于它不报错让你以为是环境变量问题绕一大圈。5. 把三个问题串起来一套完整的排查链路5.1 从零到跑通的验证清单把前面讲的整合成一套可复用的检查流程装完或升级完 CANN 后按顺序过一遍步骤命令预期结果异常处理1. 查驱动npu-smi info列出 NPU 卡信息无输出→查 lsmod/dmesg2. 查驱动版本cat /usr/local/Ascend/driver/version.info显示驱动版本文件不存在→驱动没装3. 查 CANN 版本find /usr/local/Ascend -name version.cfg列出多个 cfg无输出→CANN 没装4. 读版本cat path/version.cfgversion 字段有值字段为空→安装不完整5. source 环境source .../set_env.sh无报错报错→路径写错6. 验证变量echo $ASCEND_HOME_PATH输出安装路径为空→脚本没生效7. 查 nnrtnnrt --version输出版本号无输出→查 ldd/软链接8. 查 toolkitatc --version输出版本号无输出→toolkit 没装这张表我基本是贴在工位上的每次环境出问题从第 1 步往下走很少超过第 7 步还找不到原因。5.2 升级场景的特殊注意点升级和全新安装不一样升级最容易出问题的是旧版本残留。CANN 的升级脚本一般不会自动清理旧版本目录导致latest软链接还指向旧版本环境变量脚本里写的是旧版本绝对路径LD_LIBRARY_PATH里旧版本路径排在前面新版本库加载不到升级后的标准动作# 1. 确认新版本目录存在 ls /usr/local/Ascend/ascend-toolkit/ # 2. 手动更新软链接 cd /usr/local/Ascend/ascend-toolkit ln -sfn 8.0.RC2 latest # 3. 重新 source 环境变量 source /usr/local/Ascend/ascend-toolkit/set_env.sh # 4. 确认版本 cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg注意升级前把旧的set_env.sh备份一下升级后对比新旧脚本的差异能快速发现路径变化。我吃过一次亏新版脚本把某个变量名改了导致依赖它的业务脚本全挂。5.3 银河麒麟上几个反直觉的细节细节一/usr/local/Ascend可能被安全策略限制访问。银河麒麟的某些版本对/usr/local下的可执行文件有额外校验如果nnrt是从别处拷贝过来的可能被拦截。用ls -Z看 SELinux 上下文必要时restorecon -R /usr/local/Ascend。细节二date时间不对会导致安装脚本校验失败。银河麒麟重装系统后如果时间没同步安装脚本里的证书校验会失败报的错却和驱动无关。装之前先date看一眼不对就ntpdate同步。细节三ARM 架构下部分依赖包名和 x86 不同。比如ncurses-devel在 ARM 上可能叫ncurses-devel.aarch64离线安装时容易漏。装 CANN 前先把gcc、make、kernel-devel、ncurses-devel这几个基础包确认装好。6. 几个我踩过的坑和对应的土办法6.1 坑一nnrt --version无输出但atc --version正常这种情况说明 toolkit 装好了runtime 有问题。别急着重装先看nnrt依赖的库ldd /usr/local/Ascend/nnrt/latest/bin/nnrt | grep -i not found我遇到过一次是libascend_hal.so找不到这个库在 driver 目录下说明LD_LIBRARY_PATH里缺 driver 的 lib64。补上export LD_LIBRARY_PATH/usr/local/Ascend/driver/lib64:$LD_LIBRARY_PATH6.2 坑二银河麒麟找不到驱动其实是 udev 规则没生效驱动装完/dev/davinci0这些设备节点没自动创建。手动触发udevadm trigger udevadm settle如果还不行检查/etc/udev/rules.d/下有没有昇腾的规则文件没有的话从驱动包里拷一份过去。6.3 坑三version.cfg 显示版本对但业务跑不起来版本对不代表组件全。version.cfg只记录主包版本算子包、图编译器等子组件可能没装全。用 toolkit 自带的检查工具/usr/local/Ascend/ascend-toolkit/latest/tools/ascend_check/ascend_check.sh这个脚本会把所有组件的安装状态列出来缺哪个一目了然。6.4 一个提高效率的小习惯每次装完或升级完把关键信息存一份到文件里{ echo date ; date echo uname ; uname -a echo driver ; cat /usr/local/Ascend/driver/version.info 2/dev/null echo cann ; find /usr/local/Ascend -name version.cfg -exec cat {} \; echo npu-smi ; npu-smi info 21 } /tmp/ascend_env_$(date %Y%m%d).log下次出问题直接对比这份日志和当前状态能省掉大量重复排查。这个习惯是我从一次连续三天排查环境问题的经历里逼出来的现在成了肌肉记忆。环境这东西装一次顺一次但换台机器、换个系统版本坑又会以新面目出现。把 version.cfg 当版本基准、把驱动加载链路摸清、把 nnrt 无输出当成环境变量和软链接的联合问题来看这三条抓住了银河麒麟上的 CANN 安装升级基本就不会再让你卡住。
返回列表