- 一个Controller至少追踪一种类型的Kubernetes资源。这些对象有一个代表期望状态的指定字段。Controller负责确保其追踪的资源对象的当前状态接近期望状态。
- Controller Manager就是集群内部的管理控制中心,由负责不同资源的多个Controller构成,共同负责集群内的节点、Pod等所有资源的管理。
- Controller Manager主要提供了一个分发事件的能力,而不同的Controller只需要注册对应的Handler来等待接收和处理事件。
- 每种特定资源都有特定的Controller维护管理以保持预期状态。
图 1 Controller interaction process
HCCL-Controller是华为研发的一款用于NPU训练任务的组件,利用Kubernetes的informer机制,持续监控NPU训练任务及其Pod的各种事件,并读取Pod的NPU信息,生成对应的Configmap。该Configmap包含了NPU训练任务需要的hccl.json配置文件,方便NPU训练任务更好的协同和调度底层的昇腾910 AI处理器。
HCCL-Controller整体流程如图1所示。
-
Ascend Device Plugin通过list-and-watch接口,定时上报节点昇腾910 AI处理器DeviceID和健康状态。
-
Scheduler收到用户训练任务请求,创建Job和Configmap。使用Volacno调度器选择Job部署的节点。
-
Scheduler发送创建Pod信息到选中的节点Kubelet上。
-
在被选择的节点上,Ascend Device Plugin会从Kubelet收到分配设备的请求,返回DeviceID、Volume、环境变量等信息给Kubelet,Kubelet分配资源给Pod。
-
Ascend Device Plugin修改该Pod的annotation字段,将分配给Pod的昇腾910 AI处理器网卡IP和DeviceID写入Pod的annotation。
-
HCCL-Controller持续监控volcano job和Pod的变化,如果有新创建的Pod,HCCL-Controller会把Pod中annotation值取出,当volcano job的所有Pod信息获取完后,更新对应rings-config的Configmap。
-
Pod中容器训练任务持续查看Configmap的状态,发现状态为完成后,则可以从configmap中生成hccl.json文件。
HCCL-Controller是专门用于生成训练作业所有Pod的hccl.json文件的组件,该组件为Atlas 800 训练服务器K8s集群专用组件。
- 训练任务,Pod,ConfigMap需要设置ring-controller.atlas: ascend-910标签,HCCL-Controller通过该标签过滤,用于区分昇腾910场景和非昇腾910场景。
- volcano job与configmap的对应方式:volcano job.yaml中volume(ascend-910-config)的configmap name,就是volcano job对应的configmap。
- HCCL-Controller持续监控volcano job,pod和ConfigMap的变化(需携带训练任务,Pod,ConfigMap中的标签),同一个训练任务的volcano job和ConfigMap通过volume(ascend-910-config)关联。如果有新创建的Pod,HCCL-Controller把Pod中的annotation(ascend.kubectl.kubernetes.io/ascend-910-configuration)的值取出,为volcano job创建数据缓存信息表,当volcano job的所有实例信息获取完整后,更新对应的rings-config的ConfigMap。
- ConfigMap中rings-config的文件名默认为hccl.json,默认挂在路径为:“/user/serverid/devindex/config”。
-
安装Go的编译环境和goporxy的配置。
-
执行以下命令,编译HCCL-Controller。
cd build
bash build.sh
编译生成的文件在源码根目录下的“output“目录,如表1所示。
表 1 编译生成的文件列表
- {version}:表示版本号,请根据实际写入。
- arm和x86的二进制依赖不同,需要在对应架构上进行编译。
需要先完成《MindX DL用户指南》“安装前准备”章节中除“准备软件包”章节之外的其他章节内容。
请参考《MindX DL用户指南》中的“安装部署 > 安装前准备”。
请参考《MindX DL用户指南》中的“安装部署 > 安装MindX DL > 安装HCCL-Controller”。
- Kubernetes 1.16及以上
- Go 1.13及以上
hccl-controller #hccl-controller 组件
├── build #编译构建文件夹
│ ├── build.sh
│ ├── Dockerfile
│ ├── hccl-controller.yaml
│ ├── rbac.yaml
│ └── test.sh
├── doc
│ └── images
│ ├── Controller-interaction-process.png
│ ├── HCCL-Controller-process.png
│ ├── icon-caution.gif
│ ├── icon-danger.gif
│ ├── icon-note.gif
│ ├── icon-notice.gif
│ ├── icon-tip.gif
│ └── icon-warning.gif
├── go.mod
├── go.sum
├── main.go
├── output
├── pkg #源码文件
│ ├── hwlog
│ │ └── logger.go
│ ├── resource-controller
│ │ └── signals
│ │ ├── signal.go
│ │ ├── signal_posix.go
│ │ └── signal_windows.go
│ └── ring-controller
│ ├── agent
│ │ ├── businessagent.go
│ │ ├── businessagent_test.go
│ │ ├── deploymentworker.go
│ │ ├── deploymentworker_test.go
│ │ ├── types.go
│ │ ├── vcjobworker.go
│ │ └── vcjobworker_test.go
│ ├── controller
│ │ ├── controller.go
│ │ ├── controller_test.go
│ │ └── types.go
│ ├── model
│ │ ├── deployment.go
│ │ ├── deployment_test.go
│ │ ├── types.go
│ │ ├── vcjob.go
│ │ └── vcjob_test.go
│ └── ranktable
│ ├── v1
│ │ ├── ranktable.go
│ │ ├── ranktable_test.go
│ │ └── types.go
│ └── v2
│ ├── ranktable.go
│ ├── ranktable_test.go
│ └── types.go
├── README_EN.md
└── README.md