昇腾 NPU 在 Kubernetes 上的落地实战指南
昇腾 NPU 在 Kubernetes 上的落地实战指南

前言
将昇腾(Ascend)NPU集群接入 Kubernetes (K8s) 是实现 AI 推理服务生产化的必经之路。正如你所经历的,从物理机“手搓”部署到 K8s 声明式管理,带来的不仅是运维效率的提升(滚动升级、弹性扩缩容),更是资源利用率的质变(共享、隔离、调度)。
结合你提供的文档片段和搜索到的公开信息,我为你整理了这份昇腾 NPU 在 Kubernetes 上的落地实战指南,重点解决“怎么装”、“怎么调度”和“怎么排错”三个核心问题。
🏗️ 核心架构:Kubernetes 如何管理 NPU?
Kubernetes 本身并不原生认识 NPU,它通过 Device Plugin(设备插件) 机制来扩展对硬件的支持。
- Device Plugin:这是一个运行在每个 Worker Node 上的守护进程(DaemonSet)。它的作用是:
- 扫描本机的 NPU 卡(如 8 张卡)。
- 向 Kubelet 注册资源
ascend.com/npu。 - 在 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 版本与宿主机驱动版本兼容(建议完全一致)。
🛠️ 第四步:运维与排错
在实际运行中,你可能会遇到以下问题:
-
Pod 处于
Pending状态- 原因:调度器找不到足够的资源。
- 排查:
kubectl describe pod <pod-name>查看 Events。- 如果提示
0/10 nodes are available: 10 Insufficient ascend.com/npu,说明集群里没有足够的空闲 NPU 卡。 - 检查
kubectl get nodes看资源容量是否正确。
-
Pod 启动失败,报错
Device not found或Permission denied- 原因:Device Plugin 挂载失败。
- 排查:
- 检查 Device Plugin 的日志:
kubectl logs -n kube-system <device-plugin-pod>。 - 检查宿主机上的驱动路径
/usr/local/Ascend/driver是否存在,权限是否正确。 - 检查 Pod 的 SecurityContext 是否需要
SYS_ADMIN权限(部分版本需要)。
- 检查 Device Plugin 的日志:
-
性能下降或报错算子不支持
- 原因:版本不匹配。
- 排查:确认 OM 模型是用
ATC工具在与当前运行环境相同的soc_version(如 Ascend910B)下编译的。
通过以上步骤,你就可以将昇腾推理服务完全托管给 Kubernetes,实现从“手工运维”到“平台化运营”的跨越。
更多推荐




所有评论(0)