文档

启动方式与环境变量说明

更新时间:

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压缩。

相对于纯Float 32训练,若发现精度降低,建议选择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_DTYP为0或者2时,此参数生效。从FP32到FP16的转换时会乘以此系数,反向则除以此系数。若初始loss值过大导致出现NaN,需要降低此值。

PERSEUS_OFFLINE_NEG(1.3.2+)

设置离线梯度协商模式,默认为0。设置为1时开启离线梯度协商。

  • 对于TensorFlow的部分模型,若模型参数个数较多,扩展性不佳,建议启用此选项。

  • 对于其他框架,仅当大量采用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
  • 本页导读 (1)