ARTICLE DETAIL

资讯详情

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

Atlas 300i Duo在银河麒麟V10上的部署实战:固件与驱动避坑指南

Atlas 300i Duo在银河麒麟V10上的部署实战:固件与驱动避坑指南 1. 部署前的兼容性功课为什么在麒麟上搞昇腾特别费劲先说结论Atlas 300i Duo在银河麒麟V10上部署真正折磨人的不是硬件本身而是软件栈的版本组合。这张卡本身是华为昇腾系列里的双芯片推理卡两颗Ascend 310处理器常用于边缘侧的AI推理场景比如视频分析、图像识别这类对算力密度有要求但又不需要训练能力的业务。卡是好卡但如果你是从x86服务器上迁移过来的或者习惯了Ubuntu那套apt install一把梭的流程第一次在麒麟上搞这玩意大概率会被固件、驱动、系统内核三者之间的版本匹配问题搞得头皮发麻。先说清楚一个背景银河麒麟V10是基于Linux内核的国产操作系统它的包管理、内核版本、安全机制跟CentOS系有千丝万缕的关系但又不完全一样。你搜到的很多教程可能是基于Ubuntu或者CentOS 7写的直接照着在麒麟上跑常见的结果就是驱动编译报错、固件升级工具起不来、npu-smi命令找不到设备甚至更玄学的——装完一切正常重启之后又丢了。这些都是我实际遇到过的所以这篇笔记我不打算写那种官方文档式的操作手册而是把我从系统准备到固件升级、再到驱动安装和验证的全过程记录下来重点放在那些坑上以及我最后是怎么爬出来的。在讲步骤之前先统一一下环境基线后面所有操作都基于这套配置项目配置操作系统银河麒麟V10 SP1 x86_64内核版本4.19.90-17.ky10服务器泰山服务器 / 通用x86服务器均可加速卡Atlas 300i Duo双Ascend 310固件版本1.22.0配套驱动版本对应驱动版本21.0.3这套组合是我反复验证过能用的如果手头版本跟我这里不完全一样没关系逻辑是通用的只是具体文件名和下载地址会有差异。1.1 Atlas 300i Duo的硬件特征与部署难点Atlas 300i Duo这卡外观上就是一块标准的PCIe半高卡两颗Ascend 310芯片共板。Ascend 310这芯片大家应该不陌生是昇腾系列里专门为推理场景设计的那一颗INT8算力大概是22TOPS两颗加起来44TOPS。实际做视频解码和推理业务的时候这卡的表现相当可以比纯CPU扛神经网络推理要快出好几个量级。但难点不在这而在驱动栈。昇腾的软件栈分成好几个层次底层是驱动upgrade-driver、中间是固件upgrade-firmware、上面是CANN华为的异构计算架构。这三个东西的版本之间有严格的配套关系不是说固件最新、驱动最新就万事大吉。我曾经就干过一件蠢事——固件升级到最新版驱动也装最新的结果固件和驱动版本不匹配卡死活不被系统识别后来老老实实按配套表逐一对齐才解决。这个版本配套表在华为昇腾社区的“版本配套表”里能找到但问题在于表里列出的是官方支持的操作系统麒麟V10在很长一段时间里并不在那个列表里。这就引出了第一个核心难点官方没有针对麒麟V10的适配文档你需要自己去试哪些版本组合能在麒麟上正常跑起来。我最后锁定的组合是固件1.22.0 驱动21.0.3 CANN 5.1.RC1这套在几个不同型号的服务器上验证过都能稳定运行。建议你在部署时优先参考这个组合如果确实需要更新版本一定要先看配套表不要盲目追新。1.2 安装顺序为什么必须是“先系统、再固件、后驱动”这里多说一句安装顺序的逻辑。很多人拿到卡之后第一件事就是插上去、装驱动、跑demo跳过固件升级结果驱动装到一半报错说固件版本不匹配。我的习惯是系统层面先准备好然后升级固件让卡先能被识别最后再装上层驱动。这个顺序是有原因的——固件是卡的底层系统负责硬件初始化和PCIe链路通信驱动是操作系统跟固件对话的通道。如果固件版本过旧新驱动里用到的某些接口在固件层根本不存在驱动加载的时候就会直接失败。反过来如果先装了驱动再升固件又有可能因为驱动占用了设备文件导致固件升级工具无法正常访问硬件。所以正确路径是先把操作系统环境整理干净确认内核开发环境就绪然后升级固件再装驱动最后上CANN推理环境。整个过程一环扣一环每一步都验证通过了再进行下一步。2. 系统层准备装驱动前必须搞掂的几件事很多教程会直接跳到驱动安装那一步但我在实战中发现系统层面如果有几个隐藏问题没处理好后面装驱动的时间会成倍增加。这一节把我在麒麟V10上踩过的系统坑以及对应的预处理方案完整列出来建议按顺序执行。2.1 关闭安全模块SELinux和防火墙带来的隐藏故障麒麟V10默认是带SELinux的而且可能是enforcing状态。SELinux这东西在桌面系统上感知不强但在加载内核模块、设备文件访问这个场景下它是实实在在会拦路的。驱动安装过程中的一些操作比如创建设备节点、修改内核模块参数都会被SELinux的策略限制报错又报得很隐晦日志里看不出来是权限问题还是模块问题。我的做法是先把SELinux切到permissive模式等部署完再按需审计。修改方式跟CentOS一样sed -i s/SELINUXenforcing/SELINUXpermissive/g /etc/selinux/config setenforce 0 getenforce # 确认输出为 Permissive还有firewalld。Atlas 300i Duo是推理卡理论上不占用网络端口但CANN工具链在后续做多卡通信、联网推理的时候会用到一些端口为了避免后续排查困难部署期间直接关掉。systemctl stop firewalld systemctl disable firewalld systemctl status firewalld # 确认状态为 inactive这一步没有任何技术难度但它能帮你砍掉一批极其隐蔽的权限类故障。如果你最终部署完了一切正常再回过头来按需把SELinux切回enforcing逐一放行所需策略这种“先关后开”的思路在国产系统上比“一步到位”要高效得多。2.2 内核开发环境与DKMS最容易忽略的前置依赖驱动安装的本质是把内核模块编译进当前内核所以系统里必须有一个完整的编译链环境包括gcc、make和kernel-headers。麒麟V10自带的gcc版本通常是7.3.0这个版本编译昇腾驱动没问题。但如果你的系统是精简安装很可能没有装kernel-devel包导致编译时找不到内核头文件报一堆类似linux/version.h: No such file or directory的错误。yum install -y gcc gcc-c make kernel-devel-$(uname -r)这里有个细节uname -r输出的内核版本号必须跟kernel-devel包的版本号完全一致。麒麟的yum源里有时会默认装一个跟当前内核版本不匹配的kernel-devel所以在装完之后务必验证一下ls /usr/src/kernels/$(uname -r)如果能正常列出目录内容说明内核头文件就绪。如果目录为空或不存在说明kernel-devel装了个寂寞需要手动从麒麟源里安装对应版本。这一步没搞好的话驱动安装脚本在编译模块时会非常痛苦报错信息还不太直观——它可能直接编译失败也可能假装成功但模块文件是空的。另外我还强烈建议确认一下DKMSDynamic Kernel Module Support是否已经安装并可用。通俗理解DKMS的作用是当系统重启后切换内核版本时它能自动为新内核重新编译驱动模块避免了重启后驱动丢失的问题。在手工部署的场景里这一点看似很自然但如果你不主动安装DKMS驱动装好之后一旦遇到内核小版本更新基本就只能手动重新编译很容易被忽略。查看是否装有dkmsrpm -qa | grep dkms没有的话先装上yum install -y dkms如果说国产系统最怕重启后“全体失联”的驱动坑DKMS就是专门治这个的别跳过它。2.3 预留连续内存让固件升级工具有足够空间这是个非常容易翻车的点。Atlas 300i Duo在升级固件的时候需要一段连续性物理内存作为DMA缓冲区如果系统预留不足升级工具可能在中途崩溃严重的时候直接让卡变成半砖状态。在麒麟V10上我建议在/etc/default/grub里给内核加上mem预留参数或者通过昇腾工具自带的配置脚本做。但最稳妥的做法是在BIOS的BIOS配置里给PCIe设备预留大块连续内存一般建议预留1GB以上同时在grub里确认没有显式约束内存上限。检查方法很简单cat /proc/cmdline如果里面有什么mem2048M之类的限制参数去掉它重新生成grub配置后重启。这一步不做的话后面固件升级工具很容易在中途报out of memory相关的错误而且固件写入一半失败处理起来非常麻烦。我后面在固件升级那一节会用到这个经验。再补充一个惯例如果你是第一次在服务器上插这张卡确认PCIe插槽有足够供电、卡的金手指插紧并且服务器风扇能正常转动覆盖到卡的区域。Ascend 310虽然功耗不高单卡大概几十瓦但主动散热还是很重要的。供电不足会直接导致频繁掉卡甚至固件写入中途卡死。3. 固件升级的完整链路与翻车处理固件升级是整个部署过程中最容易把人劝退的环节。Atlas 300i Duo在全新的状态下板载固件版本往往跟最新驱动不匹配如果不先升级固件直接装驱动很可能会出现“驱动加载成功但设备状态异常”的情况。这里我把固件升级从获取到验证的完整流程和避坑点一一讲清楚。3.1 获取固件包版本匹配是第一优先级固件包在华为昇腾社区的“固件与驱动”下载页面能找到文件名通常是A300-300i-NPU_Firmware-{版本号}.run。但这里要警惕一个非常常见的操作误区看到页面上的最新固件就直接下载。我在前面提到过昇腾的驱动、固件、CANN三者之间有严格配套固件不是越新越好而是越“匹配”越好。我的经验是先确定你计划安装的驱动版本然后根据这个驱动版本在配套表里找到对应的固件版本。我用的组合是驱动21.0.3配套固件是1.22.0配套CANN是5.1.RC1。这套组合在麒麟V10 SP1上实测能跑通性能也正常。如果你用了更新的驱动比如CANN 6.x系列对应的驱动那固件版本大概率也要跟着升具体的配套关系以昇腾社区Pages里的“版本配套表”为准。另外需要提醒的是固件升级工具A300-300i-NPU_Firmware-{版本号}.run必须使用root权限执行且需要保证系统中有dialog、pciutils等基础工具yum install -y pciutils dialog net-tools很多人在这一步就开始踩坑了——直接运行固件升级脚本提示缺少某个命令误以为是固件包被损坏了。实际上只是基础工具没装齐全先补上就好了。3.2 固件升级完整操作从备份到执行的逐步说明在正式升级前建议先检查当前固件版本看看是不是已经跟目标版本一致npu-smi info -t board这里的npu-smi如果暂时没有安装或找不到命令也别急——它属于驱动工具包里的内容固件升级前系统里可能还没有。那就先用固件升级脚本自带的功能做检测后续装完驱动后再用npu-smi确认即可。我的升级习惯是分三步走。首先把固件包放在一个空间充足的目录下至少预留1GB剩余空间比如/opt目录然后给升级脚本添加可执行权限chmod x A300-300i-NPU_Firmware-{版本号}.run第二步运行自动升级模式。固件升级脚本支持--full参数来自动完成整个流程不需要人工交互非常适合脚本化部署./A300-300i-NPU_Firmware-{版本号}.run --full升级过程大概需要几分钟中间会打印很多输出。这里注意观察关键节点脚本会检测当前固件版本、对比目标版本然后进行固件写入和校验两个大阶段。如果一切正常会在最后输出“upgrade firmware success”之类的字样并提示需要重启。第三步重启系统然后在BIOS自检阶段注意观察卡是否被正确枚举。这一步为什么重要因为固件升级的本质是改写Atlas 300i Duo板载的Flash存储它直接影响卡的PCIe枚举和系统识别能力。如果固件写入成功但校验失败卡可能直接不被系统识别甚至连lspci都看不到设备。所以重启后第一步先用lspci确认硬件状态lspci | grep -i accelerate正常输出会看到类似Processing accelerators: Huawei Technologies Co., Ltd. HiSilicon PCIe SSIO ...这样的信息这是硬件链路已打通的信号。3.3 固件升级失败的处理思路怎么把半砖状态救回来这一节是重点中的重点。固件升级失败一般是两种情况一是升级中途断电或脚本被强制中断导致Flash写入不完整二是固件包本身校验失败在写Flash之前就被中断。我第一次独立部署到断电翻车场景时第一反应是“完了卡砖了”。但后来验证下来Atlas 300i Duo的固件升级有AB双分区保护机制即使在升级过程中断电旧固件分区依然能引导卡进入可恢复状态并不会直接变砖。所以遇到升级失败不要慌按下面的排查链路来处理。先确认卡还能不能被PCIe总线识别lspci | grep -i huawei如果这里能看到设备说明硬件链路正常恢复的希望很大。如果输出为空先检查服务器是否识别到PCIe卡严重时可尝试换个PCIe插槽再开机。确认硬件链路没问题之后重新运行升级脚本。这里有个技巧用--force参数强制覆盖写入一次./A300-300i-NPU_Firmware-{版本号}.run --full --force强制刷写的过程会比正常升级慢一些因为脚本会跳过版本比对直接重写Flash。需要耐心等。如果强制刷写也报错接下来检查系统里有没有残留的驱动模块在占用设备lsmod | grep drv如果确实有残留驱动模块比如drv_pcie_host、drv_vdev这些需要先手动卸载掉再重试rmmod drv_pcie_host rmmod drv_vdev再补充一个更极端的思路——如果卡完全不被系统识别尝试换一台服务器或者换个PCIe插槽排除服务器PCIe链路故障。这类半砖恢复本质上拼的是耐心和环境干净不要急于重试升级先确认底层链路正常。这一整套方案下来我还没遇到过彻底救不回来的情况。所以如果你在固件升级时翻车了稳住心态按顺序排查就好。4. 驱动安装的分步实操与报错归因固件升级完成且硬件能被系统识别之后终于进入全程最核心的部分——驱动安装。这一节我会把驱动安装的前后逻辑、完整命令、以及常见的报错排查思路都覆盖到给你一套可以直接“抄作业”的路径。4.1 驱动的层级结构与下载要点分清Driver和CANN昇腾的驱动安装包里其实又细分了两类东西一类是driver负责最底层的内核模块和硬件通信另一类叫firmware就是我们上一节里处理过的固件。两大部分共同组成了完整的“驱动-固件”软件栈其中driver又分为普通Driver和npu驱动两个子模块。在昇腾社区的下载页面上我们能看到“驱动”下面有多个.run文件常见的有Ascend-cann-npu_21.0.3_linux-x86_64.run和Ascend-hdk-{版本}-linux-x86_64.run之类的。前者是CANN运行时环境后者是配套的Hdk华为开发套件——驱动本体通常藏在Hdk包里。如果你只装了CANN而没装HDK驱动npu-smi是能装上的但内核驱动模块并没有真正加载实际上卡是跑不起来的。这是一个非常典型而且容易搞混的点许多人卡在“驱动装上去了但设备没反应”其实无关兼容性而是选错了安装包。所以我的建议是下载安装包时优先把“固件包”和“驱动包”带HDK字样以及“CANN toolkit”三个都准备好。固件已经装过的话驱动和CANN是必装的。4.2 驱动安装实操步骤与参数选择驱动安装其实不像固件那样高风险但步骤看似简单依然有一些关键坑。先把驱动包解压出来。昇腾驱动包支持直接通过--full参数运行全量安装运行时会自动把驱动模块编译进当前内核并安装对应的工具和库文件chmod x Ascend-hdk-{版本号}-linux-x86_64.run ./Ascend-hdk-{版本号}-linux-x86_64.run --full安装过程中建议打开另一个ssh窗口轮流跑tail -f /var/log/message或dmesg -w观察内核模块加载过程中有没有报错。驱动安装本质上是“编译内核模块 → 复制库文件 → 注册服务 → 创建设备节点”的一系列动作每一步在系统日志里都有迹可循。正常情况下安装完成后/usr/local/Ascend/driver目录下会有对应的链接目录和版本信息。需要注意安装过程中脚本可能会要求你确认使用哪个目录作为安装路径默认是/usr/local/Ascend强烈建议保持默认。CANN、driver和firmware都装在同一个大目录下后续升级和排查会省心很多。如果你为了所谓的“整洁”把驱动拆到别的目录后面source set_env.sh的时候很容易漏环境变量。安装完成后需要做一次环境变量配置。打开/etc/profile在文件末尾添加昇腾相关路径vim /etc/profile在末尾加上export ASCEND_HOME/usr/local/Ascend export ASCEND_DRIVER_PATH$ASCEND_HOME/driver export LD_LIBRARY_PATH$ASCEND_DRIVER_PATH/lib64:$ASCEND_HOME/toolkit/lib64:$LD_LIBRARY_PATH export PATH$ASCEND_HOME/toolkit/bin:$ASCEND_HOME/atc/bin:$PATH保存退出后执行source /etc/profile这样全局环境变量就配置好了。4.3 加载内核模块与设备节点装完不等于能用驱动安装脚本执行完成后先别急着跑示例先确认内核模块已经成功加载。执行lsmod | grep drv正常情况下会看到一批drv_pcie_host、drv_vdev、drv_venc、drv_vpc之类的模块。如果这个列表是空的说明模块没有自动加载需要手动执行模块加载modprobe drv_pcie_host modprobe drv_vdev这里有一个特别反直觉的坑手动modprobe可能会提示找不到模块但模块文件明明在/usr/local/Ascend/driver/lib64/driver目录下。原因在于depmod的模块依赖索引没有更新。解决办法depmod -a modprobe drv_pcie_host如果手动modprobe还是加载失败用dmesg看最后几行这能直接告诉你模块加载失败是符号缺失、内核版本不匹配、还是其他原因。在我经历过的案例里“模块符号缺失”往往是最耗排查时间的类型——它通常意味着驱动内核模块和当前内核版本的API接口对不上基本只能换用与该内核版本配套的驱动版本。设备节点方面驱动模块加载成功后/dev/davinci0和/dev/davinci1这两个设备文件应该会出现在系统中分别对应该卡的逻辑设备节点ls /dev/davinci*如果设备节点缺失可以手动创建mkdir -p /dev mknod /dev/davinci0 c 254 0 chmod 666 /dev/davinci*但说实话mknod只是应急手段主设备号254是昇腾驱动通用的主设备号如果你这边的设备号不一致说明之前设备节点被其他东西占用过还是优先排查驱动加载源头。设备节点正常生成后驱动层面的工作基本就结束了。5. 验证、性能确认与后续运维装完不是终点驱动装上了、设备节点也有了但这时候判断“部署成功”还为时过早。没有经过实际推理验证的部署随时可能给你表演一个“驱动正常但就是跑不了业务”。这一节把验证和后续运维的关键点讲透。5.1 用npu-smi确认双芯片状态型号、固件版本、温度、算力占用npu-smi是昇腾上下最核心的监控工具装完驱动后它就在/usr/local/Ascend/driver/tools/目录下。直接执行npu-smi info正常情况下会看到两张Ascend 310芯片的信息包括芯片型号、固件版本、温度、HBM使用情况、算力占用率等。注意检查固件版本是不是我们预期升级到的1.22.0如果不是回到第3节重刷固件。再提供一个进阶检查项查看当前芯片的详细信息npu-smi info -t board这个命令会显示板卡的整体状态包括PCIe链路速率、槽位、是否处于正常状态等。如果这里的健康状态不是正常而是“Abnormal”或“Offline”多半是固件和驱动版本不搭要不就是PCIe链路速率协商失败需要检查是否插在了低速插槽上有些服务器会有PCIe x1的插槽带宽不够就会导致异常。5.2 跑一次推理验证从atc模型转换到实际执行确认芯片状态正常后我强烈建议跑一次完整的推理链路来验证“驱动→固件→CANN→模型→推理”全链路都通。这是部署成功的最有力证明也让后续业务接入时少一些“环境问题”。先准备一个ONNX模型或直接用官方提供的预置模型用atc工具转换成昇腾的.om离线模型格式source /usr/local/Ascend/ascend-toolkit/set_env.sh atc --modeltest.onnx --framework5 --outputtest --soc_versionAscend310这里注意两个参数--framework5表示ONNX模型--soc_versionAscend310指定芯片型号。如果你用的是其他模型格式framework取值不同Caffe是0TensorFlow是1或3别抄错了。转换成功后会生成test.om文件再使用昇腾的推理引擎加载它跑一次。以Python为例一个最简的验证脚本如下import numpy as np from ais_bench.infer.interface import InferSession session InferSession(0, test.om) # 构造一个形状匹配的输入数据 fake_input np.random.rand(1, 3, 224, 224).astype(np.float32) output session.infer(fake_input)[0] print(output.shape)如果这一步能正常输出结果的shape那么恭喜——整条链路所有环节都打通了。如果在这一步出现类似Initialize failed或acltdt相关的报错大概率是CANN环境变量没配对回到4.2核对set_env.sh是否source成功。5.3 重启后的稳定性从“能跑”到“一直能跑”部署完成后最后一个隐藏坑往往在重启之后爆发开机后设备节点消失、驱动模块没加载、npu-smi报设备不可用。这在国产系统上特别常见原因往往是驱动模块没有被设置成开机自动加载。我的习惯是在确认一切正常后主动做一次完整的重启测试并在重启后依次检查lsmod | grep drv ls /dev/davinci* npu-smi info如果重启后模块确实没有自动加载写一个模块加载脚本放进/etc/rc.d/rc.local并赋予执行权限#!/bin/bash modprobe drv_pcie_host modprobe drv_vdevchmod x /etc/rc.d/rc.local但这只能算是一种补丁做法。我更推荐的做法是把驱动安装脚本提供的driver服务设置开机自启。昇腾驱动安装之后会注册一个npu-smi.service不同版本名称可能不同确认它的状态systemctl list-unit-files | grep npu systemctl enable npu-smi.service systemctl start npu-smi.service还有一种“重启后驱动失效”的情况是内核自动更新导致内核版本变化旧驱动模块对新内核不兼容。这一块的根治方法是定期检查系统是否自动更新了内核并在内核更新后重新执行一次完整驱动安装流程或依赖DKMS机制自动完成重建前提是之前已经装好DKMS。从长期运维的角度我建议把固件包、驱动包、CANN部署包以及当时的部署命令记录下来做成一份环境交付手册。原因是昇腾这套软件栈一旦过了几个版本文件路径、环境变量名、配套关系都可能变化到时候再想参照这份笔记就能避开坑却避不开版本差异。保存好当前能跑的版本组合是你能给自己的未来省下最多时间的事。6. 常见报错的排查链路按“排查→归因→解决”的顺序来这一节汇总我在整个部署过程中遇到的几类高频报错以及对应的完整排查链路。做成表格方便对应但有个前提——这些排查顺序都是我踩坑总结出来的不是官方手册的机械翻译。现象可能原因排查路径解决办法npu-smi info找不到设备驱动模块未加载lsmod | grep drvdepmod -a modprobe drv_pcie_host设备节点缺失udev规则未刷新ls /dev/davinci*重启或mknod手动创建固件升级报OOM连续内存不足查看/proc/cmdline是否有mem限制去除限制、BIOS预留给PCIe设备驱动编译时报version.h缺失kernel-devel版本不匹配ls /usr/src/kernels/$(uname -r)安装与内核完全一致的kernel-devel推理时报Initialize failed环境变量未配置echo $LD_LIBRARY_PATHsource对应的set_env.sh驱动安装后重启丢失未配置开机自启systemctl list-unit-files | grep npu启用npu-smi.service或写rc.local6.1 驱动编译报错的完整归因过程驱动安装脚本在编译内核模块时最常报的错是Error: kernel config is invalid或unable to find linux/version.h。不要急着去网上搜“麒麟V10 内核模块编译失败”第一步先确认内核头文件是否真的就位rpm -qa | grep kernel-devel uname -r比对一下两个输出的版本号。如果版本号不一致用yum安装精确匹配的版本即可yum install -y kernel-devel-$(uname -r)如果头文件没问题但编译还是报kernel config is invalid这种情况通常是因为系统内核的.config文件缺失或不完整。需要确认/boot/config-$(uname -r)存在如果不存在从同型号机器上拷贝一份同名内核的config文件放到/boot下即可。听起来有点粗暴但确实能解决一批“编译环境完整但config校验不过”的问题。6.2 固件升级工具报错的快速恢复法固件升级工具在执行时如果报[ERROR] cant open device大概率是系统里残留的驱动占用了卡。解决的套路是先卸载所有昇腾相关内核模块rmmod drv_pcie_host drv_vdev drv_venc 2/dev/null随后确认/dev/davinci*设备文件是否还存在如果有先手动删掉rm -f /dev/davinci*然后再重新执行固件升级脚本。理论上让卡处于“未被任何驱动占有”的状态下执行固件写入成功率会高很多。如果这一步还不行结合3.3节的强制刷写操作来复现一下基本能把问题缩小到“硬件链路”或“固件包损坏”二选一的层面。6.3 设备节点消失的udev规则配置重启后/dev/davinci*不存在但lsmod显示驱动模块已加载——这种情况我遇到过一次当时的直觉是“驱动没起来”但排查下来发现是闪腾设备节点没有触发udev规则。解决方法是写一条udev规则来确保设备节点自动创建。在/etc/udev/rules.d/下新建80-npu.rules文件KERNELdavinci*, MODE0666, GROUProot KERNELAscend*, MODE0666, GROUProot保存后重载规则udevadm control --reload-rules udevadm trigger这样重启后设备节点会自动带好权限避免后续用非root用户跑推理时遇到Permission denied的问题。多说一句Ascend环境里有很多小细节比如设备文件的权限、用户组的归属、环境变量的加载方式在不同版本之间变化很大。我建议把部署过程中的每一步、每一个报错、每一条修复命令都记录下来形成自己的环境知识库——毕竟这套东西教程写得再好也不如自己踩坑得出的排查链路来得可靠。
返回列表