AIACC-Training提供了统一的启动命令来启动分布式训练,配合环境变量可调节AIACC-Training的性能,为您带来更好的训练体验和更高的训练效率。本文为您介绍AIACC-Training的启动命令和环境变量。
分布式启动方式说明
为了更好地使用AIACC-Training加速分布式训练,Perseusrun提供了统一的分布式启动入口。整合了不同的底层通讯设施和多种训练模式,同时兼容了分布式训练与弹性训练,新旧启动方式升级如下所示:
启动方式如下:
单机
默认使用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,表示不启用检查。 | 暂无。 |
PERSEUS_ALLREDUCE_DTYPE | 选择GPU之间通信的梯度压缩模式:
默认值为0,表示开启Float16压缩。 | 相对于纯Float 32训练,若发现精度降低,建议选择2-混合精度。一般情况下,建议不用设置此值,选择默认的FP16精度压缩。对于启用了AMP的场景,建议选择1(即关闭梯度压缩)。 |
PERSEUS_ALLREDUCE_MODE | 选择节点间的AllReduce通信模式,分为以下两种:
默认为Perseus自动选择。若不设置,Perseus自动选择AllReduce通信模式。 | Perseus会自动选择最优值,一般情况下不建议您手动设置该环境变量值。 |
PERSEUS_ALLREDUCE_STREAMS | 设定多流通信的上限流数。默认值为4,取值范围:[1, 12]。 | 大多数情况下,建议不要设置此值。当同时满足以下两种条件,可以考虑设置更高的流数:
|
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。 | 当使用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时开启离线梯度协商。 |
|
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