昇腾(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)。
两者分开更新,手机才能既稳定又灵活。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐