AIACC-Training提供了统一的启动命令来启动分布式训练,配合环境变量可调节AIACC-Training的性能。本文将为您介绍AIACC-Training的启动命令和环境变量。

分布式启动方式说明

为了更好地使用AIACC-Training加速分布式训练,Perseusrun提供了统一的分布式启动入口。整合了不同的底层通讯设施和多种训练模式,同时兼容了分布式训练与弹性训练,新旧启动方式升级如下。2022-03-23_16-23-40.png
使用方式如下:
  • 单机
    默认使用gloo的backend,启动命令如下:
    perseusrun -np NP [-H localhost:N] -- COMMAND [ARG [ARG...]]
  • 多机
    以使用MPI为backend的双机为例,启动命令如下:
    perseusrun –-mpi –np NP –H host1:N,host2:N -- COMMAND [ARG [ARG...]]
    以使用gloo为backend的双机为例,启动命令如下:
    perseusrun --gloo –np NP –H host1:N,host2:N -- COMMAND [ARG [ARG...]]
    其中:
    • N为每个机器启动的进程数,一般为该机器的GPU个数。
    • NP为总的启动进程数,NP=N*{机器总数}。
    • host1、host2...为各个机器的内网IP。
    • COMMAND和ARG为您训练程序的Python命令及参数。
    如果需要了解更多功能,请执行perseusrun -h获取详细介绍。
示例代码如下:
# 启动单机-8进程训练,使用默认的gloo backend
perseusrun -np 8 -H localhost:8 -- python train.py --model resnet50
perseusrun -np 8 -- python train.py --model resnet50

# 启动双机-每机器8进程的训练,并使用mpi作为通信backend
perseusrun –-mpi –np 16 –H host1:8,host2:8 -- python train.py --model resnet50

# 启动四机-每机器8进程的训练,并使用gloo作为通信backend
perseusrun –-gloo –np 32 –H host1:8,host2:8,host3:8,host4:8 -- python train.py --model resnet50

环境变量说明

默认情况下,您无需设定任何环境变量。如果您需要通过配置环境变量改变AIACC-Training的默认行为,可以参考本文进行设定。

Perseus配置开关 功能描述 建议
PERSEUS_ALLREDUCE_NANCHECK 检查梯度值是否设置为NaN的开关。
  • 0:关闭此功能。
  • 1:开启运行时NaN检查。
默认值为0,表示不启用检查。
暂无。
PERSEUS_ALLREDUCE_DTYPE 选择GPU之间通信的梯度压缩模式:
  • 0:开启Float16的梯度压缩。
  • 1:关闭梯度压缩。
  • 2:混合精度,节点内不压缩梯度,节点间采用Float16。
默认值为0,表示开启Float16压缩。
相对于纯Float32训练,若发现精度降低,建议选择2-混合精度。一般状况,建议不用设置此值,选择默认fp16精度压缩。对于启用了AMP的场景,建议选择1-关闭梯度压缩。
PERSEUS_ALLREDUCE_MODE 选择节点间的AllReduce通信模式,分为以下两种:
  • 0:所有节点采用一层AllReduce进行通信。
  • 1:若存在多节点,每节点多卡,会做两级通信,节点内部先reduce到一张卡上,然后每个节点一张卡参与第二级通信。
默认为Perseus自动选择。若不设置,Perseus自动选择AllReduce通信模式。
Perseus会自动选择最优值,一般情况下不建议您手动设置该环境变量值。
PERSEUS_ALLREDUCE_STREAMS 设定多流通信的上限流数。默认值为4,取值范围:[1, 12]。 大多数情况下,建议不要设置此值。当同时满足以下两种条件,可以考虑设置更高的流数:
  1. 带宽较高,例如GPU计算型实例规格族gn6v,带宽为32 Gbit/s,或者在SCC网络下采用tcp通信方式。
  2. 每张卡有超过200 MB以上空闲显存,若显存富裕,性能的可扩展性不及预期,可适当增大流数至8。
PERSEUS_ALLREDUCE_FUSION 设定梯度融合粒度。以设定值16为例,梯度融合粒度为所有梯度总和的1/16,参数范围:[0, 128],无默认值,此时AIACC会自动设置最优值。 建议不要设置此值。
PERSEUS_ACCUMULATE_N_STEPS(1.3.0+) 设置本地梯度累积的步数,即通过multistep方法(多步累计的方法)实现local gradient accumulate。默认值为1, 可设置为2、4、8等值。 需要大batch size而显存不足的情况,可以通过本地累积梯度实现大batch size;或希望降低通信量时,可利用该功能模拟扩大n倍batch size并保持同等的epoch数,通信量将降至1/n。
说明 local gradient accumulate相当于增大训练的batch size,超参如学习率等需要适配该大batch size。
PERSEUS_DOWNSAMPLE_N_ELEMENTS(1.3.0+) 设置梯度采用gossip压缩方式的粒度,可设置为2、4、8等值,默认值为1。 gossip压缩可使用于step size数值大的情况,能够减少梯度的通信规模。在imagenet/resnet50 8*64 batch size下设置为2/4/8均能保证精度,同时通信量降低50%/75%/87.5%。
PERSEUS_GRADIENT_MOMENTUM(1.3.0+) 设置梯度的momentum值,与PERSEUS_DOWNSAMPLE_N_ELEMENTS一起使用,默认值为1。 在imagenet训练中使用MomentumSGD(训练优化器)时,建议设置为0.9。
PERSEUS_NCCL_ENABLE(特殊版本)
  • 0:关闭NCCL混合链路支持。
  • 1:启用NCCL混合链路支持。
默认值为0。
当使用SCC机型时,可以启用此feature,在训练时同时使用RDMA链路与VPC链路,达到带宽叠加的效果,详细使用方式,请提交工单获取支持。
PERSEUS_ALLREDUCE_GRADIENT_SCALE(1.3.0+) 设置梯度scale系数,默认值为10。

仅当PERSEUS_ALLREDUCE_DTYPE取值为0或者2时生效。

当通信环节存在FP32到FP16精度压缩,即PERSEUS_ALLREDUCE_DTYPE 为0或者2时,此参数生效。从FP32到FP16的转换时会乘以此系数,反向则除以此系数。若初始loss值过大导致出现NaN,需要降低此值。
PERSEUS_OFFLINE_NEG(1.3.2+) 设置离线梯度协商模式,默认为0。设置为1时开启离线梯度协商。
  • 对于TensorFlow的部分模型,若模型参数个数较多,扩展性不佳,建议enable此选项。
  • 对于其他框架,仅当大量采用syncbn layer时需要开启此选项。
  • 所有其它情况,建议保持关闭。
PERSEUS_PERF_CHECK_N_STEPS(1.3.2+) 设置异常性能检查频次,默认值为0,表示不开启。 PERSEUS_PERF_CHECK_N_STEPS=100表示每隔100个step启动一次异常检测,若出现GPU卡异常,会在终端打印出性能异常的卡的信息。
注意 该功能与TensorFlow xla不兼容,请勿在xla环境下开启。
PERSEUS_MASTER_PORT(1.5.0+) 设置启动master的端口号,默认为6666。

仅当PyTorch launcher启动DDP训练时生效。

默认PyTorch训练时会启动一个rendezvous服务,AIACC会启动一个类似的rendezvous服务,因为两者共用同一台master_addr地址,您只需保证两者端口号不同即可。
PERSEUS_NCCL_NETWORK_INTERFACE(1.5.0+) 设置nccl通信使用的网卡信息,默认为eth0。 如有特殊网卡配置,可以根据实际情况进行调整。
PERSEUS_GLOO_NETWORK_INTERFACE(1.5.0+) 设置gloo通信使用的网卡信息,默认为eth0。 如有特殊网卡配置,可以根据实际情况进行调整。
GLOO_TIMEOUT_SECONDS(1.4.0+) 设置gloo通信的超时时间,以秒为单位,默认为60。 如果有复杂逻辑或者网络环境问题导致hang的发生,可以增大该超时参数。
PERSEUS_CHANGE_HVD_ALLGATHER(1.5.0+) 设置Allgather的计算模式,默认为0,兼容DDP/mpi4py的方式。若设置为1,则为horovod的实现方式。

示例:

输入为2个tensor:

tensor1=[0,0],tensor2=[1,1]

使用参数0则输出为tensor([[0,0], [1,1]])。

使用参数1则输出为tensor([0,0,1,1])。

在使用PyTorch原始DDP训练时,使用默认即可,在horovod实现的时候,可以考虑设置为1进行切换。对应在PyTorch上的syncbn的实现也会不同,性能会有少许差异。
PERSEUS_USE_DDP_LAUNCHER(1.5.0+) 设置PyTorch DDP训练的模式切换,默认为1,兼容DDP原始的launcher启动方式。若设置为0,则修改为horovod的mpirun启动方式。 在使用PyTorch原始DDP训练时使用默认即可,在horovod实现的时候,需要设置为0进行切换。
环境变量可以加在启动命令perseusrun之前,例如开启混合精度并设置梯度scale系数为5,示例命令如下:
PERSEUS_ALLREDUCE_DTYPE=2 PERSEUS_ALLREDUCE_GRADIENT_SCALE=5 perseusrun xxx