Skip to content

Commit a90357b

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

File tree

6 files changed

+44
-7
lines changed

6 files changed

+44
-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

+19-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')
@@ -93,6 +94,11 @@ def parse_args():
9394
# synchronized Batch Normalization
9495
parser.add_argument('--syncbn', action='store_true', default=False,
9596
help='using Synchronized Cross-GPU BatchNorm')
97+
# performance related
98+
parser.add_argument('--amp', action='store_true',
99+
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`.')
96102
# the parser
97103
args = parser.parse_args()
98104

@@ -200,7 +206,11 @@ def __init__(self, args, logger):
200206
v.wd_mult = 0.0
201207

202208
self.optimizer = gluon.Trainer(self.net.module.collect_params(), 'sgd',
203-
optimizer_params, kvstore=kv)
209+
optimizer_params, kvstore=(False if args.amp else None))
210+
211+
212+
if args.amp:
213+
amp.init_trainer(trainer)
204214
# evaluation metrics
205215
self.metric = gluoncv.utils.metrics.SegmentationMetric(trainset.num_class)
206216

@@ -212,7 +222,11 @@ def training(self, epoch):
212222
outputs = self.net(data.astype(args.dtype, copy=False))
213223
losses = self.criterion(outputs, target)
214224
mx.nd.waitall()
215-
autograd.backward(losses)
225+
if args.amp:
226+
with amp.scale_loss(losses, self.optimizer) as scaled_losses:
227+
autograd.backward(scaled_losses)
228+
else:
229+
autograd.backward(losses)
216230
self.optimizer.step(self.args.batch_size)
217231
for loss in losses:
218232
train_loss += np.mean(loss.asnumpy()) / len(losses)
@@ -252,7 +266,10 @@ def save_checkpoint(net, args, epoch, mIoU, is_best=False):
252266

253267
if __name__ == "__main__":
254268
args = parse_args()
269+
assert not args.auto_layout or args.amp, "--auto-layout needs to be used with --amp"
255270

271+
if args.amp:
272+
amp.init(layout_optimization=args.auto_layout)
256273
# build logger
257274
filehandler = logging.FileHandler(os.path.join(args.save_dir, args.logging_file))
258275
streamhandler = logging.StreamHandler()

0 commit comments

Comments
 (0)