
# 开启超节点HCCL通信算子级重执行机制
#### 场景描述
针对Snt9b23超节点下光模块故障率高的问题，通过在HCCL通信算子级引入重执行机制，提升系统的稳定性和可靠性。
HCCL（Huawei Collective Communication Library，华为集合通信库）是华为专为昇腾（Ascend）AI处理器设计的分布式通信库，旨在优化多设备间的高效协作，以加速深度学习模型的分布式训练，适用于需要大规模算力的AI场景。在分布式训练中，HCCL负责协调多个昇腾处理器之间的数据同步（如梯度聚合、参数更新），减少通信开销，提升训练效率。
#### 约束限制
- 仅Snt9b23超节点支持。
- 开启算子重执行会对性能带来轻微的影响。
- 重执行依赖VPC平面（非参数面）网络进行通信域内状态协商，如果VPC平面不同，则无法重执行。
- 对于HCCS平面，如果链路没有恢复，路由未收敛，则无法重执行。
- 重执行依赖故障发生时一个通信域中所有卡都停在同一通信算子处，否则无法重执行，成功率约为95%。
- 使用inplace方式的通信算子可能导致UserIn数据被污染，从而影响重执行的可靠性。尽管重执行支持约80%通信算子的inplace方式，但对于Torch框架中的all_reduce、all_gather和reduce_scatter等算子，重执行仍不支持其inplace操作。
- RoH/RoCE平面因为闪断或断链触发的借轨，在同一通信域只允许执行一次，且不支持回切。借轨状态下，业务可持续，但应尽快保存checkpoint，维修故障。
- 对于目前昇腾的执行模式，HCCL重执行的支持范围如下：
  表1HCCL重执行的支持范围 
  | 模式  | HCCL通信算子展开方式           | 是否支持                                                                          |
  |:---|:---|:---|
  | 单算子 | Stars                  | 支持                                                                            |
  | 单算子 | FFts+                  | 支持                                                                            |
  | 单算子 | Aicpu展开                | 支持                                                                            |
  | 单算子 | 通信计算融合(mc2)            | 不支持                                                                           |
  | 图模式 | 全下沉模式，通信算子以展开的tasks合入图 | 不支持 全下沉模式，HCCL不参与图执行过程，无法进行重执行 |
  | 图模式 | Aicpu展开                | 支持                                                                            |
     
  
 
#### 原理说明
Snt9b23超节点的连接系统主要包含HCCS平面和RoH/RoCE平面两个数据传输平面。
在HCCS平面中，L1-1520与L2-1520之间采用光互联技术；在RoH/RoCE平面，超出NPU范围的部分均使用光互联。由于电互联域的故障率相对较低，本机制主要针对光互联域的光模块故障进行处理。具体而言：
- HCCS平面L1-1520和L2-1520之间的光模块故障。
- RoH/RoCE平面出Snt9b23超节点的光模块故障。
**HCCS平面**
针对HCCS平面，L1和L2之间的光模块如果发生闪断或断链，1520设备将自动完成路径切换（前提是存在多路径）。然而，断链可能导致丢包，进而引发业务中断。此时，框架层将回退至上一个checkpoint进行断点续训。通过引入HCCL重执行机制，在1520完成路径切换后，重执行功能可有效降低回退至checkpoint进行断点续训的概率，从而进一步提升业务的连续性和可靠性。
**RoH/RoCE平面**
针对RoH/RoCE平面，协议内置传输层重传机制，可对丢包或闪断提供一定的修复能力。然而，该机制的可靠性仍存在局限性。为提升整体可靠性，本功能在HCCL层面引入了一层重执行机制：当检测到闪断持续超过30秒或发生断链时，系统将通过建立新的传输路径（借轨），在算子级启动重执行流程，进一步保障业务的稳定运行。
#### 参数配置（HCCL_OP_RETRY_ENABLE）
环境变量HCCL_OP_RETRY_ENABLE用于配置是否开启HCCL算子的重执行特性。重执行是指当通信算子执行报SDMA或RDMA CQE类型的错误时，HCCL会尝试重新执行此通信算子。通过此特性，可以有效避免硬件闪断导致的通信中断，提升通信稳定性。
支持在以下三个物理层级的通信域中配置重执行特性：
- **L0**：Server内通信域
- **L1**：Server间通信域
- **L2**：超节点间通信域
**配置方法**：
在运行训练任务前，在Server节点中执行以下命令。
```
export HCCL_OP_RETRY_ENABLE="L0:0, L1:1, L2:1"
```
表2参数说明 
| 参数 | 含义         | 取值范围                                                                                                                                                                                                                                                                                                          | 默认值 | 建议取值 |
|:---|:---|:---|:---|:---|
| L0 | Server内通信域 | - 0：Server内通信域的通信任务不开启重执行。  - 1：Server内通信域的通信任务开启重执行。                   | 0   | 0    |
| L1 | Server间通信域 | - 0：Server间通信域的通信任务不开启重执行，默认值为0。  - 1：Server间通信域的通信任务开启重执行。   | 0   | 1    |
| L2 | 超节点间通信域    | - 0：超节点间通信域的通信任务不开启重执行，默认值为0。  - 1：超节点间通信域的通信任务开启重执行。       | 0   | 1    |
   
**注意事项**：
- 当L2配置为1时，超节点间通信支持在某一Device网卡故障时使用备用Device网卡进行通信。备用网卡为同一NPU中的另一个Die网卡。
- 如果通信域的创建方式为"基于ranktable"创建通信域，需要在ranktable文件中通过"backup device ip"参数配置备用网卡。
- 如果通信域的创建方式为"基于root广播式"创建通信域，会自动将同一NPU下的两个Die互为备用网卡，无需手动配置。
 
#### 参数配置（HCCL_OP_RETRY_PARAMS）
环境变量HCCL_OP_RETRY_ENABLE用于配置HCCL算子重执行的具体参数，包括最大重执行次数、第一次重执行的等待时间以及两次重执行的间隔时间。
**配置示例**：
```
export HCCL_OP_RETRY_PARAMS="MaxCnt:3, HoldTime:5000, IntervalTime:1000"
```
表3参数说明 
| 参数           | 含义                         | 类型     | 取值范围         | 默认值  | 单位 | 建议值       |
|:---|:---|:---|:---|:---|:---|:---|
| MaxCnt       | 最大重执行次数                    | uint32 | \[1, 10\]    | 3    | 次  | 保持默认值3    |
| HoldTime     | 从检测到通信算子执行失败到开始第一次重执行的等待时间 | uint32 | \[0, 60000\] | 5000 | ms | 保持默认值5000 |
| IntervalTime | 两次重执行之间的间隔时间               | uint32 | \[0, 60000\] | 1000 | ms | 保持默认值1000 |
   
**使用约束**：
仅当通过HCCL_OP_RETRY_ENABLE环境变量开启了HCCL的重执行特性（任一层级的重执行特性开启即可）时，此环境变量才生效。
