拿到一块华为 Atlas 300I 推理卡型号 3010本以为是插上就能跑的事结果光驱动就折腾了我周末两天。最让人无语的是官方文档里白纸黑字写着支持 Ubuntu 18.04但很多朋友包括我第一反应都是“都快 2025 年了谁还用 18.04”顺手就装了 20.04然后就是各种内核编译失败、npu-smi 找不到设备、CANN 环境起不来。这篇文章我会把 Atlas 300I 在 Ubuntu 上装驱动的全过程拆开讲清楚重点回答那个灵魂问题为什么华为官方只推荐 Ubuntu 18.0420.04 到底差在哪以及如果你头铁非要装 20.04你可能会遇到哪些具体报错。全文基于我实际反复装过 18.04 和 20.04 的踩坑经验不说废话直接给能用的东西。1. 为什么华为只认 Ubuntu 18.04官方兼容性背后的技术真相1.1 官方支持列表到底写了什么先别急着骂华为保守我们去看 Ascend 软件栈的兼容性说明里面有个表格写得很清楚Atlas 300I 推理卡型号 3010的 Host 侧操作系统支持列表里Ubuntu 只有 18.04.1、18.04.2、18.04.3 这几个小版本后面还带一行注释说明命令端服务器版本。20.04 从头到尾就没有出现过。这套东西不是华为凭空拍脑袋定的。Atlas 300I 的软件栈分为三层最底下是驱动Ascend HDK 里的 driver中间是固件firmware最上层是 CANN 工具包。驱动和固件是跟 Linux 内核强绑定的而 CANN 工具链又跟 Python、glibc、gcc 这些系统库强绑定。华为在 18.04 的特定内核版本上做过完整的测试矩阵驱动模块的编译、加载、卸载、芯片固件升级这些流程都验证过20.04 没有完整覆盖所以官方不承诺支持。1.2 内核版本差异DKOM 模块为什么在 20.04 上翻车Atlas 300I 驱动安装后会向内核插入一组自定义模块包括davinci_mini、davinci_host、drv_pcie等。这些模块不是纯用户态程序而是需要针对当前运行内核重新编译的内核模块DKOM。Ubuntu 18.04 默认内核是 4.1520.04 默认内核是 5.4两者的内核 API 变化很大特别是在设备树、PCIe 子系统、IOMMU 接口这些地方。我试过在 20.04 上直接跑官方 run 包编译阶段大概率会出现类似这样的报错Error! Bad return status for module build on kernel: 5.4.0-XXX-generic make[2]: *** [/usr/src/linux-headers-5.4.0-XXX-generic/scripts/Makefile.build:282: /tmp/selfextract.XXXX/drv_pcie.o] Error 1原因很简单华为在驱动源码里做了内核版本判断如果不在它测试过的内核版本白名单里要么直接拒绝编译要么编译到一半因为内核 API 变了而失败。这个问题你光靠打补丁或者手动指定内核头文件目录是绕不过去的因为源码里可能硬编码了某些 4.x 早期版本才有的函数签名。1.3 Python 版本和系统库的影响Ubuntu 18.04 自带 Python 3.6Ubuntu 20.04 自带 Python 3.8。CANN 的工具包在 5.0.x 时代很多脚本和运行库都是基于 Python 3.7/3.6 做的验证。20.04 上直接跑 CANN 的安装脚本经常看到ModuleNotFoundError: No module named google.protobuf或者 protobuf 版本冲突这类问题。虽然可以通过 virtualenv 或者 update-alternatives 切换 Python但 CANN 的算子编译工具比如msopgen在解析 IR 定义时对 Python 版本特别敏感Python 3.8 下生成的中间表示可能与 3.6 下不一致导致算子编译出来的二进制性能异常或者直接报错。官方不花精力适配 20.04你就要花大量时间去排一个底层库的兼容性问题。2. 安装前必须搞定的几个细节BIOS、系统源和驱动包选型2.1 服务器 BIOS 设置安全引导必须关把 Atlas 300I 插到 PCIe 插槽之后开机会发现系统能识别到硬件但代码 43 或者 lspci 能看到设备却无法加载驱动。这种情况在 UEFI 模式下十有八九是 Secure Boot安全引导没关。Secure Boot 开启时内核只会加载有合法签名的模块。华为的驱动模块虽然有签名但在 Ubuntu 的 MOKMachine Owner Key机制下没有导入华为的公钥到固件数据库里insmod 就会直接失败报Required key not available或者Operation not permitted。安装前进 BIOS 把 Secure Boot 关掉或者至少把华为的驱动签名证书导入 MOK否则你装完驱动重启就傻眼。2.2 Ubuntu 18.04 换源和基础依赖如果机器能联网装完系统第一件事先更新软件源。18.04 自带的源是 archive.ubuntu.com在国内速度很慢建议换成阿里云或者清华源。然后安装编译依赖sudo apt update sudo apt install -y gcc g make dkms linux-headers-$(uname -r) python3 python3-pip这一步别看简单很多人漏了linux-headers-$(uname -r)导致后面驱动编译找不到内核头文件而失败。另外要注意dkms不是必需的华为驱动 run 包有自己的编译机制但装上 dkms 可以对后续内核升级做一些自动适配我是建议装上的。2.3 驱动、固件和 CANN 软件包怎么选华为昇腾社区把安装包分了几类名字很像但用途完全不同Ascend-cann-toolkit_xxx.runCANN 开发工具包包含算子开发、编译器、图编译等跑推理应用必需。Ascend-cann-nnrt_xxx.run神经网络运行时纯推理部署场景只需要这个比 toolkit 小很多。Ascend-cann-nnae_xxx.run训练场景的软件包包含分布式训练框架插件等。Ascend-cann-kernels_xxx.run算子二进制包通常与 toolkit/nnrt 配套使用。Ascend-hdk-xxx.run包含 driver firmware 的合集包也叫 HDK 软件包。对于只做推理的场景我推荐装Ascend-hdk里拆出来的独立驱动包和固件包再加一个Ascend-cann-nnrt这样精简又不容易冲突。如果你需要用到 ATC 模型转换工具再考虑加装 toolkit。下载的时候注意版本号内部一致性比如 HDK 的版本和 CANN 的版本要匹配否则后面加载模型时会报固件版本不匹配。2.4 实体机 vs 虚拟机为什么虚拟化环境中驱动起不来很多人在 VMware 或者 KVM 虚拟机里装 Ubuntu 18.04然后想挂载 Atlas 300I 做测试。这里有个大坑Atlas 300I 是 PCIe 设备虚拟机需要做 PCIe 直通PCIe Passthrough才能让它被虚拟机看到。但即使直通了华为驱动对 IOMMU 和 MSI-X 中断的处理在虚拟化环境下经常出现问题插上去能识别但npu-smi info会报设备不存在。官方手册直接写了只支持物理机部署没有虚拟化驱动适配。所以如果只是测试建议直接拿物理服务器不要想着用虚机省事。3. 驱动安装全过程实录从裸系统到 npu-smi 跑通3.1 禁用默认的 Nouveau 驱动Atlas 300I 虽然不带显示输出但主板上如果插了其他 NVIDIA GPUUbuntu 的默认 nouveau 驱动会和 PCIe 设备枚举产生一些冲突。另外如果系统里已经有 NVIDIA 闭源驱动也需要卸载干净否则资源冲突会导致 300I 中断号申请失败。编辑/etc/modprobe.d/blacklist-nouveau.conf加入blacklist nouveau options nouveau modeset0然后更新 initramfssudo update-initramfs -u如果你是纯 CPU 服务器没有 NVIDIA GPU这步可以跳过不影响。3.2 运行驱动安装脚本拿到驱动包后比如Ascend-hdk-5.1.RC2-linux-x86_64.run先给执行权限再运行chmod x Ascend-hdk-*.run ./Ascend-hdk-*.run --full --install一定要加--full参数表示同时安装驱动和固件。如果只装驱动不装固件后面npu-smi能显示设备但芯片工作状态是 offline推理任务起不来。安装过程中屏幕会滚动大量编译日志看到类似[Driver] Install success. [Firmware] Install success.才算真正完成。在部分服务器上固件升级会要求重启终端会有明确提示Reboot the system to make firmware take effect。3.3 配置环境变量驱动装完还不算完CANN 的运行环境需要环境变量指到安装目录。我习惯把下面这段写入/etc/profile.d/ascend.sh参考官方文档并结合实际路径调整export ASCEND_HOME/usr/local/Ascend export ASCEND_DRIVER_PATH/usr/local/Ascend/driver export LD_LIBRARY_PATH/usr/local/Ascend/nnrt/latest/lib64:/usr/local/Ascend/driver/lib64:$LD_LIBRARY_PATH export PATH/usr/local/Ascend/nnrt/latest/bin:/usr/local/Ascend/nnrt/latest/ccec_compiler/bin:$PATH export PYTHONPATH/usr/local/Ascend/nnrt/latest/opp/built-in/op_impl/ai_core/tbe:/usr/local/Ascend/nnrt/latest/pyACL/lib/site-packages:$PYTHONPATH改完source /etc/profile。3.4 验证安装是否成功重启后运行npu-smi info如果能看到类似------------------------------------------------------------------------------------ | npu-smi xx.x.x Driver Version: xx.x.x Firmware Version: xx.x.x | ----------------------------------------------------------------------------------- | NPU Name Health Power Temp HugepagesMemory | | 0 300I OK 30W 55C 0/65536 | -----------------------------------------------------------------------------------说明驱动和固件都起来了。这里我提醒一点Health是 OK 只是第一步还要看Temp是否在正常范围Power是否显示非零值。如果Power是 0 且Temp是 0大概率是供电没识别PCIe 供电线没插或者插槽供电能力不足。另外推荐用lspci -v | grep -A 20 Huawei确认 PCIe 链路工作在 Gen3 x16 模式如果显示 Gen1 速率推理性能会受影响需要检查插槽带宽和 BIOS 里 PCIe 速率设置。4. 不死心20.04 上强行安装的三个经典翻车现场4.1 编译驱动时 Direct 报错20.04 最典型的问题就是模块编译失败。我见过最多的是这类[ERROR] The kernel version (5.4.0-26-generic) is not in the supported list, please install the supported kernel version.华为的安装脚本里会主动检查内核版本不在白名单直接拒绝。你可能会想我手动解包驱动跳过检查直接编译行不行我试过能过check那层但编译davinci_host.ko的时候会因为struct proc_ops和struct file_operations的 API 差异报错。5.4 内核里一些 procfs 接口的写法跟 4.15 完全不同华为源码没有做条件编译适配这就不是改一行两行能解决的问题了。4.2 驱动“装成功”但 npu-smi 识别不到设备20.04 上更阴间的场景是驱动编译成功dkms status也显示 installed但重启后npu-smi info报[ERROR] Get device number failed, please check driver is installed correctly.这是因为内核模块虽然加载了但和固件通信的 DDR 地址映射出了问题。Atlas 300I 的设备内存和主机内存之间有一层 IOMMU 映射20.04 内核默认开启iommupt或intel_iommuon的组策略与 18.04 不同导致驱动在 DMA 初始化时拿到错误的内存描述符。你可以通过加内核参数iommuoff来碰运气但这是一个治标不治本的办法而且关闭 IOMMU 对服务器安全有影响。4.3 CANN 工具链启动即崩就算驱动层你强行打通了CANN 工具链在 20.04 上也会给你展示什么叫“一环扣一环地烂”。安装 toolkit 没问题跑msopgen或者atc --modelxxx.onnx --framework5时经常出现RuntimeError: PyTorch is not compiled with CUDA support或者是 protobuf 后向兼容问题在解析 ONNX 模型时直接段错误。这类问题的根因是 20.04 的 OpenSSL 版本、Python 版本和 glibc 版本不在华为测试过的组合里单个报错你可以在网上搜到各种 workaround但组合在一起你基本就是在给华为做免费测试工程师。4.4 如果我非要拯救 20.04有什么曲线方案如果因为某些原因比如服务器上已有业务依赖 20.04 环境实在不想退回 18.04可以考虑容器方案在宿主机安装 Docker运行一个 Ubuntu 18.04 容器将 Atlas 300I 的/dev/davinci0设备节点和驱动的用户态库挂载进容器里在容器内安装 CANN 工具链。但注意容器里跑的前提是宿主机驱动已经装好而且宿主机的内核必须跟驱动编译时的内核一致。如果你宿主机是 20.04那你还是要先解决 20.04 上驱动编译的问题绕不开。所以这个方案在纯 20.04 环境里也废了。5. 安装后必做的检查与常见踩坑记录5.1 npu-smi 用法和关键指标npu-smi info是最高频的命令它有几个扩展参数很实用npu-smi info -t board -i 0 npu-smi info -t usages -i 0board子命令可以查看芯片 PCB 温度、健康状态usages可以查看 AI Core 的实时占用率和 HBM 内存带宽。如果推理服务的性能不符合预期优先看usages里 AI Core 的占用率是否有波动。如果有多个推理进程同时跑可以用npu-smi info -t process -i 0查看每个进程的显存占用和设备使用情况。5.2 固件版本和驱动版本不匹配的报错装完驱动重启后如果用npu-smi info能看到设备但状态不是OK而是Offline或者Health: Warning十有八九是固件版本跟驱动版本对不上。华为昇腾社区对驱动和固件有一个配套版本表强制要求固件版本不能低于驱动要求的最低版本。我在一次小版本升级中没注意把驱动升到 5.1.RC2固件还停留在 5.0.2结果芯片一直报device is offline查日志看到[ERROR] The firmware version is not compatible with the driver, please upgrade firmware.解决办法就是重新跑一次 HDK 的--full安装把固件升上去。5.3 升级内核导致驱动失效如何锁内核版本就算你在 18.04 上装好了也不能掉以轻心。Ubuntu 的自动安全更新会在后台升级内核一旦内核版本变了驱动的内核模块就必须重新编译。如果你没开 dkms或者源码不兼容新内核重启后驱动就没了。为了避免这个坑我建议用apt-mark hold把当前内核版本锁住sudo apt-mark hold linux-image-generic linux-headers-generic然后只更新软件包不更新内核。如果你机器上已经跑了训练任务锁内核版本是必须的否则一次自动更新就能让你的机器在重启后变成砖这种教训太深刻了。5.4 重启后驱动加载失败的手动恢复办法如果因为某种原因重启后npu-smi info报driver not loaded可以手动加载模块sudo modprobe drv_pcie sudo modprobe davinci_mini sudo modprobe davinci_host如果 modprobe 成功但 npu-smi 依然无法识别设备那就需要检查系统日志dmesg | grep -i davinci看是否有Init device failed或Get PCI BAR resource failed之类的记录。出现这类问题一般是 PCIe 设备掉线了可以先echo 1 /sys/bus/pci/rescan让内核重新扫描 PCIe 设备然后再次尝试 modprobe。5.5 完整卸载驱动的正确姿势卸载这件事很多人不重视导致反复安装新版本时出现各种诡异问题。官方卸载三件套/usr/local/Ascend/driver/script/uninstall.sh /usr/local/Ascend/nnrt/latest/script/uninstall.sh /usr/local/Ascend/toolkit/latest/script/uninstall.sh注意顺序先卸载用户态工具包再卸载驱动。如果没按顺序只卸载了驱动残留的 CANN 文件会干扰下一次安装跑安装脚本时会提示Ascend driver has already been installed但实际上/dev/davinci0不存在。卸载后可以手动清理一下/usr/local/Ascend目录和/etc/ld.so.conf.d下的昇腾配置。6. 最后几个我踩过的坑和补充建议关于 Atlas 300I 在 Linux 下的驱动安装我最大的体会是华为官方把支持范围卡在 18.04 真的不是一厢情愿而是跟你兜底的适配范围。建议你安装前先去昇腾社区把 Selection 表格下载下来看清驱动、固件、CANN 三个软件的版本之间的对应关系再决定在哪台机器上做部署。在装机过程中如果你是戴尔 R740、华为 2288H V5 这类服务器注意固件和 BIOS 的版本也有可能影响 PCIe 枚举。我在一台老款超微主板上遇到过一次设备无法枚举的问题升级主板 BIOS 后解决了。如果你用的是一台老机器可以先升级 BIOS 再装系统能省不少排查时间。另外有一个小技巧装完系统后先别急着做 apt upgrade先把驱动装好再升级内核。如果你先升级了内核然后再装驱动就需要确保驱动源码兼容你升级后的内核否则又是一通折腾。先锁内核再装驱动这个顺序最稳妥。最后再分享一点如果你看到网络上有帖子说在 20.04 上通过修改内核参数成功驱动了 Atlas 300I请记住那只是个案不代表可以稳定跑生产环境。我自己的建议是除非你有足够的时间去解决未知的内核级问题否则老老实实用 18.04 LTS这才是华为官方真正认证的路线。别跟官方推荐版本较劲时间值得花在更有价值的地方。
