# ascend-hccl-controller
**Repository Path**: frankang/ascend-hccl-controller
## Basic Information
- **Project Name**: ascend-hccl-controller
- **Description**: 华为NPU通讯集合生成控制器,自动生成训练任务需要的通信集合配置
- **Primary Language**: Go
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 21
- **Created**: 2023-02-15
- **Last Updated**: 2023-10-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HCCL-Controller.ZH
- [Controller介绍](#Controller介绍.md)
- [HCCL-Controller](#HCCL-Controller.md)
- [环境依赖](#环境依赖.md)
- [目录结构](#目录结构.md)
- [版本更新信息](#版本更新信息.md)
Controller介绍
- 一个Controller至少追踪一种类型的Kubernetes资源。这些对象有一个代表期望状态的指定字段。Controller负责确保其追踪的资源对象的当前状态接近期望状态。
- Controller Manager就是集群内部的管理控制中心,由负责不同资源的多个Controller构成,共同负责集群内的节点、Pod等所有资源的管理。
- Controller Manager主要提供了一个分发事件的能力,而不同的Controller只需要注册对应的Handler来等待接收和处理事件。
- 每种特定资源都有特定的Controller维护管理以保持预期状态。
**图 1** Controller interaction process

HCCL-Controller
HCCL-Controller是华为研发的一款用于NPU训练任务的组件,利用Kubernetes的informer机制,持续监控NPU训练任务及其Pod的各种事件,并读取Pod的NPU信息,生成对应的Configmap。该Configmap包含了NPU训练任务需要的hccl.json配置文件,方便NPU训练任务更好的协同和调度底层的昇腾910 AI处理器。
## HCCL-Controller整体流程
HCCL-Controller整体流程如[图1](#fig13227145124720)所示。
**图 1** HCCL-Controller process

1. Ascend Device Plugin通过list-and-watch接口,定时上报节点昇腾910 AI处理器DeviceID和健康状态。
2. Scheduler收到用户训练任务请求,创建Job和Configmap。使用Volacno调度器选择Job部署的节点。
3. Scheduler发送创建Pod信息到选中的节点Kubelet上。
4. 在被选择的节点上,Ascend Device Plugin会从Kubelet收到分配设备的请求,返回DeviceID、Volume、环境变量等信息给Kubelet,Kubelet分配资源给Pod。
5. Ascend Device Plugin修改该Pod的annotation字段,将分配给Pod的昇腾910 AI处理器网卡IP和DeviceID写入Pod的annotation。
6. HCCL-Controller持续监控volcano job和Pod的变化,如果有新创建的Pod,HCCL-Controller会把Pod中annotation值取出,当volcano job的所有Pod信息获取完后,更新对应rings-config的Configmap。
7. Pod中容器训练任务持续查看Configmap的状态,发现状态为完成后,则可以从configmap中生成hccl.json文件。
## HCCL-Controller业务规则
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](#li121021418717)中的标签),同一个训练任务的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”。
## 编译HCCL-Controller
1. 安装Go的编译环境和goporxy的配置。
2. 执行以下命令,编译HCCL-Controller。
**cd build**
**bash build.sh**
编译生成的文件在源码根目录下的“output“目录,如[表1](#table1860618363516)所示。
**表 1** 编译生成的文件列表
文件名
|
说明
|
hccl-controller
|
HCCL-Controller二进制文件
|
Dockerfile
|
HCCL-Controller镜像构建文本文件
|
hccl-controller-{version}.yaml
|
HCCL-Controller的启动配置文件
|
> **说明:**
>- _\{__version__\}_:表示版本号,请根据实际写入。
>- arm和x86的二进制依赖不同,需要在对应架构上进行编译。
## 安装前准备
需要先完成《[MindX DL用户指南](https://www.hiascend.com/software/mindx-dl)》“安装前准备”章节中除“准备软件包”章节之外的其他章节内容。
请参考《[MindX DL用户指南](https://www.hiascend.com/software/mindx-dl)》中的“安装部署 \> 安装前准备”。
## 安装HCCL-Controller
请参考《[MindX DL用户指南](https://www.hiascend.com/software/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
```
版本更新信息
版本
|
发布日期
|
修改说明
|
v2.0.2
|
2021-07-15
|
增加和K8s交互信息的检查。
|
v2.0.1
|
2021-03-30
|
支持Deployment工作负载。
|
v20.2.0
|
2020-12-30
|
更新目录结构章节。
|
v20.1.0
|
2020-09-30
|
第一次正式发布。
|