88import mxnet as mx
99from mxnet import gluon , autograd
1010from mxnet .gluon .data .vision import transforms
11+ from mxnet .contrib import amp
1112
1213import gluoncv
1314gluoncv .utils .check_version ('0.6.0' )
@@ -99,6 +100,11 @@ def parse_args():
99100 # synchronized Batch Normalization
100101 parser .add_argument ('--syncbn' , action = 'store_true' , default = False ,
101102 help = 'using Synchronized Cross-GPU BatchNorm' )
103+ # performance related
104+ parser .add_argument ('--amp' , action = 'store_true' ,
105+ help = 'Use MXNet AMP for mixed precision training.' )
106+ parser .add_argument ('--auto-layout' , action = 'store_true' ,
107+ help = 'Add layout optimization to AMP. Must be used in addition of `--amp`.' )
102108 # the parser
103109 args = parser .parse_args ()
104110
@@ -229,7 +235,12 @@ def __init__(self, args, logger):
229235 v .wd_mult = 0.0
230236
231237 self .optimizer = gluon .Trainer (self .net .module .collect_params (), args .optimizer ,
232- optimizer_params , kvstore = kv )
238+ optimizer_params , update_on_kvstore = (False if args .amp else None ))
239+
240+
241+ if args .amp :
242+ amp .init_trainer (self .optimizer )
243+
233244 # evaluation metrics
234245 self .metric = gluoncv .utils .metrics .SegmentationMetric (trainset .num_class )
235246
@@ -241,7 +252,11 @@ def training(self, epoch):
241252 outputs = self .net (data .astype (args .dtype , copy = False ))
242253 losses = self .criterion (outputs , target )
243254 mx .nd .waitall ()
244- autograd .backward (losses )
255+ if args .amp :
256+ with amp .scale_loss (losses , self .optimizer ) as scaled_losses :
257+ autograd .backward (scaled_losses )
258+ else :
259+ autograd .backward (losses )
245260 self .optimizer .step (self .args .batch_size )
246261 for loss in losses :
247262 train_loss += np .mean (loss .asnumpy ()) / len (losses )
@@ -281,7 +296,10 @@ def save_checkpoint(net, args, epoch, mIoU, is_best=False):
281296
282297if __name__ == "__main__" :
283298 args = parse_args ()
299+ assert not args .auto_layout or args .amp , "--auto-layout needs to be used with --amp"
284300
301+ if args .amp :
302+ amp .init (layout_optimization = args .auto_layout )
285303 # build logger
286304 filehandler = logging .FileHandler (os .path .join (args .save_dir , args .logging_file ))
287305 streamhandler = logging .StreamHandler ()
0 commit comments