一、背景概述

K8s对资源信息的调度依赖感知的资源信息。除基础的CPU和内存信息以外,需通过K8s提供的设备插件机制,供用户自定义新的资源类型,从而定制个性化的资源发现和上报策略。MindCluster提供了部署在计算节点的Ascend Device Plugin服务,用于提供适合昇腾设备的资源发现和上报策略

二、组件上下游依赖

Ascend Device Plugin逻辑接口如下图所示:

在这里插入图片描述

① 从dcmi中获取芯片的类型、数量、健康状态信息,或者下发芯片复位命令。

上报芯片的类型、数量和状态给kubelet

② 上报芯片的类型、数量和具体故障信息给ClusterD

③ 将调度器选中的芯片信息,以环境变量的方式告知给Ascend Docker Plugin

④ 向容器内部下发训练任务拉起、停止的命令

1、Ascend Docker Plugin与下游接口dcmi对接

代码链接如下:

https://gitcode.com/Ascend/mind-cluster/blob/master/component/ascend-device-plugin/pkg/device/ascendcommon.go

1)核心结构体定义

在这里插入图片描述

该结构体包含的信息有:健康状态管理(80)、设备标识信息(81~83)、A5特定字段(84~91)、重置状态管理(92~97)、缓存信息(98~99)

2)核心功能模块

① 设备信息管理

在这里插入图片描述

该段代码实现的功能有:检查并初始化节点设备信息缓存(256);使用轮询机制定期更新(257);获取当前设备列表(258~259);深度拷贝并更新设备信息(260~264);处理手动分离的NPU故障(266);获取交换机故障信息(275);

写入更新后的设备信息到ConfigMap(280)

② 健康检查逻辑

在这里插入图片描述

这段代码实现的逻辑是:判断健康状态(950~954)

③ 故障处理信息

在这里插入图片描述

这段代码实现的功能有:刷新故障代码(1135);统计故障持续时间(1136);更新健康状态(1137)

④ Pod注解管理

在这里插入图片描述

这段代码实现的功能有:排序设备列表(804~805);构建注解检查器(807~814);检查并更新注解(815~829);更新Pod注解(845~848)

2、Ascend Docker Plugin与上游接口Ascend Docker Runtime对接

代码链接如下:

https://gitcode.com/Ascend/mind-cluster/blob/master/component/ascend-device-plugin/pkg/kubeclient/kubeclient.go

1)核心结构体定义

在这里插入图片描述

该结构体包含的信息有:Kubernetes客户端集合、当前节点名称、设备信息ConfigMap名称、API错误标记、Pod监听器、工作队列、HTTP客户端

2)客户端初始化

在这里插入图片描述

这段代码实现的功能有:从kubeconfig构建配置(68~72);创建Kubernetes客户端(73~77);从环境变量获取节点名称(79~82);配置安全的HTTP客户端(84~91);返回完整的客户端实例(93~100)

3)Pod列表校验

在这里插入图片描述

这段代码实现的功能有:数量限制检查(214~216);名称和命名空间格式校验(219~222)

3、Ascend Docker Plugin与上游接口kubelet对接

代码链接如下:

https://gitcode.com/Ascend/mind-cluster/blob/master/component/ascend-device-plugin/pkg/server/server.go

1)核心启动方法

在这里插入图片描述

这段代码实现的功能有:重启计数器增加(42);启动gRPC服务器(52~54);向kubelet注册设备插件(57~60);若注册失败,清理资源(61)

2)停止管理

在这里插入图片描述

该段代码实现的功能有:若已经停止,直接返回(67~68);停止ListAndWatch长连接(72);停止gRPC服务器(73)

3)重启标志管理

在这里插入图片描述

这段代码实现的功能有:获取重启标志(79~81);设置重启标志(84~86)

4)启动gRPC服务

在这里插入图片描述

这段代码实现的功能有:创建网络监听器(90~93);配置gRPC服务器参数(95~98);注册设备插件gRPC服务(102);异步启动gRPC服务器(103~107);等待gRPC服务器真正启动完成(110~113)

5)kubelet注册逻辑

在这里插入图片描述

这段代码实现的功能有:验证kubelet socket路径和权限(120~123);建立到kubelet的gRPC连接(125~132);创建注册客户端(144);构建资源名称(145);构建注册请求(146~150);发送注册请求(151~153)

6)网络监听器创建(核心)

在这里插入图片描述

这段代码实现的功能有:验证设备插件目录路径和权限(159~163);设置文件监视器,监控socket目录变化(165~168);构建完整的socket文件路径(170);清理已存在的socket文件(171~176);创建Unix domain socket监听器(178~182);设置socket文件权限(184~187);设置socket文件属主(189~192);使用限流监听器包装(194~195)

4、Ascend Docker Plugin与下游接口ClusterD对接

代码链接如下:

https://gitcode.com/Ascend/mind-cluster/blob/master/component/ascend-device-plugin/pkg/server/plugin.go

1)健康状态管理核心逻辑

在这里插入图片描述

这段代码实现的功能有:获取芯片健康状态和所有AI Core设备(70~77);获取实际使用的AI Core设备(79~83);如果芯片不健康,对应的真实设备也不健康(85~97);计算需要标记为不健康的空闲AI Core数量(102~106);获取空闲的AI Core设备(108~112);随机选择空闲设备标记为不健康(114~118)

2)设备映射管理

在这里插入图片描述

这段代码实现的功能有:构建反向映射(149~152);处理设备映射关系(153~162);处理未映射的设备(165~173)

3)核心gRPC方法实现

① 设备状态监控

在这里插入图片描述

这段代码实现的功能有:首次报告设备信息(302);gRPC流关闭(305~314);收到停止信号(315~319);设备状态变更通知(320~326)

② 构建响应消息

在这里插入图片描述

这段代码实现的功能有:非预设虚拟设备场景下处理AI Core健康状态(185~195);Volcano调度器场景下使用设备映射(197~208);普通场景下直接报告设备信息(210~214)

4)设备分配核心逻辑

在这里插入图片描述

该段代码实现的功能有:检查分配请求合法性(912~915);获取所有NPU信息(916~920);处理每个容器的分配请求(921~924);Volcano调度器特殊处理(932~939);获取设备ID列表(940~944);构建容器响应(946~954);设置HCCL拓扑文件和慢节点通知环境变量(955~956)

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐