
作者昇腾实战派知识地图https://blog.csdn.net/Lumos_Lovegood/article/details/161601003背景概述随着小模型在特定任务上展现出接近甚至超越大模型的推理能力“专而精”的小模型在资源受限场景下优势明显。与此同时华为Ascend系列算力卡进入市场后用户对算力资源隔离与整体利用率提升的需求日益迫切。通过资源虚拟化技术将物理NPU切分为多个vNPU挂载到容器中可实现统一资源分配与回收满足多用户频繁申请/释放资源的操作需求。本文以静态虚拟化方式在昇腾推理服务器裸机上提供小模型RECCE的切分案例及理论指导。1 解决方案1.1 方案介绍当前划分vNPU主要有静态虚拟化和动态虚拟化两种方式。本文以静态虚拟化为主采用Docker部署方式。静态虚拟化通过npu-smi工具手动创建多个vNPU支持物理机和虚拟机场景。动态虚拟化通过软件配置在收到虚拟化任务请求后动态创建vNPU、挂载任务并回收资源。将vNPU挂载到容器有以下方案原生Docker仅支持静态虚拟化通过Docker拉起容器时将vNPU挂载到容器。注意不支持通过原生Containerd拉起容器时挂载vNPU。安装Docker及挂载vNPU的指导请参考多容器场景下安装 - Atlas 中心训练服务器 25.2.0 NPU驱动和固件安装指南 02 - 华为结合MindCluster组件静态虚拟化通过npu-smi工具提前创建多个vNPU基于Ascend Device Plugin实现设备发现、分配与健康状态上报Volcano组件为可选。Ascend Docker Runtime单独使用支持静态和动态虚拟化通过容器引擎插件拉起容器时挂载vNPU。Kubernetes结合MindCluster组件Ascend Device Plugin、Volcano通过Kubernetes拉起容器时挂载vNPU支持静态和动态虚拟化。1.2 vNPU切分特性操作说明虚拟化实例功能通过资源虚拟化将物理机或虚拟机配置的NPU切分成若干份vNPU挂载到容器中使用实现统一资源分配与回收满足多用户反复申请/释放资源的操作需求。参考文档创建vNPU-MindCluster7.0.RC1-昇腾社区约束说明若涉及平台管理切分操作由平台根据模板下发具体操作见参考文档。物理NPU虚拟化出vNPU后不支持再将该物理NPU挂载到容器或直通到虚拟机使用。一个vNPU只能被一个任务容器使用不支持多个容器共用。1.2.1 虚拟化模式查询在物理机执行以下命令设置虚拟化模式虚拟机内划分vNPU无需执行npu-smiset-tvnpu-mode-dmode类型描述mode虚拟化实例模式取值为0或10为容器模式1为虚拟机模式更多npu-smi命令参考Atlas A2 中心推理和训练硬件 24.1.0 npu-smi 命令参考 05 - 华为1.2.2 查询算力切分模板信息npu-smi info-ttemplate-info不同设备切分模板略有区别。以某款设备为例支持两种模板显存分别为32G/16G最大支持1切4。说明vir后的数字表示AI Core数量c前的数字表示AI CPU数量32/16G表示显存资源分配。AI Core主要用于矩阵乘等计算AI CPU负责执行CPU类算子包括控制算子、标量和向量等通用计算。1.2.3 创建vNPU命令格式npu-smiset-tcreate-vnpu-iid-cchip_id-fvnpu_config[-v vnpu_id][-g vgroup_id]类型描述id设备id通过npu-smi info -l命令获取chip_id芯片id通过npu-smi info -m命令获取2 实操RECCE模型算力切分验证2.1 模型介绍当前鉴别人脸图像是否伪造存在两方面技术难题一是如何鉴别未知方法伪造的人脸图像二是人脸伪造本质上是利用深度学习进行信息篡改现有方法未考虑对鉴别方法自身的攻击。为此杨小康教授团队提出RECCE侦查鉴别方法利用图像重建技术放大伪造痕迹即使面对未知伪造方法也能准确识别伪造区域。同时团队设计了Hybrid Attack攻击方法对人眼不可见的微量修改即可欺骗鉴别算法。相关论文已被CVPR 2022收录。模型源码https://github.com/VISION-SJTU/RECCE2.2 部署环境说明硬件Atlas 800I A2服务器驱动安装后默认包含npu-smi工具位于/usr/local/sbin/和/usr/local/bin/路径下CANN版本8.1.RC1HDK版本25.2.02.3 算力切分2.3.1 设置虚拟化模式使用Docker容器部署服务设置为容器模式npu-smiset-tvnpu-mode-d02.3.2 创建vNPU查看当前设备支持的切分模板npu-smi info-ttemplate-info设备支持两种模板分别可切分出16G和32G显存模型权重不足1G可直接切成4份每份16G显存指定对应模板创建vNPUnpu-smiset-tcreate-vnpu-i6-c0-fvir05_1c_16g2.3.3 查询vNPU创建结果npu-smi info-tinfo-vnpu-i6-c0原NPU被切成四个vNPUID为196~199/dev目录下也可看到对应信息2.3.4 销毁vNPU验证完成后执行npu-smiset-tdestroy-vnpu-i6-c0-v196npu-smiset-tdestroy-vnpu-i6-c0-v197npu-smiset-tdestroy-vnpu-i6-c0-v198npu-smiset-tdestroy-vnpu-i6-c0-v1992.3.5 挂载容器基于原生Dockerdockerrun-it-d--nethost --shm-size1g\--name容器名\--device/dev/davinci_manager\--device/dev/hisi_hdc\--device/dev/devmm_svm\--device/dev/vdavinci196:/dev/davinci0\-v/usr/local/Ascend/driver:/usr/local/Ascend/driver:ro\-v/usr/local/sbin:/usr/local/sbin:ro\-v/home:/home\镜像名bash注意不要使用--privilegedtrue特权模式。容器内执行npu-smi info可查看NPU信息后续使用方式与普通NPU一致。2.4 推理模型测试2.4.1 精度测试精度测试可使用开源数据集或业务相关数据集进行验证。RECCE模型通过现有数据集进行精度测试主要流程如下将未切分的NPU挂载到容器中。执行推理脚本得到图片数据集中每张图片的伪造可能性。将切分后的vNPU挂载到容器中重复步骤2。比较两次结果计算每张图片伪造可能性的差异并取平均得到最终精度差异。核心代码devicetorch.device(args.device)modeleval(Recce)(num_classes1)ifargs.weightandargs.bin:raiseValueError(Only one of --weight or --bin can be set.)elifargs.weight:weightstorch.load(args.weight,map_locationcpu)elifargs.bin:weightstorch.load(args.bin,map_locationcpu)[model]else:raiseValueError(Neither of --weight nor --bin is set. )model.load_state_dict(weights)modelmodel.to(device)freeze_weights(model)model.eval()paths,imagesprepare_data()inference(model,imagesimages,pathspaths,devicedevice)最终精度测试结果切分前后误差在可接受范围内符合预期。2.4.2 性能测试精度验证完成后进行性能测试主要流程如下启动4个Docker容器挂载到同一张NPU上。客户端持续向每个容器中的推理服务发送请求逐步提高并发数量记录单张图片处理耗时。启动4个Docker容器分别挂载到4个vNPU上重复步骤2。对比两次结果评估性能提升程度。最终性能测试结果切分前后性能几乎持平。2.5 FAQ2.5.1 容器启动失败问题现象执行docker run报错docker: Error response from daemon: OCI runtime create failed: container_linux.go:329 starting container process caused permission denied: unknown.根因分析某些镜像需要调用的系统调用被seccomp profile限制导致权限拒绝。解决方案在docker run命令中添加参数--security-opt seccompunconfined --security-opt apparmorunconfined。2.5.2 拉起模型服务报错问题现象执行npu-smi info报错dcmi module initialize failed. ret is -8005。根因分析检查docker run启动脚本发现--device参数中设备名称拼写错误。解决方案修正设备名称拼写重新执行docker run后服务正常启动。2.5.3 算力切分后如何统计单个NPU的AICore利用率问题现象切分后在宿主机上使用npu-smi info查看AICore利用率一直上不去。根因分析切分后该命令查看的是原始NPU的利用率不准确需进入容器查看vNPU的利用率。解决方案在每个容器中实现脚本定时执行npu-smi info获取AICore利用率写入宿主机可访问的日志文件中然后在宿主机上读取所有vNPU的利用率信息求和取平均。3 价值与效果通过本实践案例验证了昇腾Atlas 800I A2服务器对RECCE小模型进行部署切分的可行性并验证了精度和性能方面几乎无损失。在部分业务场景中单个容器要求只部署管理一个模型通过vNPU切分可实现算力资源隔离满足业务部署诉求同时提高NPU卡整体利用率。