背景信息
在混合精度中,使用float16类型来替代float32类型存储数据,从而达到减少内存和提高计算速度的效果。但是由于float16类型要比float32类型表示的范围小很多,所以当某些参数(比如说梯度)在训练过程中变得很小时,就会发生数据下溢的情况。LossScale的主要思想是在计算loss时,将loss扩大一定的倍数,由于链式法则的存在,梯度也会相应扩大,然后在优化器更新权重时再缩小相应的倍数,从而避免了数据下溢的情况又不影响计算结果;而使用静态LossScale则是静态缩放更新网络,使用固定的loss scale值;在低阶模型中实现静态loss scale功能时,通常结合TrainOneStepWithLossScaleCell来实现。
在MindSpore中,loss scale的使用方法又分动态loss scale和静态loss scale两种,二者具体区别详见静态LossScale和动态LossScale的区别。
1、示例代码段
**步骤:**在使用静态LossScale功能前,首先要定义一张网络、损失函数、优化器,然后将损失函数融入到神经网络中,再使用静态LossScale功能
from src.new import TrainOneStepWithLossScaleCell
# Define the loss function
loss_function = nn.loss.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
# Define the optimizer
opt = nn.SGD(net.trainable_params(), LR_ORI, MOMENTUM_ORI, WEIGHT_DECAY)
# Bind loss_function to net
model_constructed = BuildTrainNetwork(net, loss_function, TRAIN_BATCH_SIZE, CLASS_NUM)
# Define the Dynamic Loss scale update cell
loss_scale_manager = nn.FixedLossScaleUpdateCell(loss_scale_value=2**12)
# Define Network training with loss scaling
model_constructed = TrainOneStepWithLossScaleCell(network=model_constructed, optimizer=opt, scale_sense=loss_scale_manager)
# Train
train_net(model_constructed, net, loss_function, EPOCH_MAX, TRAIN_PATH, VAL_PATH, TRAIN_BATCH_SIZE, VAL_BATCH_SIZE, REPEAT_SIZE)
2、代码解析
loss_scale_manager = nn.FixedLossScaleUpdateCell(loss_scale_value=2**12)
接口作用:静态scale更新网络,loss scaling 值将不会被更新。
参数详解:
loss_scale_value :
表示初始化的LossScale,float数据类型;
model_constructed = TrainOneStepWithLossScaleCell(network=model_constructed, optimizer=opt, scale_sense=loss_scale_manager)
功能::定义一个静态LossScale的模型控制器,它将网络、优化器和可能的scale 更新网络作为参数。
接口参数详解:
network:
为训练网络,只支持单一输出;
optimizer:
为用户更新权重的优化器;
scale_sense:
为更新逻辑单元。其可为Cell类型或Tensor类型;