ARTICLE DETAIL

资讯详情

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

昇腾310P在Ubuntu 20.04上的驱动、固件与MCU部署避坑指南

昇腾310P在Ubuntu 20.04上的驱动、固件与MCU部署避坑指南 昇腾310P这块卡我前后在Ubuntu 20.04上部署过好几台机器每次踩坑的点都不太一样。单看网上的教程大多只讲到“装个驱动、跑个示例”就结束了但真正到了生产环境你会发现驱动只是最上面那一层固件和MCU才是决定板卡稳不稳、能不能被正确管理起来的关键。这篇文章我就把从驱动到固件再到MCU的完整软件栈部署过程捋清楚包括每层解决什么问题、安装顺序为什么不能乱、以及我在实际部署中遇到的坑和排查思路给准备在Ubuntu 20.04上使用华为昇腾310P AI加速卡的朋友一份可以直接照着操作的参考。1. 先把这台机器搞清楚硬件与软件栈的整体认知1.1 昇腾310P到底是什么样的存在昇腾310P是华为昇腾系列里面向推理场景的主力芯片常以加速卡形态出现比如Atlas 300I Pro推理卡或者集成在服务器里的AI加速模块。和训练卡那种动辄几百瓦的大块头不同310P的功耗控制得比较好单卡能覆盖不少边缘侧和数据中心侧的推理负载比如目标检测、图像分类、OCR、语音识别这些常见场景。我第一次接触这张卡的时候最容易犯的错就是把它当成GPU来看待习惯性地去找类似NVIDIA驱动那种“装完就完事”的软件包。实际上昇腾卡的软件栈要复杂得多它分成好几层最底层是板卡硬件上面跑着MCU固件和NPU固件再往上是驱动模块驱动之上还有CANN工具链最后才是TensorFlow、PyTorch这些深度学习框架。每一层各司其职也各有各的更新和排查方式。1.2 驱动、固件、MCU、CANN各管什么先说驱动。驱动是操作系统和硬件之间的翻译官没有驱动Ubuntu根本认不出这张卡lspci里也看不到设备。昇腾310P的驱动安装后会在系统里加载davinci_linux、davinci_manager等内核模块同时提供npu-smi这个管理工具。固件就比驱动低一层了。固件是烧在芯片和板卡存储里的“微系统”NPU本身的启动、算子执行、内部调度都要靠它。固件不升级驱动装得再新功能也可能不完整甚至会出现驱动版本和固件版本不匹配导致设备报错的怪现象。MCU在软件栈里往往被忽略但对板卡来说它是真正的“管家”。MCU负责供电时序、温度采样、风扇控制、电源故障检测、板卡序列号管理这些底层的板级管理功能。如果你发现设备温度读数异常、风扇不转、或者npu-smi info里电源状态不对很大概率要往MCU方向排查。CANN是昇腾的计算架构类似NVIDIA的CUDA。它提供算子库、图编译器、运行时和AscendCL编程接口上层框架通过CANN才能真正调动NPU算力。1.3 为什么我选择Ubuntu 20.04这个组合昇腾软件栈对操作系统的要求比较严格官方长期支持的系统里Ubuntu 20.04 x86_64是兼容性最好、文档最全、遇到问题最容易搜到解决方案的环境。内核方面Ubuntu 20.04默认的5.4内核和昇腾驱动配套很稳定。我不建议一上来就升级到新内核因为驱动模块是编译好的对新内核的适配往往滞后强行在6.x内核上装经常会出现模块签名验证失败或者编译报错。版本配套更要注意。驱动、固件、CANN三者不是可以随便乱配的昇腾社区每个版本的发布说明里都会给出一张配套表标明CANN 7.0对应哪个版本的驱动和固件。我的经验是先确定要用的CANN版本再回头找配套的驱动固件组合而不是哪边有新版本就升哪边不然很容易出现上层框架调用算子报错、底层版本不匹配这种棘手问题。2. 装之前先做三件事依赖、清理与硬件确认2.1 确认硬件真的被系统看到了先把加速卡插到服务器的PCIe插槽里。服务器开机后在Ubuntu终端里用下面的命令确认设备是否被识别lspci | grep -i processing accelerators正常会看到类似Huawei Technologies Co., Ltd. Device的输出。如果这一步就看不到设备后面所有软件工作都白搭先排查是不是PCIe插槽接触不良、卡没插到位或者主板需要在BIOS里开启大于4G解码/Above 4G Decoding之类的选项。我遇到过一台机器系统里死活看不到卡折腾半天发现是PCIe辅助供电线没接。昇腾310P加速卡虽然功耗比训练卡低但有些型号还是需要外接8pin供电供电不接PCIe枚举阶段设备就不会正常出现。2.2 基础依赖包要补齐昇腾驱动和CANN安装过程中会用到编译工具、解压工具和若干系统库提前装好能避免不少麻烦。在Ubuntu 20.04上我一般习惯先跑一遍sudo apt update sudo apt install -y gcc g make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3这些依赖主要覆盖两种用途一是驱动安装过程中如果涉及模块编译需要完整的构建链二是CANN运行时的Python环境、OpenSSL依赖以及BLAS相关库。缺了某个库安装时可能不报错但跑到后边跑示例程序时才会暴露那时候再回头找依赖定位成本更高。2.3 清理历史残留避免版本冲突如果这台机器之前装过其他版本的昇腾驱动、CANN或者其他厂商的AI加速卡驱动务必先清理干净再开始。不同的驱动框架可能会抢占设备节点残留的环境变量会让新装的版本行为异常。我的习惯是直接在干净系统上部署如果系统已经被折腾过最省心的方式是用官方提供的卸载脚本一般在/usr/local/Ascend或/usr/local/Ascend相关目录下卸载旧版然后重启再继续。特别注意不要同时保留两个版本的CANN环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh这种操作只应该在确定当前环境真实有效时执行否则环境变量一乱npu-smi info显示正常但Python调用AscendCL一直报错的情况就会出现。3. 驱动与固件部署真正的核心环节3.1 软件包获取与解压昇腾相关的安装包统一从昇腾社区官网下载路径一般带有Ascend-hdk和Ascend-cann两种前缀。HDK即硬件开发套件里面包含驱动和固件CANN则是工具链。下载时我一般会同时下载HDK和对应版本的CANN然后按照“先驱动固件、后CANN”的顺序安装。文件名长得很像比如Ascend-hdk-xxx-linux-aarch64.run Ascend-cann-toolkit_x.x.x_linux-x86_64.run注意架构要选对。x86服务器选x86_64版本如果是ARM服务器比如鲲鹏选aarch64版本。我吃过一次亏在x86机器上下了aarch64的包运行安装脚本直接报“exec format error”耽误了半个小时。提示下载后核对一下文件大小和SHA256。昇腾社区的包动辄几个GB网络不稳定时下载容易断一个不完整的安装包可能让你后续排查到怀疑人生。3.2 驱动安装从run文件到模块加载将HDK包放到服务器后先赋可执行权限chmod x Ascend-hdk-*.run sudo ./Ascend-hdk-*.run --full --install--full选项表示完整安装同时处理驱动和固件。如果希望分开操作也可以用--driver和--firmware分别指定。但我个人更推荐--full一次装完因为驱动和固件是配套发布的拆开安装反而容易造成版本不一致。安装过程会持续几分钟期间终端会输出大量日志。安装脚本会自动创建HwHiAiUser用户和HwHiAiUser用户组这个用户专门用于运行AI相关任务权限控制得很干净不建议手动去改它的权限。装完后不要急着做任何操作先重启系统sudo reboot重启不是可选项而是必选项。驱动模块需要在系统引导时加载不重启的话npu-smi大概率会提示驱动未初始化。重启后检查驱动状态npu-smi info如果输出里能看到设备的型号、芯片数量、温度、电源信息且设备状态是OK说明驱动部分已经工作。如果提示Module is not loaded或者找不到davinci相关模块用lsmod | grep davinci查看模块加载情况再用dmesg | tail -50看内核日志定位是什么原因导致模块加载失败。3.3 固件升级为什么固件比驱动更“底层”驱动搞定后固件升级也不能跳过。很多人觉得能用就行固件不需要每次都升这个想法在开发和训练阶段还能凑合但到生产环境或者做性能验证时旧固件带来的隐患就会冒出来。固件和驱动的区别可以类比成电脑的BIOS和操作系统。驱动是操作系统本身负责调度系统资源固件是BIOS负责开机自检、硬件初始化和底层部件间的协同。昇腾310P的固件包含NPU固件和MCU固件两大部分前面的--full安装已经把它们一并装到了板卡上但此时固件只是“待升级”状态需要显式执行升级动作。如果当时选择的是只装驱动后续手动补固件的命令大致是这样的具体以安装包内的README为准sudo ./Ascend-hdk-*.run --firmware --upgrade升级过程中千万不要断电、不要重启、不要拔卡。固件写入是有时序的中间断掉轻则升级失败重则板卡进入异常状态需要返厂用专用工具恢复。我的建议是升级固件时接上UPS并且全程不要碰机器安安静静等它跑完。固件升级完成后通常还需要再重启一次或者用npu-smi info -t reset -i 0之类的命令复位设备让固件生效。3.4 用npu-smi验证驱动和固件版本驱动和固件装完重启后我最先执行的就是下面这组命令npu-smi info npu-smi info -t board -i 0第一条用来确认设备整体状态第二条查看板卡详细信息里面的关键信息包括固件版本、MCU版本和硬件型号。我通常会把这些版本信息截图或者记录到笔记里后续排查问题时方便对照。举个例子如果代码里用到了某个新算子编译时报kernel版本不支持这时候我会先确认CANN版本和固件版本是否在配套表里。很多时候并不是代码写错了而是软件栈里的某一层版本太老算子没有对应实现。4. MCU在软件栈里的角色最容易忽略却又最重要的一层4.1 MCU固件板卡上的“带外管家”昇腾加速卡板卡上有一颗独立的MCU它不参与AI算力计算但控制着整个板卡的“生命体征”上电时序、电压轨监控、温度读取、风扇策略、在位信号甚至板卡的序列号和硬件版本信息都存在MCU侧的管理空间里。主机上的驱动和CANN如果要获取板卡温度、电源功耗这些健康信息路径是“主机→PCIe通道→MCU→传感器”而不是直接去读某个寄存器。所以当你执行npu-smi info看到温度、功耗、序列号这些信息时其实已经是MCU打工的结果了。MCU还有一个重要作用是保证异常情况下的安全。比如板卡温度超标时MCU会主动调整风扇转速如果温度继续上升到了危险阈值MCU会触发过温保护把板卡拉到安全状态防止硬件烧毁。这些逻辑不依赖操作系统即使主机侧驱动崩溃了MCU依然能够自主工作这就是它被称为“带外管家”的原因。4.2 如何读取MCU版本和健康状态在Ubuntu 20.04上读取MCU信息的工具就是npu-smi。可以这样查看npu-smi info -t board -i 0输出里通常会列出设备名称、板卡ID、固件版本、MCU版本、电压和温度。我习惯再执行npu-smi info -t temperature -i 0 npu-smi info -t power -i 0分别确认温度和功耗是否在合理范围内。如果功耗异常偏低比如推理时功耗只有几瓦大概率是NPU没有被真正加载任务或者MCU对供电的控制有问题。如果温度异常偏高先看风扇再观察MCU状态。注意MCU版本和固件版本不要混淆。固件版本对应NPU和系统侧的软件内容MCU版本对应板级管理控制器的程序版本。在升级HDK包时两者会一起更新但如果只更新了一部分npu-smi info里的版本信息会呈现出明显的不一致这时候不要继续跑业务先把版本对齐再说。4.3 固件升级时MCU会做什么前面提到固件升级过程中不能断电这里特别解释一下为什么。升级NPU固件时MCU实际上承担了升级引导和看门的角色。MCU会先把新固件写入板卡的存储区域写入完成后再触发NPU复位让NPU从新固件重新启动。这个过程中如果断电MCU会把固件标记为不完整下次开机时板卡可能直接进入恢复模式不加载NPU功能只能通过再次升级的方式恢复。所以判断固件升级是否失败除了看终端输出还可以看MCU的状态。如果升级失败npu-smi info里设备状态会显示异常或者npu-smi info -t upgrade -i 0能看到当前处于recovery状态。此时也别慌重新执行一次固件升级命令一般能恢复正常。但前提是主机侧驱动还能与该设备通信如果驱动都起不来就只能走一些更底层的恢复手段了那类操作建议在昇腾社区专家指导下进行。5. CANN工具链安装让上层应用真正用上算力5.1 安装CANN Toolkit驱动固件就绪之后整个硬件栈处于“可用但无工具”的状态。CANN就是连接框架和NPU的桥梁安装前确认好版本配套关系然后执行安装chmod x Ascend-cann-toolkit_*.run sudo ./Ascend-cann-toolkit_*.run --installCANN Toolkit包含开发套件和运行时组件。开发套件里有AscendCL头文件、编译工具、算子开发环境运行时组件则包含运行时库、图执行引擎等部署所需的部分。如果只是做模型推理部署不涉及算子开发也可以只装Ascend-cann-nnal这类运行时包体积更小部署更轻量。安装完成后CANN默认会安装在/usr/local/Ascend/ascend-toolkit目录下。为了让它能正常工作需要配置环境变量source /usr/local/Ascend/ascend-toolkit/set_env.sh建议把这行写到~/.bashrc里免去每次打开终端都要手敲的麻烦。但要注意如果同一台机器上装了多个版本只能source当前要用的那个版本的环境否则环境变量冲突会让工具链行为不可预期。5.2 验证CANN与硬件是否打通环境变量配置好后可以用CANN自带的样例做一次端到端验证。最常用的方式是跑一个基于AscendCL的推理样例。先在/usr/local/Ascend/ascend-toolkit/latest/sample/目录下找一个现成的分类或检测样例编译后直接跑。我通常用一个更简单的验证方式在Python环境里调用AscendCL接口初始化设备并查看芯片信息python3import acl # 初始化 ret acl.init() print(acl init: , ret) # 设置设备 ret acl.rt.set_device(0) print(set device: , ret) # 释放 acl.rt.reset_device(0) acl.finalize()如果每一步返回码都是0说明CANN、驱动、固件、MCU这一整套链条已经打通。这里提醒一下留意Python版本和CANN的兼容性Ubuntu 20.04默认Python 3.8大多数CANN版本都支持但如果自己装了较新的Python可能会遇到找不到acl扩展库的问题。5.3 部署业务前的最终检查项搭完整个软件栈后我会按这个清单过一遍npu-smi info设备状态是否是OK固件版本和MCU版本与驱动是否在同一配套关系内source set_env.sh后python3 -c import acl是否能成功跑一个最小推理样例确认芯片能实际被执行任务确认HwHiAiUser用户对设备节点有访问权限如果这些检查都通过软件栈基本就是健康的可以开始部署实际模型了。6. 部署实录里的经典坑与排查方法6.1 设备识别不到或npu-smi提示无设备现象npu-smi info提示找不到设备或者lspci里本来能看到设备装完驱动后反而看不到了。排查思路先重启确认内核模块加载。如果重启无效用dmesg | grep -i davinci看有没有驱动的报错日志。常见原因包括BIOS里PCIe链路协商问题、辅助供电没插、PCIe插槽速率不匹配。另外在一些多卡机器上PCIe资源分配不足也可能导致设备不被识别这时候需要检查BIOS里的Above 4G Decoding选项是否开启。6.2 固件升级失败或卡在某个进度现象升级固件时进度条长时间不动或者提示upgrade failed。处理方式先确认升级过程中没有人为中断。如果失败重新执行一次升级命令绝大多数情况下第二次能成功。如果反复失败看npu-smi info -t upgrade -i 0返回的状态码把状态码记录下来到昇腾社区搜索对应含义。不要在MCU处于recovery状态下直接重启机器应优先尝试再次升级恢复。6.3 内核升级后驱动失效现象某天执行apt upgrade系统内核从5.4升到了5.15重启后发现驱动加载不了。原因昇腾驱动是编译好的内核模块内核版本变了模块自然就不能加载。处理办法一是锁内核版本用apt-mark hold linux-image-xxx把内核固定住这是生产环境的常规操作二是升级到配套新内核的支撑包。我个人强烈建议部署完后立即锁定内核版本不要为了追新而升级内核昇腾软件栈对内核的适配比普通应用慢得多。6.4 环境变量冲突导致Python导入acl失败现象import acl报ModuleNotFoundError或者报动态库加载失败。原因很可能sourced了错误版本的CANN环境或者系统Python环境变量被多个AI框架的路径污染了。处理办法检查PYTHONPATH和LD_LIBRARY_PATH确保只有当前使用的CANN路径。建议用一个干净的virtualenv或conda环境安装Python侧依赖避免系统级Python被各种框架搅成一锅粥。6.5 常见问题速查表现象可能原因处理方式npu-smi info无输出驱动未加载/设备未枚举重启检查供电确认BIOS设置节点状态不是OK固件或MCU版本异常重新安装配套固件推理程序报算子不支持固件或CANN版本偏旧对照配套表升级import acl失败环境变量错误重新source正确版本温度异常高MCU风扇策略异常检查风扇观察MCU状态系统升级后驱动失效内核版本变化锁内核版本或安装新内核配套支撑最后分享一个我自己的体会昇腾310P软件栈的部署其实不难但绝对急不得。驱动、固件、MCU、CANN四层各有各的生命周期版本配套是重中之重。我在多次部署中反复踩过“驱动更新了但固件还停留在旧版”的坑也见过同事在固件升级过程中不小心重启机器导致板卡进入恢复状态的尴尬场面。稳妥的做法不是去追求每个组件都升到最新而是先锁定CANN版本再让驱动、固件和MCU全围绕这个版本来对齐。安装完别急着跑业务花十分钟把版本信息、设备状态、基础样例全部验证一遍后续会省下大量排查时间。如果你也正准备在Ubuntu 20.04上部署昇腾310P按照这套流程走一遍大概率能少走很多弯路。
返回列表