HCCL接口简介
HCCL(Huawei Collective Communication Library)是基于昇腾AI处理器的高性能集合通信库,提供单机多卡、多机多卡集合通信原语,在PCIe、HCCS和RoCE高速链路实现集合通信功能,实现分布式训练。
TF Adapter提供的分布式优化器NPUDistributedOptimizer和npu_distributed_optimizer_wrapper可以让用户在不需要感知allreduce的情况下自动完成梯度聚合功能,实现数据并行训练方式。但为了能够同时满足用户灵活的使用方式,集合通信库HCCL提供了常用的rank管理、梯度切分功能、集合通信原型等接口。
HCCL执行流程
训练场景中,HCCL提供了服务器间高性能集合通信功能,其执行流程如图1所示。
- 通信初始化:获取必要的集合通信配置参数并初始化网络设备。
- 建立通信连接:建立socket连接并交换通信两端的通信参数和内存信息。
建立通信连接阶段,HCCL根据用户提供的集群信息并结合网络拓扑与其他NPU设备建链并交换用于通信的参数信息。如果在建链超时时间阈值(默认120s,可通过环境变量HCCL_CONNECT_TIMEOUT配置)内未得到其他NPU设备的及时响应,会上报建链超时错误并退出训练。
- 执行通信操作:通过Notify同步设备执行状态,传递内存数据。
通信操作执行阶段HCCL会根据通信算法编排NOTIFY/SDMA等任务,并通过runtime下发给昇腾设备任务调度器,设备根据编排信息调度并执行任务。其中Notify类的任务用于卡间同步,Notify wait会阻塞任务流执行直到对应的Notify record到达,以确保后续的通信操作执行时彼此的内存处于ready状态。
单卡问题、通信链路问题均可能会导致集群出现大量的超时错误,在定位集群问题时需要锁定问题出现位置,因此需要收集整个集群的日志信息。
HCCL接口列表
分类 |
接口 |
简介 |
定义文件 |
---|---|---|---|
rank管理 |
create_group |
创建集合通信group。 |
${install_path}/python/site-packages/hccl/manage/api.py |
destroy_group |
销毁集合通信group。 |
||
get_rank_size |
获取group内rank数量(即Device数量)。 |
||
get_local_rank_size |
获取group内device所在服务器内的local rank数量。 |
||
get_rank_id |
获取device在group中对应的rank序号。 |
||
get_local_rank_id |
获取device在group中对应的local rank序号。 |
||
get_world_rank_from_group_rank |
从group rank id,获取该进程对应的world rank id。 |
||
get_group_rank_from_world_rank |
从world rank id,获取该进程在group中的group rank id。 |
||
梯度切分 |
set_split_strategy_by_idx |
基于梯度的索引id,在集合通信group内设置反向梯度切分策略。 |
${install_path}/python/site-packages/hccl/split/api.py |
set_split_strategy_by_size |
基于梯度数据量百分比,在集合通信group内设置反向梯度切分策略。 |
||
集合通信算子 |
allreduce |
提供group内的集合通信allreduce功能,对所有节点的同名张量进行约减。 |
${install_path}/python/site-packages/npu_bridge/hccl/hccl_ops.py |
allgather |
提供group内的集合通信allgather功能,将所有节点的输入Tensor合并起来。 |
||
broadcast |
提供group内的集合通信broadcast功能,将root节点的数据广播到其他rank。 |
||
reduce_scatter |
提供group内的集合通信reducescatter功能。 |
||
send |
提供group内点对点通信发送数据的send功能。 |
||
receive |
提供group内点对点通信发送数据的receive功能。 |
||
reduce |
提供group内的集合通信reduce功能,对所有节点的同名张量进行规约,并将数据输出至root节点。 |
||
alltoallv |
集合通信域alltoallv操作接口。向通信域内所有rank发送数据(数据量可以定制),并从所有rank接收数据。 |
||
alltoallvc |
集合通信域alltoallvc操作接口。向通信域内所有rank发送数据(数据量可以定制),并从所有rank接收数据。 alltoallvc通过输入参数send_count_matrix传入所有rank的收发参数,与alltoallv相比,性能更优。 |
相关概念
概念 |
介绍 |
---|---|
ranktable文件 |
ranktable文件,用于描述参与集合通信的集群信息,包括Server,Device,容器等的组织信息。 |
rank |
rank,指参与集合通信的进程。 |
group |
group,指参与集合通信的进程组,包括:
|
rank size |
|
rank id |
|
梯度切分 |
在训练神经网络的反向计算阶段,将GE优化计算图中多个参数的allreduce融合分段。按梯度产生顺序,逐段进行allreduce更新网络反向计算参数,实现计算资源优化及通信时间与反向计算时间的并行优化。 |