Skip to content

Commit f2e92a4

Browse files
committed
Add auto layout to classification, detection and segmentation scripts
Signed-off-by: Serge Panev <[email protected]>
1 parent 52ead50 commit f2e92a4

File tree

6 files changed

+45
-7
lines changed

6 files changed

+45
-7
lines changed

Diff for: scripts/classification/imagenet/train_imagenet.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ def parse_args():
107107
help='whether to use group norm.')
108108
parser.add_argument('--amp', action='store_true',
109109
help='Use MXNet AMP for mixed precision training.')
110+
parser.add_argument('--auto-layout', action='store_true',
111+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
110112
opt = parser.parse_args()
111113
return opt
112114

@@ -124,8 +126,10 @@ def main():
124126

125127
logger.info(opt)
126128

129+
assert not opt.auto_layout or opt.amp, "--auto-layout needs to be used with --amp"
130+
127131
if opt.amp:
128-
amp.init()
132+
amp.init(layout_optimization=opt.auto_layout)
129133

130134
batch_size = opt.batch_size
131135
classes = 1000

Diff for: scripts/detection/faster_rcnn/train_faster_rcnn.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ def parse_args():
121121
help='Whether to use static memory allocation. Memory usage will increase.')
122122
parser.add_argument('--amp', action='store_true',
123123
help='Use MXNet AMP for mixed precision training.')
124+
parser.add_argument('--auto-layout', action='store_true',
125+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
124126
parser.add_argument('--horovod', action='store_true',
125127
help='Use MXNet Horovod for distributed training. Must be run with OpenMPI. '
126128
'--gpus is ignored when using --horovod.')
@@ -571,8 +573,10 @@ def train(net, train_data, val_data, eval_metric, batch_size, ctx, args):
571573
# fix seed for mxnet, numpy and python builtin random generator.
572574
gutils.random.seed(args.seed)
573575

576+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
577+
574578
if args.amp:
575-
amp.init()
579+
amp.init(layout_optimization=args.auto_layout)
576580

577581
# training contexts
578582
if args.horovod:

Diff for: scripts/detection/ssd/train_ssd.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ def parse_args():
8989
'Currently supports only COCO.')
9090
parser.add_argument('--amp', action='store_true',
9191
help='Use MXNet AMP for mixed precision training.')
92+
parser.add_argument('--auto-layout', action='store_true',
93+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
9294
parser.add_argument('--horovod', action='store_true',
9395
help='Use MXNet Horovod for distributed training. Must be run with OpenMPI. '
9496
'--gpus is ignored when using --horovod.')
@@ -360,8 +362,10 @@ def train(net, train_data, val_data, eval_metric, ctx, args):
360362
if __name__ == '__main__':
361363
args = parse_args()
362364

365+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
366+
363367
if args.amp:
364-
amp.init()
368+
amp.init(layout_optimization=args.auto_layout)
365369

366370
if args.horovod:
367371
hvd.init()

Diff for: scripts/detection/yolo/train_yolo3.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ def parse_args():
9797
parser.add_argument('--label-smooth', action='store_true', help='Use label smoothing.')
9898
parser.add_argument('--amp', action='store_true',
9999
help='Use MXNet AMP for mixed precision training.')
100+
parser.add_argument('--auto-layout', action='store_true',
101+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
100102
parser.add_argument('--horovod', action='store_true',
101103
help='Use MXNet Horovod for distributed training. Must be run with OpenMPI. '
102104
'--gpus is ignored when using --horovod.')
@@ -325,8 +327,10 @@ def train(net, train_data, val_data, eval_metric, ctx, args):
325327
if __name__ == '__main__':
326328
args = parse_args()
327329

330+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
331+
328332
if args.amp:
329-
amp.init()
333+
amp.init(layout_optimization=args.auto_layout)
330334

331335
if args.horovod:
332336
if hvd is None:

Diff for: scripts/instance/mask_rcnn/train_mask_rcnn.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ def parse_args():
124124
help='Whether to use static memory allocation. Memory usage will increase.')
125125
parser.add_argument('--amp', action='store_true',
126126
help='Use MXNet AMP for mixed precision training.')
127+
parser.add_argument('--auto-layout', action='store_true',
128+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
127129
parser.add_argument('--horovod', action='store_true',
128130
help='Use MXNet Horovod for distributed training. Must be run with OpenMPI. '
129131
'--gpus is ignored when using --horovod.')
@@ -621,8 +623,10 @@ def train(net, train_data, val_data, eval_metric, batch_size, ctx, logger, args)
621623
# fix seed for mxnet, numpy and python builtin random generator.
622624
gutils.random.seed(args.seed)
623625

626+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
627+
624628
if args.amp:
625-
amp.init()
629+
amp.init(layout_optimization=args.auto_layout)
626630

627631
# training contexts
628632
if args.horovod:

Diff for: scripts/segmentation/train.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import mxnet as mx
99
from mxnet import gluon, autograd
1010
from mxnet.gluon.data.vision import transforms
11+
from mxnet.contrib import amp
1112

1213
import gluoncv
1314
gluoncv.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

282297
if __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

Comments
 (0)