零基础入门昇腾集群调度组件Ascend Docker Runtime
创建容器时,为了容器内部能够正常使用昇腾AI处理器,需要引入昇腾驱动相关的脚本和命令。这些脚本和命令分布在不同的文件中,且存在变更的可能性。为了避免容器创建时冗长的文件挂载,MindCluster提供了部署在计算节点上的Ascend Docker Runtime组件。通过输入需要挂载的昇腾AI处理器编号,即可完成昇腾AI处理器及相关驱动的文件挂载。
一、背景概述
创建容器时,为了容器内部能够正常使用昇腾AI处理器,需要引入昇腾驱动相关的脚本和命令。这些脚本和命令分布在不同的文件中,且存在变更的可能性。为了避免容器创建时冗长的文件挂载,MindCluster提供了部署在计算节点上的Ascend Docker Runtime组件。通过输入需要挂载的昇腾AI处理器编号,即可完成昇腾AI处理器及相关驱动的文件挂载。
二、Ascend Docker Runtime组件上下游依赖
Ascend Docker Runtime逻辑接口如下图所示:

1、Ascend Docker Runtime与下游接口NPU对接
代码链接如下:
1)初始化

这段代码实现的功能包括:分配C字符串缓冲区(91、92);加载DCMI动态库(93~95);安全检查,确保库文件路径合法(97~99);初始化DCMI接口(101~103)
2)获取卡列表

这段代码实现的功能包括:调用C函数获取卡信息(119~121);数据验证(124~126);转换C数组为Go切片(128~135);
3)创建虚拟设备(关键方法)

这段代码实现的功能包括:初始化C结构体(172、173);配置虚拟设备参数(175~178);将Go字符串转换为C字符数组(179~186);调用C函数创建虚拟设备(187~191);验证返回的虚拟设备ID(192~195)
4)设备查找逻辑

这段代码实现的功能包括:物理ID转逻辑ID(212~215);验证逻辑ID范围(219~223);遍历所有卡和设备进行匹配查找(220~240)
2、Ascend Docker Runtime与上游接口容器对接
代码链接如下:
1)主入口函数

这段代码实现的功能包括:解析命令行参数(726~729);处理bundle目录路径(735~741);修改OCI规范文件(745~747)
2)核心函数

这段代码实现的功能包括:
① 路经检查(635~638)
调用工具函数mindxcheckutils.CheckPath进行检查。如果检查返回错误 (err != nil),说明路径有问题(如不存在、无权限等),立即使用日志系统hwlog.RunLog记录这个错误,然后函数直接返回该错误。这一步的快速失败避免了后续不必要的操作
② 读取规格文件(639~643)
调用readSpecFile(path)函数,该函数负责具体的文件读取和解析(例如JSON或 YAML解析)。如果读取或解析失败(如文件损坏、格式错误),记录一条更详细的错误日志并返回错误;如果成功,spec变量就包含了文件内容的内存表示,供后续修改
③ 处理设备和钩子(645~648)
调用processDevicesAndHooks(spec)函数。从函数名可知,它专门处理规格中的 设备(Devices)和钩子(Hooks)配置。这个函数会直接修改传入的spec对象(以指针方式传递)。如果处理过程中发生任何错误(例如,设备配置冲突、钩子脚本无效等),记录错误并返回
④ 写回文件(650)
调用writeSpecFile(path, spec)函数,它接收文件路径和修改后的spec对象。这个函数会完成数据序列化和文件写入的操作。modifySpecFile函数直接将 writeSpecFile的返回值作为自己的返回值。如果写入成功,则返回nil,表示整个函数执行成功;如果写入失败,则返回相应的错误(如磁盘空间不足)
3)设备处理核心逻辑

这段代码实现的功能包括:检查可见设备环境变量(682~685);当检测到有 Ascend设备需要挂载到容器时,添加预启动钩子,添加设备到OCI规范(687~694)
4)设备检测和解析

这段代码实现的功能包括:从环境变量获取设备列表(547~550);解析设备字符串(552~559);
5)添加设备到OCI规范

这段代码实现的功能包括:确定设备名称(569~572);添加主要设备(573~582);添加管理设备(584~587)
6)添加钩子函数


这段代码实现的功能包括:获取钩子脚本路径(209、214);安全检查(215~217);初始化钩子结构(222~224);添加预启动钩子(226、230~241);如果是虚拟设备模式,创建虚拟设备并更新环境(247~261)
更多推荐


所有评论(0)