昇腾NPU固件、驱动、CANN、MindIE
组件定位核心功能类比NPU固件硬件基础控制硬件启动、功耗管理硬件的“本能”NPU驱动硬件接口管理硬件资源,提供控制接口操作系统与硬件的“翻译官”CANN计算平台提供算子库、图引擎,连接框架与硬件AI计算的“操作系统” (类似CUDA)MindIE推理加速针对大模型推理进行深度优化专为推理打造的“高性能引擎”
昇腾(Ascend)是华为推出的全栈AI计算平台,其软件栈采用分层架构,从底层硬件管理到上层应用推理,各组件协同工作,共同发挥昇腾NPU的算力。
昇腾NPU固件、驱动、CANN和MindIE正是这个软件栈中四个关键的层级,它们的关系可以形象地理解为:固件 → 驱动 → CANN → MindIE
昇腾NPU固件 (Firmware)
固件是直接运行在昇腾AI处理器(NPU)硬件上的基础软件,是硬件启动和运行的基石。
核心功能:它包含了NPU芯片自带的微型操作系统(OS),负责芯片的启动控制、功耗管理以及电源器件的控制。简单来说,固件让NPU硬件“活”起来,并为其后续加载和执行AI模型计算任务做好准备。
部署位置:固件需要直接部署在物理服务器上,是软件栈的最底层。
昇腾NPU驱动 (Driver)
驱动是操作系统与NPU硬件之间的桥梁,负责管理和控制硬件资源。
核心功能:驱动部署在服务器上,用于管理和查询昇腾AI处理器的状态。它为上层软件(如CANN)提供了一系列接口,使得上层软件能够控制芯片、分配计算资源(如内存、计算核心)。
部署位置:和固件一样,驱动也需要安装在物理机的操作系统中。
CANN (异构计算架构)
CANN (Compute Architecture for Neural Networks) 是昇腾软件栈的核心,相当于英伟达的CUDA平台,它承上启下,将AI框架与底层硬件连接起来。
核心功能:CANN是一个异构计算架构,它包含Runtime(运行时)、高性能算子库、图引擎等核心组件。它通过统一的编程接口(AscendCL)向上层AI框架(如PyTorch、TensorFlow、MindSpore)提供设备管理、内存管理、模型加载与执行等能力,从而最大化地发挥昇腾NPU的计算效率。
主要组件:
1)Toolkit:开发工具包,支持模型转换、应用开发和编译。
2)Kernels:二进制算子包,包含大量预编译的高性能算子,可以节省模型运行时的编译时间。
3)NNAL:神经网络加速库,专门为Transformer等大模型结构提供深度优化,提升推理性能。
部署位置:CANN可以部署在物理机上,也可以集成在Docker容器中,与AI应用部署在同一环境。
MindIE (推理引擎)
MindIE(Mind Inference Engine)是构建在CANN之上的推理加速套件,专门为大模型的推理场景设计,旨在提升推理性能和易用性。
核心功能:MindIE包含深度优化的模型库、大模型推理优化器和运行环境。它对模型推理过程中的KV Cache管理、算子融合、显存分配等进行了专门优化,能够显著降低推理延迟,提高吞吐量。
定位:它类似于vLLM等推理框架,但专为昇腾平台深度定制,是部署和运行大语言模型(LLM)的最后一环,直接服务于推理应用。
部署位置:通常与AI框架(如PyTorch)和推理应用一起部署在Docker容器中。
总结对比
为了让你更清晰地理解它们之间的区别和联系,可以参考下表:
| 组件 | 定位 | 核心功能 | 类比 |
|---|---|---|---|
| NPU固件 | 硬件基础 | 控制硬件启动、功耗管理 | 硬件的“本能” |
| NPU驱动 | 硬件接口 | 管理硬件资源,提供控制接口 | 操作系统与硬件的“翻译官” |
| CANN | 计算平台 | 提供算子库、图引擎,连接框架与硬件 | AI计算的“操作系统” (类似CUDA) |
| MindIE | 推理加速 | 针对大模型推理进行深度优化 | 专为推理打造的“高性能引擎” |
固件和驱动的关系
固件(Firmware)和驱动(Driver)是紧密协作但职责分明的两个层级,它们共同确保硬件设备能够被操作系统识别并正常工作。
简单来说,固件是硬件的“本能”,而驱动是硬件与操作系统之间的“翻译官”。
固件:硬件的“本能”
固件是直接“烧录”在硬件芯片内部的底层软件,可以看作是硬件自带的微型操作系统。
职责:它负责硬件最基础的控制,比如设备的启动、初始化、功耗管理以及最基本的运行逻辑。没有固件,硬件就是一块无法通电启动的“砖头”。
位置:固件与硬件本身绑定,直接运行在硬件上。
驱动:系统的“翻译官”
驱动是运行在操作系统(如Linux、Windows)中的软件模块。
职责:它的作用是向上对接操作系统和应用程序,向下管理和控制硬件。驱动将操作系统的通用指令“翻译”成特定硬件能够理解的命令,并通过调用固件提供的接口来执行。同时,它也将硬件的状态反馈给操作系统。
位置:驱动安装在操作系统中,是连接上层软件和底层硬件的桥梁。
两者的协作关系
它们的关系是层层递进的:
1、启动:设备通电后,固件首先运行,完成硬件的自检和初始化,让硬件进入一个可被控制的基本状态。
2、识别:操作系统启动后,加载对应的驱动程序。
3、控制:当应用程序(如AI框架CANN)需要通过操作系统调用硬件时,请求会先发给驱动。
4、执行:驱动接收到指令后,将其转化为硬件能懂的语言,并指挥固件去执行具体的硬件操作。
一个生动的比喻是:固件就像人的“本能反射”(如心跳、呼吸),是生命的基础;而驱动就像人的“意识”,可以指挥身体去完成复杂的、有目的性的动作。意识(驱动)需要依赖本能(固件)才能让身体(硬件)动起来。
在昇腾NPU中的安装顺序
在昇腾NPU的实际安装和升级过程中,固件和驱动的安装顺序有明确规定,这直接体现了它们的依赖关系:
首次安装:需要先安装驱动,再安装固件。
覆盖安装/升级:需要先安装固件,再安装驱动。
这个顺序确保了底层硬件环境(固件)和上层控制接口(驱动)能够正确地匹配和协同工作。
固件和驱动为什么不合在一起
既然固件和驱动配合得如此紧密,为什么不把它们打包成一个文件,安装一次就完事了呢?
其实,不把它们“合二为一”并非技术做不到,而是基于架构解耦、运行环境差异以及维护灵活性的考量。将它们分开,就像是把“房子的地基(固件)”和“物业管理服务(驱动)”分开一样,虽然都是为了房子服务,但必须独立运作。
以下是几个核心原因:
1. 运行位置完全不同(“体内”与“体外”)
这是最根本的原因。
固件(Firmware):是运行在 NPU 芯片内部 的。它直接操作芯片的寄存器、控制电压、管理温度。它就像是植入在硬件里的“灵魂”。
驱动(Driver):是运行在 CPU 和操作系统(如 Linux) 里的。它作为内核模块(.ko 文件)存在,负责处理操作系统的内存管理、中断请求等。
为什么不能合在一起?
因为它们的“生存环境”完全不同。驱动代码需要在 Linux 内核里跑,而固件代码需要在 NPU 的微控制器里跑。如果把固件打包进驱动里,那只是把固件当成了一个“数据包”携带而已,安装时驱动还是得把这个“数据包”解压并“刷入”到 NPU 芯片里,物理上的分离是客观存在的。
2. 应对操作系统升级的灵活性(解耦)
驱动非常依赖操作系统内核版本。比如你从 Ubuntu 20.04 升级到 22.04,或者 Linux 内核从 5.4 升级到 5.15,通常都需要重新安装或编译驱动,否则驱动可能无法加载。
固件通常与操作系统无关。无论你用 CentOS 还是 Ubuntu,只要 NPU 硬件没变,固件往往是不需要动的。
如果不分开:
每次你升级操作系统或者打个内核补丁,都不得不重新刷写一遍固件。这不仅浪费时间,还增加了风险——万一固件刷写过程中断电,NPU 芯片可能直接变砖(无法启动)。分开后,系统升级只动驱动,不动固件,大大提升了系统的稳定性。
3. 修复 Bug 的颗粒度不同
在复杂的 AI 计算中,问题可能出在不同层面:
硬件级 Bug:比如芯片在高温下频率不稳,或者某个计算单元有逻辑错误。这通常需要华为发布新的固件来修复底层逻辑。
软件级 Bug:比如内存分配失败,或者与 PyTorch 框架通信不畅。这通常通过更新驱动来解决。
如果不分开:
如果只是为了修一个驱动的小 Bug,却强迫用户去升级固件,这属于“杀鸡用牛刀”,增加了不必要的操作风险和停机时间。
4. 版本配套的复杂性(现实情况)
其实,虽然安装包是分开的,但在实际使用中,华为昇腾官方是强绑定这两个版本的。
你会发现,驱动版本 23.0.4 必须严格对应固件版本 7.1.0(举例)。
如果版本不匹配,驱动加载时会直接报错,或者 NPU 无法正常工作。
总结来说:
虽然它们在安装包上是分开的(为了安装逻辑清晰、适应不同系统),但在版本管理上它们是“锁死”的。这种设计既保证了底层硬件控制的独立性,又给了上层软件适配操作系统的灵活性。
这就好比手机系统升级:
固件相当于手机的基带和底层引导(通常不怎么变,变了风险大)。
驱动相当于系统里的各种服务组件(经常更新,适配新 App)。
两者分开更新,手机才能既稳定又灵活。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)