HAMi 结合Ascend 训练卡虚拟化的实践与优化

张开发
2026/4/5 14:25:48 15 分钟阅读

分享文章

HAMi 结合Ascend 训练卡虚拟化的实践与优化
1. HAMi与Ascend训练卡虚拟化入门指南第一次接触HAMi和Ascend训练卡虚拟化时我也被各种专业术语绕得头晕。简单来说HAMi就像个智能管家能把昂贵的Ascend训练卡比如310P/910系列切成多个虚拟小卡让多个AI训练任务共享同一块物理卡。这可比买一堆硬件卡划算多了特别适合中小团队做模型训练。实际操作中我发现有几个关键点容易踩坑Ascend设备插件版本必须严格匹配2.4.1和2.5.0的配置差异很大原厂device-plugin必须停用否则会冲突310P和910系列的资源配置写法完全不同举个例子当你想在K8s集群里申请NPU资源时310P要这样写resources: limits: huawei.com/Ascend310P: 1 huawei.com/Ascend310P-memory: 1024而910系列得换成resources: limits: huawei.com/Ascend910: 1 huawei.com/Ascend910-memory: 20002. 环境配置全流程实操2.1 基础环境准备实测在Ubuntu 20.04 LTS上最稳定需要提前装好Docker 20.10注意配置国内镜像加速Kubernetes 1.23我用v1.23.1没出过问题Helm 3.8管理HAMi组件超方便有个细节很多人会忽略必须给节点打上ascendon标签kubectl label nodes node-name ascendon2.2 关键组件安装HAMi的组件安装顺序很重要我推荐这样操作先装ascend-device-plugin注意要用v1.0.1镜像kubectl apply -f https://raw.githubusercontent.com/Project-HAMi/ascend-device-plugin/main/ascend-device-plugin-2.5.0.yaml通过Helm安装hami-scheduler2.5.0版本最稳helm install hami hami-charts/hami \ --set scheduler.kubeScheduler.imageTagv1.23.1 \ --set devices.ascend.enabledtrue \ -n kube-system重要提示一定要停用原厂的ascend-k8sdeviceplugin否则会出现设备冲突。我在测试环境就遇到过两个插件抢设备导致NPU不可用的情况。3. 性能优化实战技巧3.1 内存分配策略Ascend卡的内存分配直接影响训练效率。通过监控发现310P系列建议单任务分配1024-2048m内存910系列建议2000-4000m内存可以在metrics接口看到实时数据curl {scheduler-node-ip}:31993/metrics | grep vGPUMemoryPercentage输出示例vGPUMemoryPercentage{deviceuuidAscend310P-0} 0.14273.2 调度优化配置在values.yaml中调整这些参数效果显著scheduler: resources: limits: cpu: 2 memory: 4Gi deviceMemoryScaling: 1.2 # 内存超分系数实测发现当deviceMemoryScaling设为1.2时310P卡的利用率能提升30%左右但超过1.5就容易出现OOM。4. 常见问题排查手册4.1 插件启动失败如果ascend-device-plugin报错按这个顺序检查确认/usr/local/Ascend/driver目录存在检查configMap是否生成查看/var/log/mindx-dl/devicePlugin日志典型错误解决方案# 驱动路径问题 ln -s /usr/local/driver /usr/local/Ascend/driver # 权限问题 chmod 750 /var/log/mindx-dl4.2 Pod调度异常当Pod卡在Pending状态时kubectl describe pod pod-name | grep -A 10 Events常见原因包括节点标签缺失补打ascendon标签资源请求超限调整memory值镜像拉取失败先手动docker pull测试最近在客户现场就遇到个典型case某节点明明有310P卡但Pod就是调度不上去。最后发现是helm install时漏了--set devices.ascend.enabledtrue参数重新安装后立即恢复正常。5. 监控与日志分析配置Prometheus抓取指标时记得添加这些关键metricsvGPUMemoryPercentagevGPUPodsDeviceAllocateddevice_utilizationGrafana面板建议监控每张卡的实时内存占用率设备温度与功耗曲线任务排队时长趋势登录昇腾镜像仓库有个小技巧先在华为云容器服务SWR控制台生成临时登录指令再在节点上执行。我习惯把登录命令写进crontab每天自动刷新0 3 * * * docker login -u user -p pwd swr.cn-south-1.myhuaweicloud.com6. 进阶调优方案对于大规模训练场景建议在hami-scheduler中启用binpack策略scheduler: strategy: binpack对NPU内存做分级分配resources: limits: huawei.com/Ascend910: 1 huawei.com/Ascend910-memory-high: 1500 huawei.com/Ascend910-memory-low: 500使用亲和性调度避免跨NUMA访问affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ascend operator: In values: [on]在ResNet50训练任务中经过上述优化后epoch时间从原来的23分钟降到了18分钟效果非常明显。关键是要持续监控metrics数据我一般会开着grafana看板边调参边观察曲线变化。

更多文章