同步操作将从 Ascend/ascend-for-volcano 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
基于开源Volcano调度的插件机制,增加昇腾处理器的亲和性调度,虚拟设备调度等特性,最大化发挥昇腾处理器计算性能。
昇腾910 AI处理器是华为研发的一款高性能AI处理器。其内部的处理器之间采用HCCS方式连接。每台物理设备具备8颗处理器,两个HCCS。每个HCCS存在4颗处理器,同一HCCS内处理器可做数据交换,不同HCCS内处理器不能通信,即同一Pod分配的昇腾910 AI处理器(若小于等于4)必须在同一个HCCS环内,否则任务运行失败。昇腾910 AI处理器的互联拓扑图如图1所示。
图 1 Ascend 910 AI Processor interconnection topology
说明: 图中A0~A7为昇腾910 AI处理器。
针对昇腾910 AI处理器的特征和资源利用的规则,制定昇腾910 AI处理器的亲和性策略如表1所示。
表 1 昇腾910 AI处理器亲和性策略说明
优先分配已经分配过昇腾910 AI处理器的AI服务器,减少碎片。 |
||
根据业务模型,对训练任务的要求如下:
根据亲和性策略和业务模型设计梳理出场景如表1所示。
说明:
- A~D列4个分组,表示处理器选取时,满足处理器选取的四种HCCS情况。优先级逐次递减,即当A中不满足时,才会选择B,C,D。
- 当组内满足HCCS时节点的情况。‘~’左边为满足要求的HCCS,右边为另一个HCCS的处理器剩余情况。如对于1个处理器申请的A组情况:另一个HCCS可能为0、1、2、3、4五种处理器剩余情况。其代表的节点优先级也依次减小。
- 8颗及其以上处理器适用于4颗及其以下的情况。且均放在A组,且需要全部占用。
表 1 亲和性策略场景列表
图 1 Affinity algorithm design process
图中关键步骤说明如下:
根据请求的昇腾910 AI处理器数量,按照资源申请约束选出最优的节点。
从选出的节点中,选择符合要求的昇腾910 AI处理器。
对选出的结果进行保存。
对选出的节点进行资源分配管理。
说明: 该步骤是在Volcano的AddEventHandler函数中实现。该函数包含了节点资源的预分配allocate函数。
完成以上的分配操作后,Volcano框架会将本轮分配结果提交给K8s的kubelet进行确认执行,本次分配结束。
该特性结合Volcano的集群设计,只需要利用框架在选取节点时对每个节点进行加权,取出最优者即可。
两阶段的选取:先选出4个优选数组,再进行组内选取,最终实现多节点的整体考虑。
由于Volcano未在allocate阶段的add方法中提供函数回调方法,故对于处理器的选取在节点筛选阶段就进行了。这样做的影响是:在任务并发执行时,可能存在芯片重复分配的情况。
以下两种场景可能涉及重复分配:
本session的不同任务间。当多个任务同时需要分配,且同一节点可以分给多个任务时。由于原生Volcano只是对数量进行分配,未对处理器编号进行分配。会造成处理器总数分配完成,出现某一处理器被分配多次的情况。
本程序使用Volcano框架提供的AddEventHandler函数来解决。在函数的allocate方法中,实现对节点处理器分配情况的管理。从而避免了重复分配的情况。
不同session之间。在本次session分配处理器时,由于在加权阶段就进行了分配,若此时资源处于等待释放状态,即暂时不能分配,就会出现本次分配失败。但Volcano在本次session不会感知。下次session时,该处理器变为可分配状态,会分配给其他任务。导致两个任务分配到同一个处理器,其中一个任务失败。
解决该问题的方法之一:在加权阶段进行处理器分配时,判断资源是否处于待释放状态。若是,则本次不分配。
图 1 Affinity program process (Volcano part)
华为昇腾处理器的亲和性调度基于Volcano开源部分提供的的插件机制,实现了插件简化开发。过程中主要实现了volcano-schedule框架中的几个插件函数。当Volcano每次session运行时,实现的函数就会按照编写的规则运行,从而实现处理器的亲和性调度。亲和性调度插件主要实现的函数如下:
validJobFn:
该函数主要是拦截申请NPU资源的任务,但申请的数量需要满足亲和性策略。具体要求请参见亲和性策略说明。
AddPredicateFn:
该函数主要是过滤掉不满足亲和性要求的节点。比如task请求数量为2时,但节点的两个HCCS却各自拥有1个处理器。该节点满足数量要求,却不满足亲和性要求,需要排除。
AddBatchNodeOrderFn:
该函数主要是选出满足亲和性条件的节点和节点内的处理器,并将结果放入Pod中。
AddEventHandler:
该函数主要是将节点拥有的可用的昇腾910 AI处理器进行统一管理。防止并发情况下的分发错误。
├── build # CI编译脚本
│ ├── build.sh # CI构建二进制脚本
│ ├── testBuild.sh # LLT测试启动脚本
│ ├── volcano-v1.4.0.yaml
│ └── volcano-v1.7.0.yaml
├── config
│ └── config.go
├── doc # 说明文档
│ └── figures
│ ├── Affinity-algorithm-design-process-ch.png
│ ├── Affinity-algorithm-design-process-en.png
│ ├── Affinity-program-process-(Volcano-part)-ch.png
│ ├── Affinity-program-process-(Volcano-part)-en.png
│ ├── Ascend-910-AI-Processor-interconnection-topology.png
│ ├── icon-caution.gif
│ ├── icon-danger.gif
│ ├── icon-note.gif
│ ├── icon-notice.gif
│ ├── icon-tip.gif
│ └── icon-warning.gif
├── huawei_npu.go # ascend-volcano-plugin组件入口代码
├── huawei_npu_test.go
├── internal
│ ├── ascend310
│ │ ├── card310x4 # 310卡调度策略代码目录
│ │ │ ├── frame.go
│ │ │ ├── frame_test.go
│ │ │ ├── task.go
│ │ │ └── type.go
│ │ ├── chip310x4 # 310 芯片调度策略代码目录
│ │ │ ├── frame.go
│ │ │ ├── frame_test.go
│ │ │ ├── node.go
│ │ │ └── type.go
│ │ ├── frame.go
│ │ ├── frame_test.go
│ │ └── type.go
│ ├── ascend310p # 310P 卡调度公共代码目录
│ │ ├── frame.go
│ │ ├── frame_test.go
│ │ ├── rescheduling.go
│ │ ├── type.go
│ │ ├── vnpu.go
│ │ └── vnpu_test.go
│ ├── ascend910
│ │ ├── ascend910b
│ │ │ ├── base.go
│ │ │ ├── card910bx2 # A300T A2调度策略代码目录
│ │ │ │ ├── frame.go
│ │ │ │ └── type.go
│ │ │ ├── card910bx2infer # A300I A2调度策略代码目录
│ │ │ │ ├── frame.go
│ │ │ │ └── type.go
│ │ │ ├── job.go
│ │ │ ├── module910bx16 # A200T A2 Box16调度策略代码目录
│ │ │ │ ├── frame.go
│ │ │ │ ├── node.go
│ │ │ │ └── type.go
│ │ │ ├── module910bx8 # A800T A2 调度策略代码目录
│ │ │ │ ├── frame.go
│ │ │ │ ├── job.go
│ │ │ │ ├── node.go
│ │ │ │ └── type.go
│ │ │ ├── node.go
│ │ │ └── type.go
│ │ ├── asend910old
│ │ │ ├── card910x2 # A300T调度策略代码目录
│ │ │ │ ├── frame.go
│ │ │ │ ├── frame_test.go
│ │ │ │ ├── job.go
│ │ │ │ └── type.go
│ │ │ ├── half910x4 # 800/9000 4卡调度策略代码目录
│ │ │ │ ├── frame.go
│ │ │ │ ├── frame_test.go
│ │ │ │ ├── job.go
│ │ │ │ ├── node.go
│ │ │ │ └── type.go
│ │ │ └── module910x8 # 800/9000调度策略代码目录
│ │ │ ├── frame.go
│ │ │ ├── frame_reschedule_test.go
│ │ │ ├── frame_test.go
│ │ │ ├── job.go
│ │ │ ├── node.go
│ │ │ ├── task.go
│ │ │ └── type.go
│ │ ├── frame.go
│ │ ├── frame_test.go
│ │ └── type.go
│ ├── base # 基础调度策略代码目录
│ │ ├── frame.go
│ │ ├── frame_test.go
│ │ ├── node.go
│ │ ├── task.go
│ │ └── type.go
│ ├── rescheduling # 故障调度策略代码目录
│ │ ├── cache.go
│ │ ├── cache_test.go
│ │ ├── configmap.go
│ │ ├── configmap_test.go
│ │ ├── frame_reschedule_test.go
│ │ ├── job.go
│ │ ├── job_test.go
│ │ ├── node.go
│ │ ├── node_test.go
│ │ ├── reschedule.go
│ │ ├── reschedule_test.go
│ │ ├── task.go
│ │ └── type.go
│ ├── test # LLT公共代码目录
│ │ ├── job.go
│ │ ├── reschedule.go
│ │ └── type.go
│ └── vnpu # VNPU调度公共代码目录
│ ├── frame.go
│ ├── frame_test.go
│ ├── node.go
│ ├── pod.go
│ ├── type.go
│ ├── vdynamic.go
│ └── vstatic.go
├── LICENSE
├── output # CI编译结果目录
│ ├── Dockerfile-controller
│ └── Dockerfile-scheduler
├── OWNERS
├── plugin # 插件适配代码目录
│ ├── const.go
│ ├── device_info.go
│ ├── device_info_test.go
│ ├── factory.go
│ ├── factory_test.go
│ ├── job.go
│ ├── job_test.go
│ ├── node.go
│ ├── node_test.go
│ ├── plugin.go
│ ├── plugin_test.go
│ ├── task.go
│ ├── task_test.go
│ ├── tor.go
│ ├── type.go
│ └── vnode.go
├── README.md
├── test # llt公共基础代码目录
│ ├── frame.go
│ ├── job.go
│ ├── node.go
│ ├── pod.go
│ ├── reschedule.go
│ └── type.go
├── type.go
└── util # 调度策略公共代码目录
├── configmap.go
├── configmap_test.go
├── job.go
├── job_test.go
├── task.go
├── task_test.go
├── type.go
└── util.go
确保PC机连接至互联网,并已完成Git和Docker的安装。参见Git安装,Docker-ce安装。
已完成Go语言环境的安装(版本>1.13,建议使用最新的bugfix版本)。参见https://golang.org/。
完成musl的安装(版本>=1.2.0)。参见http://musl.libc.org/。
根据所在网络环境配置Go代理地址,国内可使用Goproxy China,例如:
go env -w GOPROXY=https://goproxy.cn,direct
执行以下命令,在“$GOPATH/src/volcano.sh/“目录下拉取Volcano v1.4.0(或v1.7.0)版本官方开源代码。
cd $GOPATH/src/volcano.sh/ git clone -b release-1.4 https://github.com/volcano-sh/volcano.git
将代码目录“ascend-for-volcano“重命名为“ascend-volcano-plugin”拷贝至Volcano官方开源代码的插件路径下(“$GOPATH/src/volcano.sh/volcano/pkg/scheduler/plugins/“)。
执行以下命令,编译Volcano二进制文件和so文件。根据开源代码版本,为build.sh脚本选择对应的参数,如v1.4.0.
cd $GOPATH/src/volcano.sh/volcano/pkg/scheduler/plugins/ascend-volcano-plugin/build
chmod +x build.sh
./build.sh v1.4.0
编译出的二进制文件和动态链接库文件在“ascend-volcano-plugin/output“目录下,文件表1所示。
说明: {version}:表示版本号。
请参考《MindX DL用户指南》中的“集群调度用户指南 > 安装部署指导 > 安装集群调度组件 > 典型安装场景 > 集群调度场景”进行。
|
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。