混合精度训练是在训练时混合使用单精度(float32)与半精度(float16)数据类型,使用相同的超参数训练,能达到与float32几乎相同的精度。
混合精度适配支持两种方式:
我们推荐用户使用PyTorch框架内置的AMP功能模块来进行混合精度训练,本节将介绍其适配方法,AMP混合精度具体原理与计算过程请参考混合精度原理与计算过程(AMP)。
如果用户想使用APEX模块,可参考APEX。
当前混合精度适配约束如下:
混合精度AMP适配主要包括混合精度amp.autocast()接口与损失缩放amp.GradScaler接口的适配。
对于AMP模块,适配训练脚本后,NPU上可以支持以下4种AMP场景。具体场景说明可以单击对应链接,跳转至PyTorch官网查看。
本节先给出了AMP适配接口(amp.GradScaler)说明,混合精度适配网络样例提供了适配前网络样例,后续章节基于此样例给出了AMP的NPU适配示例代码,以此来介绍混合精度AMP适配方法。
对于amp.GradScaler接口,原生PyTorch默认使用动态损失缩放(Loss Scale),Loss Scale取值会根据训练情况进行动态调整。当前NPU上适配的amp.GradScaler接口增加了dynamic参数。当dynamic参数设置为False时,支持使用固定值的Loss Scale,并且可以通过init_scale参数设置Loss Scale取值,如下所示:
scaler = amp.GradScaler(init_scale = 2.**10, dynamic = False)
参数名称 |
参数说明 |
参数取值 |
---|---|---|
dynamic |
AMP是否使用动态Loss Scale。 |
|
init_scale |
在使用静态Loss Scale时的初始scale系数。 |
仅在dynamic=False时可用,用户根据实际情况设置。 |