基于NPU芯片的架构特性,会涉及到混合精度训练,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下优点:
但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况。为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里采用混合精度模块APEX来达到以上效果。混合精度模块APEX是一个集优化性能、精度收敛于一身的综合优化库。
功能 |
开启方式举例 |
描述 |
---|---|---|
O1配置模式 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O1") |
Conv、Matmul等使用float16计算,其他如Softmax、BN使用float32计算。 |
O2配置模式 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O2") |
针对全网中float32数据类型的算子,按照内置优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升性能并减少内存使用。 |
静态Loss Scale功能 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale=128.0) |
静态设置参数确保混合精度训练收敛。 |
动态Loss Scale功能 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale="dynamic") |
动态计算Loss Scale值并判断是否溢出。 |