在这里插入图片描述
前言
将昇腾(Ascend)NPU集群接入 Kubernetes (K8s) 是实现 AI 推理服务生产化的必经之路。正如你所经历的,从物理机“手搓”部署到 K8s 声明式管理,带来的不仅是运维效率的提升(滚动升级、弹性扩缩容),更是资源利用率的质变(共享、隔离、调度)。

结合你提供的文档片段和搜索到的公开信息,我为你整理了这份昇腾 NPU 在 Kubernetes 上的落地实战指南,重点解决“怎么装”、“怎么调度”和“怎么排错”三个核心问题。

🏗️ 核心架构:Kubernetes 如何管理 NPU?

Kubernetes 本身并不原生认识 NPU,它通过 Device Plugin(设备插件) 机制来扩展对硬件的支持。

渲染错误: Mermaid 渲染失败: Parse error on line 4: ...scend Device Plugin (DaemonSet)] D - -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'
  • Device Plugin:这是一个运行在每个 Worker Node 上的守护进程(DaemonSet)。它的作用是:
    1. 扫描本机的 NPU 卡(如 8 张卡)。
    2. 向 Kubelet 注册资源 ascend.com/npu
    3. 在 Pod 启动时,负责设备的健康检查和挂载。

🚀 第一步:安装昇腾 Device Plugin

这是整个链路的基础。根据搜索结果,昇腾的 Device Plugin 已经开源并托管在 GitHub 上。

1. 准备工作

  • 节点准备:确保 K8s 集群的 Worker 节点已安装好昇腾驱动(CANN Driver)和固件。
  • 打标签:建议给安装了 NPU 的节点打上标签,方便后续调度。
    kubectl label nodes <node-name> npu=true
    

2. 部署 Plugin
根据你提供的文档和 GitHub 搜索结果,部署流程如下:

# 1. 下载插件包 (以 v8.0 为例)
wget https://github.com/Ascend/device-plugin/releases/download/v8.0/ascend-device-plugin.tar

# 2. 加载镜像到节点
docker load < ascend-device-plugin.tar

# 3. 修改 YAML 配置
# 主要修改两处挂载路径,确保与节点上实际的驱动路径一致
# volumes:
#   - name: driver
#     hostPath:
#       path: /usr/local/Ascend/driver  # 确认驱动路径
# env:
#   - name: ASCEND_DRIVER_PATH
#     value: /usr/local/Ascend/driver

3. 应用部署

kubectl apply -f ascend-device-plugin.yaml

4. 验证安装

# 查看插件 Pod 是否 Running
kubectl get pods -n kube-system -l name=ascend-device-plugin

# 查看节点资源容量 (应该能看到 ascend.com/npu: 8)
kubectl get nodes -o jsonpath='{.items[*].status.capacity}'

🎯 第二步:推理工作负载调度策略

安装好插件后,K8s 就能识别 ascend.com/npu 这种资源了。但在生产环境中,我们需要更精细的控制。

1. 基础资源申请

在 Pod 的 resources.limits 中直接申请 NPU 卡数。

apiVersion: v1
kind: Pod
metadata:
  name: inference-pod
spec:
  containers:
  - name: inference
    image: my-llm-model:v1
    resources:
      limits:
        ascend.com/npu: "1"  # 申请1张NPU卡
2. 污点与容忍 (Taints & Tolerations)

为了避免普通任务(如 MySQL、Nginx)调度到昂贵的 NPU 节点上“占坑”,通常会给 NPU 节点打上污点

# 给 NPU 节点打污点:只有能容忍这个污点的 Pod 才能调度进来
kubectl taint nodes npu-node-1 ascend.com/npu=true:NoSchedule

对应的,在推理服务的 Deployment 中添加容忍

spec:
  template:
    spec:
      tolerations:
      - key: "ascend.com/npu"
        operator: "Exists"
        effect: "NoSchedule"  # 必须与上面的 effect 一致
      containers:
      - name: inference
        image: my-inference:v1
        resources:
          limits:
            ascend.com/npu: "1"
3. 亲和性与反亲和性
  • 节点亲和性:确保 Pod 只调度到有 NPU 的节点。
  • Pod 反亲和性:对于高可用要求的推理服务,可以设置“尽量把副本分散到不同节点”,防止单点故障。
affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - inference-app
        topologyKey: kubernetes.io/hostname  # 拓扑域为节点主机名

🐳 第三步:推理镜像制作最佳实践

推理容器的镜像不需要包含庞大的驱动,但必须包含 CANN 的运行时库(ACL)。

Dockerfile 核心要点:

# 基础镜像 (推荐使用 CANN 官方提供的基础镜像)
FROM ascendhub.huawei.com/public-ascendhub/ascend-pytorch:2.1.0-8.0.RC1-ubuntu20.04

# 设置环境变量 (关键!)
ENV ASCEND_HOME=/usr/local/Ascend
ENV PATH=$ASCEND_HOME/ascend-toolkit/bin:$PATH
ENV LD_LIBRARY_PATH=$ASCEND_HOME/ascend-toolkit/lib64:$LD_LIBRARY_PATH

# 安装你的推理代码
COPY inference_server.py .

# 启动命令
CMD ["python", "inference_server.py"]

注意

  • 不要试图在容器里安装驱动(*.run 文件),驱动必须在宿主机安装。
  • 确保容器内的 CANN 版本与宿主机驱动版本兼容(建议完全一致)。

🛠️ 第四步:运维与排错

在实际运行中,你可能会遇到以下问题:

  1. Pod 处于 Pending 状态

    • 原因:调度器找不到足够的资源。
    • 排查
      • kubectl describe pod <pod-name> 查看 Events。
      • 如果提示 0/10 nodes are available: 10 Insufficient ascend.com/npu,说明集群里没有足够的空闲 NPU 卡。
      • 检查 kubectl get nodes 看资源容量是否正确。
  2. Pod 启动失败,报错 Device not foundPermission denied

    • 原因:Device Plugin 挂载失败。
    • 排查
      • 检查 Device Plugin 的日志:kubectl logs -n kube-system <device-plugin-pod>
      • 检查宿主机上的驱动路径 /usr/local/Ascend/driver 是否存在,权限是否正确。
      • 检查 Pod 的 SecurityContext 是否需要 SYS_ADMIN 权限(部分版本需要)。
  3. 性能下降或报错算子不支持

    • 原因:版本不匹配。
    • 排查:确认 OM 模型是用 ATC 工具在与当前运行环境相同的 soc_version(如 Ascend910B)下编译的。

通过以上步骤,你就可以将昇腾推理服务完全托管给 Kubernetes,实现从“手工运维”到“平台化运营”的跨越。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐