云计算百科
云计算领域专业知识百科平台

【NPU】Ascend Device Plugin 系统级架构分析

Ascend Device Plugin 系统级架构分析

源码路径: mind-cluster-v26.0.1/component/ascend-device-plugin 分析日期: 2026-07-31 文件统计: 52个非测试Go源文件,约20,000行代码 制图工具: fireworks-tech-graph (Style 1: Flat Icon)


目录

  • 项目整体架构与设计思路
  • 整体运行流程
  • 子模块划分总览
  • 入口层模块 — main.go
  • 工厂层模块 — DeviceFactory
  • gRPC服务层模块 — Server
  • 设备管理层模块 — Device
  • 公共基础层模块 — Common
  • K8s客户端模块 — KubeClient
  • 重复设备检测模块 — DuplicateDetector
  • 拓扑模块 — Topology
  • 模块间调用关系与数据流
  • 图表索引

  • 一、项目整体架构与设计思路

    在这里插入图片描述

    1.1 项目定位

    Ascend Device Plugin 是华为昇腾NPU的 Kubernetes Device Plugin 实现,遵循 Kubernetes Device Plugin 协议(gRPC),负责将物理NPU设备(Ascend910/310/310P)注册到K8s集群,管理设备的发现、分配、健康监控和故障处理。

    1.2 设计思路

    采用 分层架构 + 工厂模式 + 接口抽象 + CGO桥接 的设计:

    设计原则实现方式
    分层架构 入口层 → 工厂层 → 服务层/设备层 → 基础层,自上而下单向依赖
    工厂模式 DeviceFactory 根据设备类型创建对应的 Manager 实例
    接口抽象 DevManager 接口统一不同型号NPU的操作契约
    继承复用 AscendTools 基类提供通用能力,910/310/310P 分别继承扩展
    CGO桥接 通过 CGO 调用底层 DCMI 驱动库(libdcmi.so),实现设备发现/健康/复位等硬件操作
    gRPC服务 实现 K8s Device Plugin 协议的 ListAndWatch/Allocate 接口
    优雅容错 故障分级处理(L1警告→L2降级→L3隔离→L5重置),支持热复位

    1.3 架构分层

    层次模块核心职责
    入口层 main.go 命令行解析、参数校验(12项)、启动初始化
    工厂层 DeviceFactory 设备驱动初始化、Manager创建、名称映射
    gRPC服务层 Server gRPC服务、设备上报(ListAndWatch)、分配(Allocate)、Pod资源查询
    设备管理层 Device NPU设备发现、健康监控、故障处理、热复位、虚拟设备(vNPU)
    公共基础层 Common 常量、工具函数、故障码、协议定义
    K8s客户端层 KubeClient K8s API交互、ConfigMap CRUD、节点Informer
    重复检测层 DuplicateDetector 容器设备挂载重复检测(Docker/Containerd)
    拓扑层 Topology 拓扑文件读写、Rack拓扑采集

    二、整体运行流程

    在这里插入图片描述

    2.1 进程启动流程

    1. main() 入口

    2. initLogModule() — 初始化日志模块

    3. 解析命令行 Flag (–useV2 –dmVol –fdFlag –deviceType …)

    4. checkParam() — 参数校验 (12项check函数)
    ├── checkListWatchPeriod() (ListAndWatch周期)
    ├── checkPresetAndVolcanoRelation() (预置+Volcano关系)
    ├── checkUse310PMixedInsertWithVolcano()
    ├── checkUse310PMixedInsertWithShareDevCount()
    ├── checkPresetWithShareDevCount()
    ├── checkSoftShareDevConfigDir()
    ├── checkHotResetMode()
    ├── checkBuildScene()
    ├── checkLinkdownTimeout()
    ├── checkThirdPartyScanDelay()
    ├── checkDeviceResetTimeout()
    └── checkShareDevCount()

    5. devicefactory.InitFunction()
    ├── initDevManager()
    │ ├── AutoInit() (DCMI驱动初始化, CGO)
    │ ├── NewHwAscend910Manager() / NewHwAscend310Manager() / NewHwAscend310PManager()
    │ └── InitSwitchDev() (交换设备初始化)

    6. NewHwDevManager() 创建设备管理器
    ├── setAscendManager() (按设备类型设置Manager)
    ├── setAllDeviceAndType()
    ├── initPluginServer()

    7. ListenDevice() — 启动主循环
    ├── Serve() (gRPC服务协程)
    ├── subscribeNpuFaultEvent() (故障订阅协程)
    ├── pollFaultCodeCM() (故障码轮询协程)
    └── ticker 定时任务 (设备信息更新)

    8. 阻塞等待信号 (SIGTERM/SIGINT)

    2.2 运行时核心协程

    进程启动后进入 ListenDevice() 主循环,同时运行多个协程:

    协程功能触发方式
    Serve gRPC服务,响应kubelet的ListAndWatch/Allocate请求 持续监听
    subscribeNpuFaultEvent 订阅NPU硬件故障事件(DCMI回调) 事件驱动
    pollFaultCodeCM 轮询ConfigMap中的故障码 定时轮询
    ticker 周期更新设备信息到K8s ConfigMap 30s定时器
    triggerTicker 触发式设备信息更新 事件触发
    ListenDpu DPU健康状态监控 持续监听

    三、子模块划分总览

    在这里插入图片描述

    3.1 模块总览

    模块目录文件数核心职责
    入口层 main.go 1 进程入口、参数解析、12项校验、启动初始化
    工厂层 pkg/next/devicefactory/ 3 驱动初始化、Manager创建、名称映射
    拓扑层 pkg/topology/ 2 拓扑文件读写、Rack拓扑采集、文件哈希校验
    gRPC服务层 pkg/server/ 10 gRPC服务、设备上报/分配、DPU监控、A5扩展
    设备管理层 pkg/device/ 7 NPU设备发现/健康/故障/复位、vNPU管理
    交换设备 pkg/device/deviceswitch/ 1 交换芯片故障监控(CGO)
    DPU控制 pkg/device/dpucontrol/ 2 DPU发现与配置(UB/PCIe两种模式)
    公共基础层 pkg/common/ 13 常量、工具、故障码、协议、文件管理
    K8s客户端 pkg/kubeclient/ 7 K8s API交互、Informer、缓存、CRUD
    重复检测 pkg/duplicatedetector/ 6 容器设备挂载重复检测(Docker/Containerd)

    四、入口层模块 — main.go

    4.1 核心作用

    进程入口点,负责命令行参数解析、参数校验和初始化调度。不包含业务逻辑,只做 编排调度。

    4.2 关键函数

    函数行号作用
    main() 269 入口函数:解析Flag → checkParam() → InitFunction() → ListenDevice()
    initLogModule() 111 初始化日志模块(上下文+日志级别)
    checkParam() 134 调用12项check函数,任一失败则终止启动
    setParameters() 303 设置全局参数(设备类型、卷路径等)
    setUseAscendDocker() 326 设置是否使用Ascend Docker运行时
    checkListWatchPeriod() 157 校验ListAndWatch周期合法性
    checkHotResetMode() 218 校验热复位模式配置
    checkBuildScene() 228 校验构建场景(训练/推理)
    checkShareDevCount() 261 校验共享设备数量

    4.3 关键Flag

    Flag说明
    –useV2 使用V2接口(A5架构)
    –dmVol 设备管理卷路径
    –fdFlag 文件描述符配置
    –deviceType 设备类型(Ascend910/310/310P)
    –listWatchPeriod ListAndWatch上报周期
    –hotResetMode 热复位模式
    –presetEnable 预置功能开关

    五、工厂层模块 — DeviceFactory

    在这里插入图片描述

    5.1 核心作用

    设备工厂层,负责根据设备类型创建对应的 Manager 实例,初始化硬件驱动,建立设备名称映射。

    5.2 文件结构

    文件职责
    entry.go 工厂入口,InitFunction() 调用链
    driver_init.go 驱动初始化,initDevManager() 创建Manager
    customname/public_name_config.go 设备名称映射(ResourceType→PublicName)

    5.3 关键函数

    函数文件作用
    InitFunction() entry.go 工厂入口,调用initDevManager创建Manager和SwitchDevManager
    initDevManager() driver_init.go DCMI AutoInit → 按设备类型创建Manager → InitSwitchDev
    InitPublicNameConfig() public_name_config.go 加载名称映射配置文件
    ReplaceDevicePublicName() public_name_config.go 设备名称替换(原始→公共名称)
    ReplaceDeviceInfoPublicName() public_name_config.go 批量设备信息名称替换

    5.4 名称映射机制

    ResourceType (原始: Ascend910)
    ↓ InitPublicNameConfig()
    OldPublicType (旧公共: Ascend910A)
    ↓ ReplaceDevicePublicName()
    DevicePublicType (新公共: HuaweiNPU-910A)

    支持自定义配置文件覆盖默认映射,用于K8s资源注册名和Pod注解。


    六、gRPC服务层模块 — Server

    在这里插入图片描述

    6.1 核心作用

    实现 Kubernetes Device Plugin gRPC 协议,向 kubelet 上报设备列表和健康状态,处理设备分配请求,查询Pod设备资源,监控DPU健康状态。

    6.2 文件结构

    文件职责
    manager.go HwDevManager — 设备管理中枢,10步初始化
    plugin.go PluginServer — gRPC接口实现 (ListAndWatch/Allocate)
    server.go Server — gRPC服务器启动/注册/重启
    pod_resource.go PodResource — Pod设备资源查询
    dpu.go DPU健康状态监控
    types.go PluginServer结构体定义
    manager_v2.go A5架构扩展(RankTable/LevelList)
    plugin_v2.go V2 gRPC接口(HCCL拓扑)
    npu_base_v2.go A5 NPU基类
    types_v2.go V2类型定义

    6.3 关键结构体

    结构体作用
    HwDevManager 设备管理中枢,协调Device/KubeClient/PluginServer等所有子模块
    PluginServer gRPC服务实现,实现InterfaceServer接口(ListAndWatch/Allocate)
    PodResource Pod设备资源查询,对接kubelet Pod Resources API

    6.4 关键函数

    函数文件作用
    NewHwDevManager() manager.go 创建Manager实例,10步初始化流程
    setAscendManager() manager.go 按设备类型设置对应的Manager
    ListenDevice() manager.go 主循环,启动所有协程(Serve/故障订阅/ticker)
    ListAndWatch() plugin.go:321 gRPC:周期上报设备列表和健康状态到kubelet
    Allocate() plugin.go gRPC:处理设备分配请求,挂载设备到容器
    responseToKubelet() plugin.go:201 构造ListAndWatch响应(设备列表+健康状态)
    reportDeviceInfo() plugin.go:286 上报设备信息(深拷贝→比对→更新)
    handleConsecutiveErrorStrategy() plugin.go:300 连续错误处理策略(重启/退出)
    Notify() plugin.go:61 设备状态变更通知(故障→不健康)
    getNewNodeAnnotation() manager.go:239 获取节点注解(设备信息)
    getNewNodeLabel() manager.go:264 获取节点标签(设备类型/数量)
    addTopologyLabel() manager.go:311 添加拓扑标签
    updateChipNameToNode() manager.go:363 更新芯片名称到节点
    initPluginServer() manager.go:457 初始化PluginServer
    Serve() server.go gRPC服务器启动/注册/重启/停止

    6.5 gRPC接口

    接口方向说明
    ListAndWatch Plugin → kubelet 持续推送设备列表(Device数组+健康状态)
    Allocate kubelet → Plugin 请求分配设备,返回设备挂载信息(Mount)
    GetDevicePluginOptions kubelet → Plugin 返回插件选项

    七、设备管理层模块 — Device

    在这里插入图片描述

    7.1 核心作用

    NPU设备的底层管理——设备发现、健康状态、故障处理、热复位、虚拟设备(vNPU)管理。通过CGO调用DCMI驱动库操作硬件。

    7.2 文件结构

    文件职责
    ascendcommon.go AscendTools基类 + DevManager接口
    ascend910.go Ascend910 Manager(训练NPU,功能最完整)
    ascend310.go Ascend310 Manager(推理NPU,简化版)
    ascend310p.go Ascend310P Manager(推理NPU,4种模式)
    ascendtolerance.go 优雅容错管理(故障分级处理)
    reset_info_mgr.go 重置信息管理器(单例模式)
    ascendcommon_v2.go A5架构扩展属性
    deviceswitch/ascend_switch.go 交换设备故障监控(CGO)
    dpucontrol/dpu_device_find.go DPU发现与配置
    dpucontrol/types.go DPU类型定义

    7.3 继承体系

    DevManager (接口)
    ↑ 实现
    AscendTools (基类) — 提供GetNPUs/UpdateNodeDeviceInfo等通用方法
    ↑ 继承
    ├── HwAscend910Manager (训练卡: 故障订阅/热复位/Ring重置/优雅容错)
    ├── HwAscend310Manager (推理卡: 简化版设备发现)
    └── HwAscend310PManager (推理卡: 混插/虚拟/共享/物理4种模式)

    7.4 关键函数

    函数所属作用
    GetNPUs() Ascend910 设备发现:扫描/dev/davinci*设备,返回NpuAllInfo
    GraceTolerance() Ascend910 优雅容错6步流程:分类设备→故障分级→热复位
    hotResetHandler() Ascend910 热复位处理(带内/带外两种模式)
    hotResetTryOutBand() Ascend910 带外热复位执行
    startUpHotReset() Ascend910 启动热复位流程
    setAllDevUnhealthyOnRing() Ascend910 Ring上所有设备设为不健康
    getDevFaultInfo() Ascend910 获取设备故障信息
    isFaultNeedRestart() Ascend910 判断故障是否需要重启
    GetAssociatedLogicIDs() Ascend910 获取关联设备逻辑ID(Ring拓扑)
    SetDmgr() AscendTools 设置设备管理器
    GetChipAICore() AscendTools 获取芯片AI Core数量
    convertLogicIDsToDeviceNames() AscendTools 逻辑ID转设备名称
    UpdateNodeDeviceInfo() AscendTools 更新设备信息到ConfigMap
    LoadDeviceInfoCm() AscendTools 加载设备信息ConfigMap
    handleManuallySeparateNPUFaultInfo() AscendTools 处理手动分离NPU故障信息
    asyncReleaseAutoFill() AscendTools 异步释放自动填充
    checkAndInitNodeDeviceInfo() AscendTools 检查并初始化节点设备信息

    7.5 故障处理流程

    DCMI驱动 → goFaultEventHandler (CGO回调)

    故障事件 → allFaultInfo channel

    限流器 (rate limiter)

    故障分级:
    L1 (警告) → 记录日志,设备保持健康
    L2 (降级) → 设备标记为不健康
    L3 (隔离) → 设备隔离 + K8s Event通知
    L5 (重置) → 触发热复位 (带内/带外)

    K8s Event 通知 + ConfigMap 更新 + ListAndWatch状态更新


    八、公共基础层模块 — Common

    在这里插入图片描述

    8.1 核心作用

    全局常量、工具函数、故障码定义、协议定义——被几乎所有其他模块引用的"单一真相源"。

    8.2 文件结构

    文件职责
    constants.go 全局常量(设备类型/路径/端口/限制等)
    constants_v2.go A5架构常量
    common.go 公共工具函数(序列化/锁/哈希等)
    device.go 设备工具函数(设备ID解析/交换故障/默认设备路径)
    fault_code.go 故障码定义与级别映射
    proto.go 协议定义
    proto_v2.go A5协议定义
    send_stat.go 状态上报
    file_manager.go 文件管理
    atomic_bool.go 原子布尔值
    slice_common.go 切片工具
    upgradefault.go 升级容错

    8.3 关键函数

    函数文件作用
    GetPattern() common.go:72 获取正则表达式模式映射
    LockAllDeviceInfo() common.go:81 锁定所有设备信息(互斥)
    UnlockAllDeviceInfo() common.go:86 解锁设备信息
    SetAscendRuntimeEnv() common.go:91 设置Ascend运行时环境变量
    MakeDataHash() common.go:131 生成数据哈希
    MarshalData() common.go:146 序列化数据
    MapDeepCopy() common.go:156 Map深拷贝
    GetPodAnnotationByDeviceType() common.go:168 按设备类型获取Pod注解
    GetDeviceFromPodAnnotation() common.go:184 从Pod注解获取设备
    GetDefaultDevices() common.go:212 获取默认设备列表
    GetDeviceID() device.go:78 解析设备ID
    GetSwitchFaultInfo() device.go:112 获取交换设备故障信息
    UpdateSwitchFaultInfoAndFaultLevel() device.go:157 更新交换设备故障级别
    SetSwitchFaultCode() device.go:282 设置交换设备故障码

    九、K8s客户端模块 — KubeClient

    在这里插入图片描述

    9.1 核心作用

    封装 Kubernetes API 交互——节点标签/注解管理、ConfigMap CRUD、Pod查询、节点Informer、容器运行时检测。

    9.2 文件结构

    文件职责
    kubeclient.go ClientK8s核心客户端
    kube_connect.go K8s连接管理(配置加载/创建Clientset)
    kube_cache.go 缓存层(ConfigMap/Pod缓存)
    cur_node_informer.go 当前节点Informer(监听Pod事件)
    client_server.go CRUD操作(ConfigMap/Node Annotation)
    kubeclient_v2.go A5扩展(PingMesh配置解析)
    types.go / types_v2.go 类型定义

    9.3 关键函数

    函数行号作用
    NewClientK8s() 68 创建K8s客户端(从环境变量/in-cluster配置加载)
    GetNode() 105 获取当前节点信息
    PatchNodeState() 112 Patch节点状态(标签/注解)
    AddAnnotation() 122 添加节点注解
    GetPod() 147 获取单个Pod
    PatchPod() 163 Patch Pod
    GetActivePodList() 169 获取活跃Pod列表(字段选择器+校验)
    GetAllPodList() 183 获取全部Pod列表
    getPodListByCondition() 198 按条件获取Pod列表
    GetContainerRuntime() 211 获取容器运行时类型(Docker/Containerd)
    CreateConfigMap() 255 创建ConfigMap
    GetConfigMap() 270 获取ConfigMap
    UpdateConfigMap() 282 更新ConfigMap
    resetNodeAnnotations() 295 重置节点注解

    十、重复设备检测模块 — DuplicateDetector

    在这里插入图片描述

    10.1 核心作用

    检测同一NPU设备被多个容器重复挂载的异常情况,支持Docker和Containerd两种容器运行时。

    10.2 文件结构

    文件职责
    manager.go Manager — 检测管理器(启动/扫描/事件监听)
    cache/container_cache.go ContainerCache — 容器缓存 + 重复检测算法
    containerruntime/interface.go Client接口 + OCI端点探测
    containerruntime/docker_client.go Docker客户端实现
    containerruntime/containerd_client.go Containerd客户端实现
    types/types.go 数据类型定义

    10.3 关键函数

    函数行号作用
    CheckDuplicateDevices() 39 入口函数,创建Manager并启动检测
    NewManager() 62 创建检测管理器(初始化缓存+运行时客户端)
    Start() 79 启动检测:全量扫描 + 事件监听
    watchContainerEvents() 98 监听容器创建/销毁事件
    scanAllContainers() 115 全量扫描所有容器设备挂载
    HandleNewContainer() 131 处理新容器:解析设备挂载 + 检测重复
    HandleContainerRemoval() 165 处理容器销毁:清理缓存
    logDuplicate() 170 记录重复检测告警日志

    10.4 检测流程

    1. CheckDuplicateDevices() 入口

    2. NewManager() → NewContainerCache() → NewClient()

    3. Start()
    ├── scanAllContainers() (全量扫描)
    │ ├── 解析所有容器设备挂载信息
    │ ├── StoreAllAndFindDuplicates() (批量存储+检测)
    │ └── logDuplicate() (告警)
    └── watchContainerEvents() (增量监听)
    ├── HandleNewContainer() (容器创建 → 解析+检测)
    └── HandleContainerRemoval() (容器销毁 → 清理缓存)


    十一、拓扑模块 — Topology

    11.1 核心作用

    管理拓扑文件的读写、Rack拓扑信息采集,支持文件哈希校验确保数据完整性。

    11.2 文件结构

    文件职责
    topo.go 拓扑文件读写、哈希校验
    types.go 拓扑数据类型定义

    11.3 关键函数

    函数行号作用
    topoFileToStr() 53 读取拓扑文件内容为字符串
    getFileHash() 66 计算文件SHA256哈希(完整性校验)
    ToFile() 75 将拓扑信息写入文件

    十二、模块间调用关系与数据流

    在这里插入图片描述

    12.1 主调用链

    main.go
    → DeviceFactory.InitFunction()
    → DeviceFactory.initDevManager()
    → DCMI AutoInit() (CGO驱动初始化)
    → NewHwAscend910/310/310PManager()
    → InitSwitchDev()
    → NewHwDevManager()
    → setAscendManager() (按类型设置Manager)
    → setAllDeviceAndType()
    → initPluginServer()
    → ListenDevice()
    ├── Serve() → gRPC Server
    │ ├── ListAndWatch() → Device.GetNPUs() → DCMI
    │ └── Allocate() → Device设备挂载 → 容器
    ├── subscribeNpuFaultEvent() → DCMI故障回调
    ├── pollFaultCodeCM() → KubeClient.GetConfigMap()
    └── ticker → reportDeviceInfo()
    → Device.UpdateNodeDeviceInfo()
    → KubeClient.UpdateConfigMap()

    12.2 数据传递矩阵

    数据来源去向载体
    Flag配置 命令行 main.go → DeviceFactory flag.* 指针
    Manager实例 DeviceFactory Server层 HwDevManager 结构体
    设备列表 DCMI驱动 Server → kubelet gRPC ListAndWatchResponse
    设备分配 kubelet Device层 → 容器 gRPC AllocateResponse (Mount)
    故障事件 DCMI回调 Server → K8s Event allFaultInfo channel
    设备信息 Device层 KubeClient → K8s ConfigMap
    节点标签 Server KubeClient → K8s Node Annotation/Label
    容器信息 Docker/Containerd DuplicateDetector Container API
    拓扑信息 Topology Server → K8s Node Label (topology)

    12.3 核心数据流

    ┌──────────┐ gRPC ┌──────────────┐
    │ kubelet │ ─────────────→ │ PluginServer │
    │ │ ←───────────── │ │
    └──────────┘ ListAndWatch └──────┬───────┘

    GetNPUs()│

    ┌──────────────┐
    │ Device层 │
    │ (910/310/ │
    │ 310P) │
    └──────┬───────┘

    CGO │

    ┌──────────────┐
    │ DCMI 驱动库 │
    │ (libdcmi.so) │
    └──────────────┘

    ┌──────────┐ ConfigMap ┌──────────────┐
    │ K8s API │ ←─────────── │ KubeClient │
    │ Server │ ───────────→ │ │
    └──────────┘ Get/Patch └──────┬───────┘


    ┌──────────────┐
    │ PluginServer │ → ticker定时更新
    └──────────────┘


    十三、图表索引

    编号图表名称文件类型
    a01 系统整体架构图 diagrams/a01_system_architecture.png 架构图
    a02 模块划分与依赖关系图 diagrams/a02_module_dependency.png 架构图
    a03 main.go 启动流程图 diagrams/a03_main_startup_flow.png 流程图
    a04 Server 模块架构图 diagrams/a04_server_module.png 架构图
    a05 Device 模块架构图 diagrams/a05_device_module.png 架构图
    a06 Common 模块架构图 diagrams/a06_common_module.png 架构图
    a07 KubeClient 模块架构图 diagrams/a07_kubeclient_module.png 架构图
    a08 DuplicateDetector 模块架构图 diagrams/a08_duplicatedetector_module.png 架构图
    a09 DeviceFactory 模块架构图 diagrams/a09_devicefactory_module.png 架构图
    a10 模块间数据流图 diagrams/a10_data_flow.png 数据流图
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【NPU】Ascend Device Plugin 系统级架构分析
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!