附录
边缘容器日志输出指导
由于边缘设备(如Atlas 500 A2 智能小站)存储空间有限,并且边缘设备多采用eMMC等flash作为存储介质,该介质存在使用寿命的限制。为避免存储空间过快被写满从而影响业务或存储介质过快达到使用寿命,用户可以参考本章节边缘容器日志的输出建议,使边缘容器以合适的方式输出日志。
当前Atlas硬件上运行的边缘容器应用一般是通过K8s兼容的边缘管理平台来进行管理,如华为云IEF或基于KubeEdge搭建的第三方边缘平台等。在该平台下,容器日志的输出方式主要分为以下三种:
- 容器控制台标准输出(STDOUT和STDERR)方式
- (推荐)挂载到主机目录方式
- 容器日志直接输出到日志服务
Note
如果系统中有日志服务器,建议直接在容器中将日志输出到日志服务中;如果没有,建议采用挂载到主机目录的方式输出日志,减少日志对硬件和其他业务影响的风险。
在这种方式下,应用将容器的日志输出到标准输出。缺省情况下,Docker引擎捕捉所有容器的标准输出,使用JSON格式写入到文件里,该文件会保存到主机的/var/lib/docker/containers/{containerid}目录下,如图1所示。
图 1 {containerid}-json.log文件所在路径示例

Note
如果边缘管理平台不支持该目录下日志文件的绕接或日志绕接配置错误,会导致/var/lib/docker被占满,从而影响新容器的部署及其他容器业务的正常运行。故不建议采用该方式。
该方式下边缘平台日志收集的方式如图2所示。
应用将容器日志挂载到边缘主机上。边缘管理平台提供主机上日志收集能力,并将主机文件日志进行绕接。
Note
- 应用可以将容器日志挂载到主机上的非关键大容量目录,建议不要挂载到eMMC等存储介质上,避免影响硬件整体寿命。
- 边缘容器管理平台一般会支持该能力,以减少对系统目录/var/lib/docker的影响。基于安全性考虑,该配置需要符合所在组织的安全要求。
如图3所示,应用环境里如果有日志服务器,可以将日志直接输出到外部日志服务器,使日志不在边缘环境里落盘,最大限度减少对硬件和其他业务的影响。
Ascend Docker Runtime默认挂载内容
Ascend Docker Runtime会根据实际环境情况默认以只读方式挂载以下目录和文件到容器中。挂载的文件对other用户不能有写权限,对同组内的其他用户也不能有写权限。
表 1 默认挂载目录和文件(Atlas 200 AI加速模块(RC场景))
| 路径 | 说明 |
|---|---|
| /dev/davinciX | NPU设备,X是ID号。例如:davinci0。 |
| /dev/davinci_manager | 管理设备。 |
| /usr/local/Ascend/driver/tools | 目录,驱动提供的工具包。 |
| /usr/local/Ascend/driver/lib64 | 目录,驱动提供的用户态库。 |
| /usr/local/sbin/npu-smi | 文件,NPU-SMI工具。 |
| /etc/hdcBasic.cfg | 文件,hdc基础文件。 |
| /etc/sys_version.conf | 文件,驱动的版本信息。 |
| /dev/dvpp_cmdlist | 设备文件,支撑推理业务。 |
| /var/queue_schedule | 管理FlowGW调度框架。 [!NOTE] 说明 挂载此目录需同时满足以下条件:
|
表 2 默认挂载目录和文件(Atlas 200I SoC A1 核心板)
| 路径 | 说明 |
|---|---|
| /dev/davinciX | NPU设备,X是ID号。例如:davinci0。 |
| /dev/davinci_manager | davinci相关的设备管理设备。 |
| /usr/local/bin/npu-smi | 文件,NPU-SMI工具。 |
| /etc/hdcBasic.cfg | 文件,hdc基础文件。 |
| /etc/sys_version.conf | 文件,驱动的版本信息。 |
| /dev/dvpp_cmdlist | 设备文件,支撑推理业务。 |
| /var/queue_schedule | 管理FlowGW调度框架。 [!NOTE] 说明 挂载此目录需同时满足以下条件:
|
表 3 默认挂载目录和文件(Atlas 200I A2 加速模块和Atlas 200I DK A2 开发者套件)
表 4 默认挂载目录和文件(Atlas 500 智能小站(型号 3000))
| 路径 | 说明 |
|---|---|
| /dev/davinciX | NPU设备,X是ID号。例如:davinci0。 |
| /dev/davinci_manager | 管理设备。 |
| /dev/hisi_hdc | 管理设备。 |
| /dev/devmm_svm | 管理设备。 |
| /home/data/miniD/driver/lib64 | 目录,驱动提供的用户态库。 |
| /usr/local/dcmi | 目录,DCMI头文件和库。 |
| /usr/local/lib/libdcmi.so | 文件,DCMI动态库。 |
| /usr/local/bin/npu-smi | 文件,NPU-SMI工具。 |
| /dev/dvpp_cmdlist | 设备文件,支撑推理业务。 |
| /var/queue_schedule | 管理FlowGW调度框架。 [!NOTE] 说明 挂载此目录需同时满足以下条件:
|
表 5 默认挂载目录和文件(Atlas 500 A2 智能小站)
表 6 默认挂载目录和文件(Atlas 350 标卡)
| 路径 | 说明 |
|---|---|
| /dev/davinciX | NPU设备,X是ID号。例如:davinci0。 |
| /dev/davinci_manager | 管理设备。 |
| /dev/hisi_hdc | 管理设备。 |
| /dev/uburma | 管理设备,支持UB协议。当不支持UB协议时,不会挂载此设备。 |
| /dev/ummu | 管理设备,支持UB协议。当不支持UB协议时,不会挂载此设备。 |
| /usr/local/Ascend/driver/lib64 | 目录,驱动提供的用户态库。 |
| /usr/local/Ascend/driver/include | 目录,驱动提供的头文件。 |
| /usr/local/dcmi | 目录,DCMI头文件和库。 |
| /usr/local/bin/npu-smi | 文件,NPU-SMI工具。 |
| /etc/hccl_rootinfo.json | mindcluster-tools生成的rootinfo文件,该文件非必需挂载项。 |
| /usr/local/Ascend/driver/topo | 拓扑目录。 |
表 7 默认挂载目录和文件(其他设备)
| 路径 | 说明 |
|---|---|
| /dev/davinciX | NPU设备,X是ID号。例如:davinci0。 |
| /dev/davinci_manager | 管理设备。 |
| /dev/hisi_hdc | 管理设备。 |
| /dev/devmm_svm | 管理设备。 |
| /usr/local/Ascend/driver/lib64 | 目录,驱动提供的用户态库。 |
| /usr/local/Ascend/driver/include | 目录,驱动提供的头文件。 |
| /usr/local/dcmi | 目录,DCMI头文件和库。 |
| /usr/local/bin/npu-smi | 文件,NPU-SMI工具。 |
| /dev/dvpp_cmdlist | 设备文件,支撑数字视觉预处理功能。 |
| /var/queue_schedule | 管理FlowGW调度框架。 [!NOTE] 说明 挂载此目录需同时满足以下条件:
|
Ascend Docker Runtime默认挂载白名单
Ascend Docker Runtime通过ASCEND_RUNTIME_MOUNTS参数,提供了配置自定义默认挂载项的特性,具体操作请参考(可选)配置自定义挂载内容章节。Ascend Docker Runtime的默认挂载项受白名单限制,具体白名单列表如表1所示。
表 1 默认挂载白名单列表
| 路径 | 说明 |
|---|---|
| /usr/local/Ascend/driver/lib64 | 目录,驱动提供的用户态库。 |
| /usr/local/Ascend/driver/include | 目录,驱动提供的头文件。 |
| /usr/local/dcmi | 目录,DCMI头文件和库。 |
| /usr/local/bin/npu-smi | 文件,NPU-SMI工具。 |
| /home/data/miniD/driver/lib64 | 目录,驱动提供的用户态库。 |
| /usr/lib64/aicpu_kernels | |
| /usr/local/sbin/npu-smi | 文件,NPU-SMI工具。 |
| /usr/local/Ascend/driver/tools | 目录,驱动提供的工具包。 |
| /etc/hdcBasic.cfg | 文件,hdc基础文件。 |
| /etc/sys_version.conf | 文件,驱动的版本信息。 |
| /etc/ld.so.conf.d/mind_so.conf | 驱动动态库路径配置文件。 |
| /etc/slog.conf | 日志配置文件。 |
| /var/dmp_daemon | 文件,dmp守护进程。 |
| /var/slogd | 文件,日志组件。 |
| /usr/lib64/libsemanage.so.2 | 文件,驱动所需的动态库。 |
| /usr/lib64/libmmpa.so | |
| /usr/lib64/libcrypto.so.1.1 | |
| /usr/lib64/libdrvdsmi.so | |
| /usr/lib64/libdcmi.so | |
| /usr/lib64/libstackcore.so | |
| /usr/lib64/libmpi_dvpp_adapter.so | |
| /usr/lib64/libaicpu_scheduler.so | |
| /usr/lib64/libaicpu_processer.so | |
| /usr/lib64/libaicpu_prof.so | |
| /usr/lib64/libaicpu_sharder.so | |
| /usr/lib64/libadump.so | |
| /usr/lib64/libtsd_eventclient.so | |
| /usr/lib64/libyaml-0.so.2 | |
| /usr/lib/aarch64-linux-gnu/libyaml-0.so.2 | |
| /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1 | |
| /var/queue_schedule | 管理FlowGW调度框架。 |
| /etc/hccl_rootinfo.json | mindcluster-tools生成的rootinfo文件。 |
| /usr/local/Ascend/driver/topo | 拓扑目录。 |
Ascend Docker Runtime命令说明
Ascend Docker Runtime安装后,会在安装目录生成可执行工具,涉及到的指令为内部命令,用户请勿直接使用,相关指令如表1所示。
表 1 命令说明
Note
- 因为Ascend Docker Runtime会将输入参数直接传递至runc或者docker-runc,所以runc/docker-runc的相关参数也会被Ascend Docker Runtime接受,用户请自行参考所在环境的runc/docker-runc的命令行选项使用相关参数。
- ascend-docker-hook工具会忽略参数运行,运行时会接受标准输入。
镜像和二进制部署差异
表 1 组件两种安装方式差异
| 安装方式 | 差异 |
|---|---|
| 二进制 |
|
| 镜像 | K8s作为调度管理平台,需要使用特权容器和root用户。 |
使用ServiceAccount和KubeConfig差异
表 1 K8s认证授权方式差异
| 认证凭据 | 组件 | 差异 |
|---|---|---|
| ServiceAccount |
|
ServiceAccount的token文件内容会明文挂载到物理机上,有暴露风险。 |
| 导入的KubeConfig文件 | Resilience Controller | 通过集群调度组件提供的加密工具导入后为密文落盘,工具不提供解密导出功能,安全性较高。如果既配置了ServiceAccount,也导入了KubeConfig文件,后者优先级更高。 |
高可用集群中的调度组件
生产环境中,Kubernetes集群通常会部署多个管理节点,以避免单个管理节点故障导致整个集群不可用。Kubernetes官方提供了两种高可用的集群搭建方案,请参见Kubernetes文档中高可用拓扑选项。集群调度组件基于官方“Stacked etcd topology”方案进行验证,各组件能够在多个管理节点场景下正常运行,且功能正常。
多管理节点场景需要保证所有管理节点配置一致,如集群调度组件镜像、日志目录、运行用户、节点标签等配置需一致。多管理节点下集群调度组件的安装请参见安装部署章节。多管理节点的安装请参见K8s官方文档利用kubeadm创建高可用集群。
使用Containerd的集群调度组件
Kubernetes 1.20版本之后,将不再支持使用Docker作为CRI(container runtime interface)。生产环境中,如果对使用的K8s有高版本要求时,需要考虑改用其它CRI。集群调度组件基于主流CRI Containerd的1.4.4版本进行安装和验证,各组件能够在Containerd + Kubernetes场景下正常运行,且功能正常。
Containerd安装流程请参见官方资料。集群调度组件安装时默认使用Ascend Docker Runtime,可以配置Containerd使用Ascend Docker Runtime替代runc,用于在启动容器时自动挂载设备,对Containerd需要做的配置请参见安装部署章节的Containerd场景下安装Ascend Docker Runtime。
模型训练任务说明
使用其他调度器时,根据服务器类型,对训练任务的约束如下。当使用集群调度组件的Volcano作为调度器时,调度任务时已经满足如下使用约束。
表 1 训练任务使用说明
Ascend Device Plugin通信文件
在Ascend Device Plugin插件中,会生成用于通信的sock文件,sock文件的类型如下所示。
- npu.sock
- Ascend910.sock
- Ascend310.sock
- Ascend310P.sock
- davinci-mini.sock
- Ascend910-X.sock:X可取值为2c、4c、8c、16c、12c.3cpu.32g、12c.3cpu.32g.dvpp、12c.3cpu.32g.ndvpp、6c.1cpu.16g、3c.0.5cpu.8g、10c.3cpu.16g、10c.3cpu.16g.dvpp、10c.3cpu.16g.ndvpp、5c.1cpu.8g、4c.1cpu.5g、10c.3cpu.32g、10c.3cpu.32g.dvpp、10c.3cpu.32g.ndvpp和5c.1cpu.16g
- Ascend310P-X.sock:X可取值1c、2c、4c、2c.1cpu、4c.3cpu、4c.3cpu.ndvpp、4c.4cpu.dvpp
上述sock文件仅用于和本机的K8s通信。
芯片故障码参考文档
各个产品芯片故障码的详细说明,可以参见表1。
表 1 产品故障码参考文档
| 产品形态 | 参考文档 |
|---|---|
| Atlas 训练系列产品 | |
| Atlas A2 训练系列产品 | |
| Atlas A3 训练系列产品 | |
| 推理服务器(插Atlas 300I 推理卡) | 《Atlas 300I 推理卡 黑匣子错误码信息列表(型号 3000, 3010)》 |
| Atlas 200I SoC A1 核心板 | |
| Atlas 推理系列产品(不包含Atlas 200I SoC A1 核心板) |
节点故障码参考文档
各个产品节点故障码的详细说明,可以参见表1。
表 1 节点故障码参考文档
| 产品形态 | 参考文档 |
|---|---|
| Atlas 800T A2 训练服务器 | 《Atlas 800T A2 训练服务器 iBMC 告警处理》 |
| Atlas 900 A2 PoD 集群基础单元 | 《Atlas 900 RCK A2 计算节点 iBMC 告警处理》 |
Note
其他产品形态的iBMC告警请从Support网站获取,选择对应产品,找到对应产品的iBMC 告警处理。
名词说明
本章节介绍了集群调度组件用户指南中部分名词,方便用户更好的理解文档内容和步骤,名词介绍如表1所示。
表 1 名词解释
| 名词 | 说明 |
|---|---|
| 多机多卡训练 | 同时使用多台训练服务器上的多块芯片进行分布式训练。 |
| 单机单卡训练 | 使用1台训练服务器上的1颗芯片进行训练。 |
Note
更多关于集群调度组件支持的产品形态,请参见支持的产品形态和OS清单章节。
公网地址
表 1 集群调度组件代码非公网地址说明
| url | 说明 |
|---|---|
| huawei.com/Ascend910 | Atlas 训练系列产品资源名称,非网址,不访问。 |
| huawei.com/Ascend310P | Atlas 推理系列产品资源名称,非网址,不访问。 |
| huawei.com/Ascend310 | Atlas 200/300/500 推理产品资源名称,非网址,不访问。 |
| huawei.com/Ascend* | Ascend*切分芯片资源名称,非网址,不访问。 |
https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.3 |
注释参考信息,不访问。 |
| huawei.com/Ascend310P-V | Atlas 推理系列产品混插模式:Atlas 300V 视频解析卡资源名称,非网址,不访问。 |
| huawei.com/Ascend310P-VPro | Atlas 推理系列产品混插模式:Atlas 300V Pro 视频解析卡资源名称,非网址,不访问。 |
| huawei.com/Ascend310P-IPro | Atlas 推理系列产品混插模式:Atlas 300I Pro 推理卡资源名称,非网址,不访问。 |
| huawei.com/npu | Atlas 350/850/950 系列产品资源名称,非网址,不访问。 |
安全说明
断点续训展示的代码为开源代码,其中涉及到的脚本(Python以及shell)需要设置相同的用户和用户组。出于安全的考虑,建议用户对其中的输入参数、文件目录、文件路径等信息进行校验。
输入参数校验项目包括但不限于:
- 涉及使用外部变量作为命令的一部分都进行严格的参数校验和防注入措施。
- 从环境变量中获取的外部变量在用于命令拼接之前都要做严格的校验和防注入措施。
- 所有的进程理应最小权限原则,避免由于注入导致严重后果。
- 代码中不存在直接使用外部变量作为命令。
- 遵守各类编程语言安全规范。
文件路径校验项目包括但不限于:
- 路径长度有做限制。
- 路径有做特殊字符过滤和防绕过机制。
- 不存在命令注入。
- 进程满足最小权限原则。
- 白名单中不存在高危路径。
- 文件路径真实性有校验,有做抛异常处理。
- 命令注入是可控外部变量导致的非预期行为。
- 恢复策略只支持Python 3.7和Python 3.9版本。
- 脚本适配中,用户需要根据情况对异常进行捕获并按照业务逻辑处理。
用户信息列表
请周期性地更新用户的密码,避免长期使用同一个密码带来的风险。
| 用户 | 描述 | 初始密码 | 密码修改方法 |
|---|---|---|---|
| root | - | 用户自定义 | 使用passwd命令修改。 |
| HwHiAiUser | 驱动run包的运行用户。 | 用户自定义 | 使用passwd命令修改。 |
| hwMindX | 集群调度组件默认的运行用户,默认设置为nologin。 | 无 | - |
| HwBaseUser | Atlas 200I SoC A1 核心板上驱动相关设备运行用户,安装驱动时由驱动run包或者用户自行创建,默认设置为nologin。 | 无 | - |
| HwDmUser | Atlas 200I SoC A1 核心板上驱动相关设备运行用户,安装驱动时由驱动run包或者用户自行创建,默认设置为nologin。 | 无 | - |
| 用户 | 描述 | 初始密码 | 密码修改方法 |
|---|---|---|---|
| root | - | 无 | - |
| HwHiAiUser | 驱动run包的运行用户,非Atlas 200I SoC A1 核心板上的集群调度组件容器内默认为nologin,该用户不可登录。 | 无 | - |
| hwMindX | 集群调度组件容器内默认的运行用户,默认设置为nologin。 | 无 | - |
| HwBaseUser | Atlas 200I SoC A1 核心板上驱动相关设备运行用户,集群调度组件容器内由用户自行创建。 | 无 | - |
| HwDmUser | Atlas 200I SoC A1 核心板上驱动相关设备运行用户,集群调度组件容器内由用户自行创建。 | 无 | - |
| 用户 | 描述 | 初始密码 | 密码修改方法 |
|---|---|---|---|
| nginx | nginx容器运行账户 | 无 | - |
| 用户 | 初始密码 | 密码修改方法 |
|---|---|---|
| root | 无 | - |
| bin | 无 | - |
| daemon | 无 | - |
| adm | 无 | - |
| lp | 无 | - |
| sync | 无 | - |
| shutdown | 无 | - |
| halt | 无 | - |
| 无 | - | |
| news | 无 | - |
| uucp | 无 | - |
| operator | 无 | - |
| man | 无 | - |
| postmaster | 无 | - |
| cron | 无 | - |
| ftp | 无 | - |
| sshd | 无 | - |
| at | 无 | - |
| squid | 无 | - |
| xfs | 无 | - |
| games | 无 | - |
| cyrus | 无 | - |
| vpopmail | 无 | - |
| ntp | 无 | - |
| smmsp | 无 | - |
| guest | 无 | - |
| nobody | 无 | - |
| 用户 | 初始密码 | 密码修改方法 |
|---|---|---|
| root | 无 | - |
| daemon | 无 | - |
| bin | 无 | - |
| sys | 无 | - |
| sync | 无 | - |
| games | 无 | - |
| man | 无 | - |
| lp | 无 | - |
| 无 | - | |
| news | 无 | - |
| uucp | 无 | - |
| proxy | 无 | - |
| www-data | 无 | - |
| backup | 无 | - |
| list | 无 | - |
| irc | 无 | - |
| gnats | 无 | - |
| nobody | 无 | - |
| _apt | 无 | - |
表 1 组件在K8s中创建的ServiceAccount列表
| 账号名 | 说明 |
|---|---|
| volcano-controllers | 开源Volcano的controller组件在K8s中创建的用户。 |
| volcano-scheduler | 开源Volcano的scheduler组件在K8s中创建的用户。 |
| ascend-device-plugin-sa-910 | 用YAML启动服务,将会在K8s中创建该用户,不同型号的设备使用的账号名不同。 |
| ascend-device-plugin-sa-310p | 用YAML启动服务,将会在K8s中创建该用户,不同型号的设备使用的账号名不同。 |
| ascend-device-plugin-sa-310 | 用YAML启动服务,将会在K8s中创建该用户,不同型号的设备使用的账号名不同。 |
| ascend-operator-manager | 用YAML启动服务,将会在K8s中创建该用户,如:ascend-operator-v{version}.yaml。 |
| resilience-controller | 建议安全加固启动,使用带without-token的YAML启动服务,在K8s中创建并使用resilience-controller账号,同时为该账号授予适当权限。 |
| noded | 用YAML启动服务,将会在K8s中创建该用户,如:noded-v{version}.yaml。 |
| clusterd | 用YAML启动服务,将会在K8s中创建该用户,如:clusterd-v{version}.yaml。 |
| default | MindCluster组件或开源Volcano部署时,会在K8s中自动创建的用户。 |
mindcluster-deploy开源仓版本说明
mindcluster-deploy为MindCluster集群调度组件的开源仓库,仓库提供MindCluster示例代码和脚本仅供参考,不能用于生产环境。
代码仓版本配套关系说明如下:
表 1 mindcluster-deploy代码仓版本配套说明
| MindCluster版本 | mindcluster-deploy仓配套分支 |
|---|---|
| 26.0.0 | branch_v26.0.0 |
| 7.3.0 | branch_v7.3.0 |
| 7.2.RC1 | branch_v7.2.RC1 |
| 7.1.RC1 | branch_v7.1.RC1 |
| 7.0.RC1 | branch_v7.0.0-RC1 |
| 6.0.0 | branch_v6.0.0 |
| 6.0.RC3 | branch_v6.0.0-RC3 |
| 6.0.RC2 | branch_v6.0.0-RC2 |
| 6.0.RC1,5.0.1,5.0.0,3.0.0 | branch_v6.0.0-RC1 |
进程级在线恢复验证
本章节通过在训练代码中打桩构造片上内存的UCE故障,指导用户完成进程级在线恢复验证的适配步骤。
Note
- 本章节相关修改仅用于指导用户在测试环境下验证进程级在线恢复功能,切勿将此打桩版本上线到生产环境。
- 配置本章节步骤前,请确保训练能正常拉起并已配置进程级在线恢复。
- 为保证进程级在线恢复功能的正常使用,请将K8s集群master节点与worker节点的时钟保持一致。
- 下文中代码可能与实际版本存在差异,请以实际版本代码为准。
MindCluster适配
-
mkdir -p /data/atlas_dls/public/code cd /data/atlas_dls/public/code git clone https://gitcode.com/Ascend/mind-cluster.git cd ./mind-cluster/component/clusterd git checkout v26.0.0 # v26.0.0是代码仓版本tag,请自行切换到目标版本 -
修改ClusterD代码。
-
打开“pkg/application/faultmanager/jobprocess/faultrank/job_fault_rank_processor.go”文件。
vi pkg/application/faultmanager/jobprocess/faultrank/job_fault_rank_processor.go -
按“i”进入编辑模式,添加如下加粗代码。
package faultrank import ( … "clusterd/pkg/domain/faultdomain/collector" … ) … func (processor *jobRankFaultInfoProcessor) findFaultRankForJob( … if deviceDetail, ok := processor.retryInBusinessPlane(podInfo.jobId, nodeName, deviceName); ok { faultRankList = append(faultRankList, constant.FaultRank{RankId: deviceInfo.RankID, PodUid: podUid, PodRank: podRankStr, FaultCode: faultdomain.GetRetryCodeByFaultType(deviceDetail.FaultType), FaultLevel: constant.RestartBusiness, DoStepRetry: processor.canDoStepRetry(podInfo.jobId, nodeName, deviceName), DeviceId: deviceInfo.DeviceID, }) collector.ReportInfoCollector.ReportRetryInfo(podInfo.jobId, deviceInfo.RankID, constant.JobNotRecover, constant.UceFaultType) // 业务面故障时间设置为无效时间,避免单次故障重复触发进程级在线恢复 } … -
按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
-
-
cd ./build/ chmod +x build.sh && dos2unix build.sh sed -i 's|build_version="v[^"]\+"|build_version="xxx"|g' build.sh # xxx替换为版本号,如v26.0.0 sed -i 's|export CGO_ENABLED=0|export CGO_ENABLED=1|g' build.sh # 开启CGO功能 ./build.sh # 编译ClusterD,需要go 1.21及以上版本,建议使用1.21版本编译成功后,会在“../output/”目录下生成相关文件,可执行如下命令进行查看:
ll ../output/回显示例如下:
-r-x------. 1 root root 45891128 Aug 13 10:52 clusterd -r--------. 1 root root 4021 Aug 13 10:52 clusterd-v26.0.0.yaml -r--------. 1 root root 946 Aug 13 10:52 Dockerfile -r--------. 1 root root 209 Aug 13 10:52 faultDuration.json -r--------. 1 root root 207 Aug 13 10:52 fdConfig.yaml -r--------. 1 root root 467 Aug 13 10:52 publicFaultConfiguration.json -r--------. 1 root root 756 Aug 13 10:52 relationFaultCustomization.json -
cd ../output/ docker build --no-cache -t clusterd:{tag} ./ # {tag}与步骤3中build_version="xxx"的取值保持一致 -
(可选)保存镜像,并将保存后的镜像文件和clusterd-{tag}.yaml文件上传到主节点。若步骤1到步骤4在主节点执行,可跳过该步骤。
docker save -o clusterd.tar clusterd:{tag} # 保存镜像 docker load -i clusterd.tar # 在主节点导入镜像 -
在主节点重新拉起ClusterD。
kubectl delete -f clusterd-{tag}.yaml # 删除旧ClusterD容器 kubectl apply -f clusterd-{tag}.yaml # 拉起新容器
脚本适配
PyTorch场景适配示例(基于MindSpeed-LLM)
-
搭建训练环境,拉起训练,详细请参见PyTorch场景适配示例(基于MindSpeed-LLM)。
-
开启进程级在线恢复,详细请参见配置进程级在线恢复。
-
在“QWEN3_for_PyTorch_2.7_code/mindspeed_llm/training/training.py”代码中增加如下加粗内容,打桩注入故障,新增代码根据环境变量“RAISE_UCE_ERROR_STEP_AND_RANK”获取注入故障迭代位置和故障rank信息。
import os import ast … GLB_CNT = 0 def train(forward_step_func, model, optimizer, opt_param_scheduler, train_data_iterator, valid_data_iterator, process_non_loss_data_func, config): """Train the model function.""" args = get_args() timers = get_timers() … while iteration < args.train_iters: … num_microbatches = get_num_microbatches() update_num_microbatches(args.consumed_train_samples, consistency_check=True) global GLB_CNT cur_rank = torch.distributed.get_rank() uce_env = os.getenv("RAISE_UCE_ERROR_STEP_AND_RANK", "{}") uce_step_rank = ast.literal_eval(uce_env) if iteration in uce_step_rank and cur_rank == uce_step_rank[iteration] and GLB_CNT < iteration: GLB_CNT = iteration print(f"############# rank:{cur_rank} start UCE error #############") raise RuntimeError('UCE ERROR') args.curr_iteration = iteration … -
修改启动脚本“QWEN3_for_PyTorch_2.7_code/scripts/train_start.sh”。
… export RAISE_UCE_ERROR_STEP_AND_RANK="{3:1,10:2}" # 配置故障注入的迭代和卡号,在第3个迭代的rank 1卡和第10个迭代的rank 2卡上注入UCE故障 sed -i 's/check_memory_result = torch_npu.npu.check_uce_in_memory(device)/check_memory_result = ha_constant.UCE_HIGH_LEVEL/g' /job/code/mindspeed_llm/core/high_availability/tft_stop_clean.py #修改PTA接口返回值,将训练代码抛出的异常识别为UCE故障 …
MindSpore场景适配示例(基于MindFormers)
-
搭建训练环境,拉起训练,详细请参见MindSpore场景适配示例(基于MindFormers)。
-
开启进程级在线恢复,详细请参见配置进程级在线恢复。
-
在“QWEN3_for_MS_code/mindformers/core/callback/callback.py”代码中增加如下加粗内容,打桩注入故障。
import json import os ... import ast GLB_CNT = 0 EPOCH_CNT = 0 ... def print_output_info(self, cb_params, cur_epoch_num, origin_epochs, throughput, cur_step_num, steps_per_epoch, loss, per_step_seconds, overflow, scaling_sens, time_remain, percent, global_norm): """print output information.""" ... logger.info(" %4.1f%% %s %.5f samples/s/p %s }", percent, show_str, throughput, datetime.timedelta(seconds=int(time_remain))) global GLB_CNT global EPOCH_CNT if EPOCH_CNT < cur_epoch_num: GLB_CNT = 0 EPOCH_CNT = cur_epoch_num uce_env = os.getenv("RAISE_UCE_ERROR_STEP_AND_RANK", "{}") uce_step_rank = ast.literal_eval(uce_env) if cur_step_num in uce_step_rank and get_rank() == uce_step_rank[cur_step_num] and GLB_CNT < cur_step_num: GLB_CNT = cur_step_num print(f"############# rank:{get_rank()} start UCE error #############") raise RuntimeError('UCEError occured.') if self.tensor_writer is not None: ... -
修改启动脚本“QWEN3_for_MS_code/scripts/msrun_launcher.sh”。
… export RAISE_UCE_ERROR_STEP_AND_RANK="{3:1,10:2}" # 配置故障注入的迭代和卡号,在第3个迭代的rank 1卡和第10个迭代的rank 2卡上注入UCE故障 sed -i 's/err_strategy = _get_uce_process_strategy()/err_strategy = "RS_UCE_LOWLEVEL"/g' $(pip3 show mindspore | grep Location | awk -F ' ' '{print $2}')/mindspore/train/callback/_train_fault_tolerance.py #修改UCE处理策略 …
K8s集群基础性能调优
MindCluster集群调度组件是基于K8s生态的功能组件,因此训练任务调度基于K8s平台时才支持使用断点续训。断点续训支持的K8s版本与MindCluster集群调度组件一致,当前为1.17.x~1.34.x(推荐使用1.19.x及以上版本)。
Note
以下配置为万卡集群的推荐配置,实际配置时,请根据集群的规模进行调整。
表 1 配置说明
自定义指标开发
支持通过如下两种方式开发自定义指标。
-
通过文件方式开发自定义指标
用户根据自定义指标文件,创建符合要求的自定义指标文件。启动NPU Exporter时,配置“-textMetricsFilePath”参数,指定该自定义指标文件的路径。详情请参见NPU Exporter启动参数。NPU Exporter会在每个数据采集周期读取自定义指标文件,并将文件内容上报给Prometheus或Telegraf。
开发示例如下:
使用NPU Exporter集成并采集Devkit工具生成的hccs_bandwidth指标,详情请参见NPU Exporter集成Devkit部署指南。关于hccs_bandwidth指标信息的说明请参见HCCS带宽监控。
-
通过插件方式开发自定义指标
用户可通过编写插件的方式自定义指标,使用该插件前,开发者需要自行学习了解cgo、go相关语言特性,并阅读README了解使用方法。
[!NOTICE]
- 自定义的指标不能与已有的指标名重复。
- 开发者需对自定义插件的稳定性负责,确保不引入运行时panic等问题。
- 开发者需要对自定义指标文件格式的正确性负责。

