Skip to content

Commit 5682d9a

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

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
@@ -108,6 +108,8 @@ def parse_args():
108108
help='whether to use group norm.')
109109
parser.add_argument('--amp', action='store_true',
110110
help='Use MXNet AMP for mixed precision training.')
111+
parser.add_argument('--auto-layout', action='store_true',
112+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
111113
opt = parser.parse_args()
112114
return opt
113115

@@ -125,8 +127,10 @@ def main():
125127

126128
logger.info(opt)
127129

130+
assert not opt.auto_layout or opt.amp, "--auto-layout needs to be used with --amp"
131+
128132
if opt.amp:
129-
amp.init()
133+
amp.init(layout_optimization=opt.auto_layout)
130134

131135
batch_size = opt.batch_size
132136
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.')
@@ -622,8 +624,10 @@ def train(net, train_data, val_data, eval_metric, batch_size, ctx, args):
622624
# fix seed for mxnet, numpy and python builtin random generator.
623625
gutils.random.seed(args.seed)
624626

627+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
628+
625629
if args.amp:
626-
amp.init()
630+
amp.init(layout_optimization=args.auto_layout)
627631

628632
# training contexts
629633
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.')
@@ -700,8 +702,10 @@ def train(net, train_data, val_data, eval_metric, batch_size, ctx, logger, args)
700702
# fix seed for mxnet, numpy and python builtin random generator.
701703
gutils.random.seed(args.seed)
702704

705+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
706+
703707
if args.amp:
704-
amp.init()
708+
amp.init(layout_optimization=args.auto_layout)
705709

706710
# training contexts
707711
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')
@@ -95,6 +96,11 @@ def parse_args():
9596
# synchronized Batch Normalization
9697
parser.add_argument('--syncbn', action='store_true', default=False,
9798
help='using Synchronized Cross-GPU BatchNorm')
99+
# performance related
100+
parser.add_argument('--amp', action='store_true',
101+
help='Use MXNet AMP for mixed precision training.')
102+
parser.add_argument('--auto-layout', action='store_true',
103+
help='Add layout optimization to AMP. Must be used in addition of `--amp`.')
98104
# the parser
99105
args = parser.parse_args()
100106

@@ -210,7 +216,12 @@ def __init__(self, args, logger):
210216
v.wd_mult = 0.0
211217

212218
self.optimizer = gluon.Trainer(self.net.module.collect_params(), args.optimizer,
213-
optimizer_params, kvstore=kv)
219+
optimizer_params, kvstore=(False if args.amp else None))
220+
221+
222+
if args.amp:
223+
amp.init_trainer(trainer)
224+
214225
# evaluation metrics
215226
self.metric = gluoncv.utils.metrics.SegmentationMetric(trainset.num_class)
216227

@@ -222,7 +233,11 @@ def training(self, epoch):
222233
outputs = self.net(data.astype(args.dtype, copy=False))
223234
losses = self.criterion(outputs, target)
224235
mx.nd.waitall()
225-
autograd.backward(losses)
236+
if args.amp:
237+
with amp.scale_loss(losses, self.optimizer) as scaled_losses:
238+
autograd.backward(scaled_losses)
239+
else:
240+
autograd.backward(losses)
226241
self.optimizer.step(self.args.batch_size)
227242
for loss in losses:
228243
train_loss += np.mean(loss.asnumpy()) / len(losses)
@@ -262,7 +277,10 @@ def save_checkpoint(net, args, epoch, mIoU, is_best=False):
262277

263278
if __name__ == "__main__":
264279
args = parse_args()
280+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
265281

282+
if args.amp:
283+
amp.init(layout_optimization=args.auto_layout)
266284
# build logger
267285
filehandler = logging.FileHandler(os.path.join(args.save_dir, args.logging_file))
268286
streamhandler = logging.StreamHandler()

0 commit comments

Comments
 (0)