From d89f57a29b3111ac67f0fea1c21f7a546e4320ac Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Wed, 27 Apr 2022 14:36:48 +0100 Subject: [PATCH 01/12] Add shufflenetv2 1.5 and 2.0 weights --- torchvision/models/shufflenetv2.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/torchvision/models/shufflenetv2.py b/torchvision/models/shufflenetv2.py index 68243e06e8f..c4389e3c9f8 100644 --- a/torchvision/models/shufflenetv2.py +++ b/torchvision/models/shufflenetv2.py @@ -223,11 +223,37 @@ class ShuffleNet_V2_X1_0_Weights(WeightsEnum): class ShuffleNet_V2_X1_5_Weights(WeightsEnum): - pass + IMAGENET1K_V1 = Weights( + url="https://download.pytorch.org/models/shufflenetv2_x1_5-3c479a10.pth", + transforms=partial(ImageClassification, crop_size=224), + meta={ + **_COMMON_META, + # TODO: Change recipe + "num_params": 3503624, + "metrics": { + "acc@1": 72.784, + "acc@5": 91.058, + }, + }, + ) + DEFAULT = IMAGENET1K_V1 class ShuffleNet_V2_X2_0_Weights(WeightsEnum): - pass + IMAGENET1K_V1 = Weights( + url="https://download.pytorch.org/models/shufflenetv2_x2_0-8be3c8ee.pth", + transforms=partial(ImageClassification, crop_size=224), + meta={ + **_COMMON_META, + # TODO: Change recipe + "num_params": 7393996, + "metrics": { + "acc@1": 76.230, + "acc@5": 93.006, + }, + }, + ) + DEFAULT = IMAGENET1K_V1 @handle_legacy_interface(weights=("pretrained", ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1)) From c0516e73b4338d564461d2ce4f987cc89baf335c Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Wed, 27 Apr 2022 17:42:30 +0100 Subject: [PATCH 02/12] Update recipe --- torchvision/models/shufflenetv2.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/torchvision/models/shufflenetv2.py b/torchvision/models/shufflenetv2.py index c4389e3c9f8..d5cb76dfec5 100644 --- a/torchvision/models/shufflenetv2.py +++ b/torchvision/models/shufflenetv2.py @@ -228,7 +228,7 @@ class ShuffleNet_V2_X1_5_Weights(WeightsEnum): transforms=partial(ImageClassification, crop_size=224), meta={ **_COMMON_META, - # TODO: Change recipe + "recipe": "https://github.com/pytorch/vision/pull/5906", "num_params": 3503624, "metrics": { "acc@1": 72.784, @@ -245,11 +245,11 @@ class ShuffleNet_V2_X2_0_Weights(WeightsEnum): transforms=partial(ImageClassification, crop_size=224), meta={ **_COMMON_META, - # TODO: Change recipe + "recipe": "https://github.com/pytorch/vision/pull/5906", "num_params": 7393996, "metrics": { - "acc@1": 76.230, - "acc@5": 93.006, + "acc@1": 76.200, + "acc@5": 92.888, }, }, ) From de2cf451f188f7cc092b96206875c2c28794824e Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Wed, 27 Apr 2022 17:49:44 +0100 Subject: [PATCH 03/12] Add to docs --- docs/source/models.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/models.rst b/docs/source/models.rst index 51881e505e4..aeb23d57581 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -176,8 +176,10 @@ Densenet-201 76.896 93.370 Densenet-161 77.138 93.560 Inception v3 77.294 93.450 GoogleNet 69.778 89.530 -ShuffleNet V2 x1.0 69.362 88.316 ShuffleNet V2 x0.5 60.552 81.746 +ShuffleNet V2 x1.0 69.362 88.316 +ShuffleNet V2 x1.5 72.784 91.058 +ShuffleNet V2 x2.0 76.200 92.888 MobileNet V2 71.878 90.286 MobileNet V3 Large 74.042 91.340 MobileNet V3 Small 67.668 87.402 From 5487b236fa236b8f06fda21fa1b27fe7e636d732 Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Wed, 27 Apr 2022 21:14:06 +0000 Subject: [PATCH 04/12] Use resize_size=232 for eval and update the result --- docs/source/models.rst | 4 ++-- torchvision/models/shufflenetv2.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/source/models.rst b/docs/source/models.rst index aeb23d57581..447b758e2f4 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -178,8 +178,8 @@ Inception v3 77.294 93.450 GoogleNet 69.778 89.530 ShuffleNet V2 x0.5 60.552 81.746 ShuffleNet V2 x1.0 69.362 88.316 -ShuffleNet V2 x1.5 72.784 91.058 -ShuffleNet V2 x2.0 76.200 92.888 +ShuffleNet V2 x1.5 72.996 91.086 +ShuffleNet V2 x2.0 76.230 93.006 MobileNet V2 71.878 90.286 MobileNet V3 Large 74.042 91.340 MobileNet V3 Small 67.668 87.402 diff --git a/torchvision/models/shufflenetv2.py b/torchvision/models/shufflenetv2.py index d5cb76dfec5..5e58c489ee0 100644 --- a/torchvision/models/shufflenetv2.py +++ b/torchvision/models/shufflenetv2.py @@ -225,14 +225,14 @@ class ShuffleNet_V2_X1_0_Weights(WeightsEnum): class ShuffleNet_V2_X1_5_Weights(WeightsEnum): IMAGENET1K_V1 = Weights( url="https://download.pytorch.org/models/shufflenetv2_x1_5-3c479a10.pth", - transforms=partial(ImageClassification, crop_size=224), + transforms=partial(ImageClassification, crop_size=224, resize_size=232), meta={ **_COMMON_META, "recipe": "https://github.com/pytorch/vision/pull/5906", "num_params": 3503624, "metrics": { - "acc@1": 72.784, - "acc@5": 91.058, + "acc@1": 72.996, + "acc@5": 91.086, }, }, ) @@ -242,14 +242,14 @@ class ShuffleNet_V2_X1_5_Weights(WeightsEnum): class ShuffleNet_V2_X2_0_Weights(WeightsEnum): IMAGENET1K_V1 = Weights( url="https://download.pytorch.org/models/shufflenetv2_x2_0-8be3c8ee.pth", - transforms=partial(ImageClassification, crop_size=224), + transforms=partial(ImageClassification, crop_size=224, resize_size=232), meta={ **_COMMON_META, "recipe": "https://github.com/pytorch/vision/pull/5906", "num_params": 7393996, "metrics": { - "acc@1": 76.200, - "acc@5": 92.888, + "acc@1": 76.230, + "acc@5": 93.006, }, }, ) From 906fa3024f685ef3806d9ef223381488b3036596 Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Wed, 27 Apr 2022 22:57:28 +0000 Subject: [PATCH 05/12] Add quantized shufflenetv2 large --- .../models/quantization/shufflenetv2.py | 90 ++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/torchvision/models/quantization/shufflenetv2.py b/torchvision/models/quantization/shufflenetv2.py index 44e7772aa37..19d004b48ae 100644 --- a/torchvision/models/quantization/shufflenetv2.py +++ b/torchvision/models/quantization/shufflenetv2.py @@ -10,7 +10,7 @@ from .._api import WeightsEnum, Weights from .._meta import _IMAGENET_CATEGORIES from .._utils import handle_legacy_interface, _ovewrite_named_param -from ..shufflenetv2 import ShuffleNet_V2_X0_5_Weights, ShuffleNet_V2_X1_0_Weights +from ..shufflenetv2 import ShuffleNet_V2_X0_5_Weights, ShuffleNet_V2_X1_0_Weights, ShuffleNet_V2_X1_5_Weights, ShuffleNet_V2_X2_0_Weights from .utils import _fuse_modules, _replace_relu, quantize_model @@ -18,8 +18,12 @@ "QuantizableShuffleNetV2", "ShuffleNet_V2_X0_5_QuantizedWeights", "ShuffleNet_V2_X1_0_QuantizedWeights", + "ShuffleNet_V2_X1_5_QuantizedWeights", + "ShuffleNet_V2_X2_0_QuantizedWeights", "shufflenet_v2_x0_5", "shufflenet_v2_x1_0", + "shufflenet_v2_x1_5", + "shufflenet_v2_x2_0", ] @@ -143,6 +147,42 @@ class ShuffleNet_V2_X1_0_QuantizedWeights(WeightsEnum): DEFAULT = IMAGENET1K_FBGEMM_V1 +class ShuffleNet_V2_X1_5_QuantizedWeights(WeightsEnum): + IMAGENET1K_FBGEMM_V1 = Weights( + url="https://download.pytorch.org/models/quantized/shufflenetv2_x1_5_fbgemm-d7401f05.pth", + transforms=partial(ImageClassification, crop_size=224, resize_size=232), + meta={ + **_COMMON_META, + "recipe": "https://github.com/pytorch/vision/pull/5906", + "num_params": 3503624, + "unquantized": ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1, + "metrics": { + "acc@1": 72.052, + "acc@5": 90.700, + }, + }, + ) + DEFAULT = IMAGENET1K_FBGEMM_V1 + + +class ShuffleNet_V2_X2_0_QuantizedWeights(WeightsEnum): + IMAGENET1K_FBGEMM_V1 = Weights( + url="https://download.pytorch.org/models/quantized/shufflenetv2_x2_0_fbgemm-5cac526c.pth", + transforms=partial(ImageClassification, crop_size=224, resize_size=232), + meta={ + **_COMMON_META, + "recipe": "https://github.com/pytorch/vision/pull/5906", + "num_params": 7393996, + "unquantized": ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1, + "metrics": { + "acc@1": 75.354, + "acc@5": 92.488, + }, + }, + ) + DEFAULT = IMAGENET1K_FBGEMM_V1 + + @handle_legacy_interface( weights=( "pretrained", @@ -205,3 +245,51 @@ def shufflenet_v2_x1_0( return _shufflenetv2( [4, 8, 4], [24, 116, 232, 464, 1024], weights=weights, progress=progress, quantize=quantize, **kwargs ) + + +def shufflenet_v2_x1_5( + *, + weights: Optional[Union[ShuffleNet_V2_X1_5_QuantizedWeights, ShuffleNet_V2_X1_5_Weights]] = None, + progress: bool = True, + quantize: bool = False, + **kwargs: Any, +) -> QuantizableShuffleNetV2: + """ + Constructs a ShuffleNetV2 with 1.5x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + weights (ShuffleNet_V2_X1_5_QuantizedWeights or ShuffleNet_V2_X1_5_Weights, optional): The pretrained + weights for the model + progress (bool): If True, displays a progress bar of the download to stderr + quantize (bool): If True, return a quantized version of the model + """ + weights = (ShuffleNet_V2_X1_5_QuantizedWeights if quantize else ShuffleNet_V2_X1_5_Weights).verify(weights) + return _shufflenetv2( + [4, 8, 4], [24, 176, 352, 704, 1024], weights=weights, progress=progress, quantize=quantize, **kwargs + ) + + +def shufflenet_v2_x2_0( + *, + weights: Optional[Union[ShuffleNet_V2_X2_0_QuantizedWeights, ShuffleNet_V2_X2_0_Weights]] = None, + progress: bool = True, + quantize: bool = False, + **kwargs: Any, +) -> QuantizableShuffleNetV2: + """ + Constructs a ShuffleNetV2 with 2.0x output channels, as described in + `"ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design" + `_. + + Args: + weights (ShuffleNet_V2_X2_0_QuantizedWeights or ShuffleNet_V2_X2_0_Weights, optional): The pretrained + weights for the model + progress (bool): If True, displays a progress bar of the download to stderr + quantize (bool): If True, return a quantized version of the model + """ + weights = (ShuffleNet_V2_X2_0_QuantizedWeights if quantize else ShuffleNet_V2_X2_0_Weights).verify(weights) + return _shufflenetv2( + [4, 8, 4], [24, 244, 488, 976, 2048], weights=weights, progress=progress, quantize=quantize, **kwargs + ) From de5d63869286effadf9bd535cb99a0d409bb521d Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Wed, 27 Apr 2022 23:16:41 +0000 Subject: [PATCH 06/12] Update docs and readme --- docs/source/models.rst | 4 +++- references/classification/README.md | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/source/models.rst b/docs/source/models.rst index 447b758e2f4..3b1db1b3bf4 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -501,8 +501,10 @@ Model Acc@1 Acc@5 ================================ ============= ============= MobileNet V2 71.658 90.150 MobileNet V3 Large 73.004 90.858 -ShuffleNet V2 x1.0 68.360 87.582 ShuffleNet V2 x0.5 57.972 79.780 +ShuffleNet V2 x1.0 68.360 87.582 +ShuffleNet V2 x1.5 72.052 90.700 +ShuffleNet V2 x2.0 75.354 92.488 ResNet 18 69.494 88.882 ResNet 50 75.920 92.814 ResNext 101 32x8d 78.986 94.480 diff --git a/references/classification/README.md b/references/classification/README.md index 758c57ce27d..676366fcda8 100644 --- a/references/classification/README.md +++ b/references/classification/README.md @@ -236,6 +236,18 @@ torchrun --nproc_per_node=8 train.py\ Note that `--val-resize-size` was optimized in a post-training step, see their `Weights` entry for the exact value. +### ShuffleNet V2 +``` +torchrun --nproc_per_node=8 train.py \ +--batch-size=128 \ +--lr=0.5 --lr-scheduler=cosineannealinglr --lr-warmup-epochs=5 --lr-warmup-method=linear \ +--auto-augment=ta_wide --epochs=600 --random-erase=0.1 --weight-decay=0.00002 \ +--norm-weight-decay=0.0 --label-smoothing=0.1 --mixup-alpha=0.2 --cutmix-alpha=1.0 \ +--train-crop-size=176 --model-ema --val-resize-size=232 --ra-sampler --ra-reps=4 +``` +Here `$MODEL` is either `shufflenet_v2_x1_5` or `shufflenet_v2_x2_0`. + + ## Mixed precision training Automatic Mixed Precision (AMP) training on GPU for Pytorch can be enabled with the [torch.cuda.amp](https://pytorch.org/docs/stable/amp.html?highlight=amp#module-torch.cuda.amp). From 7706d08abd843dd59fb1f3b0f83dbc090269621e Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Thu, 28 Apr 2022 00:19:28 +0100 Subject: [PATCH 07/12] Format with ufmt --- torchvision/models/quantization/shufflenetv2.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/torchvision/models/quantization/shufflenetv2.py b/torchvision/models/quantization/shufflenetv2.py index 19d004b48ae..cfbdc5b0c24 100644 --- a/torchvision/models/quantization/shufflenetv2.py +++ b/torchvision/models/quantization/shufflenetv2.py @@ -10,7 +10,12 @@ from .._api import WeightsEnum, Weights from .._meta import _IMAGENET_CATEGORIES from .._utils import handle_legacy_interface, _ovewrite_named_param -from ..shufflenetv2 import ShuffleNet_V2_X0_5_Weights, ShuffleNet_V2_X1_0_Weights, ShuffleNet_V2_X1_5_Weights, ShuffleNet_V2_X2_0_Weights +from ..shufflenetv2 import ( + ShuffleNet_V2_X0_5_Weights, + ShuffleNet_V2_X1_0_Weights, + ShuffleNet_V2_X1_5_Weights, + ShuffleNet_V2_X2_0_Weights, +) from .utils import _fuse_modules, _replace_relu, quantize_model From 06836b5bd73553d9442330a9efe6fb95cb77e929 Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Thu, 28 Apr 2022 00:27:43 +0100 Subject: [PATCH 08/12] Add to hubconf.py --- hubconf.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hubconf.py b/hubconf.py index bbd5da52b13..28d2c5a5d01 100644 --- a/hubconf.py +++ b/hubconf.py @@ -59,7 +59,12 @@ deeplabv3_mobilenet_v3_large, lraspp_mobilenet_v3_large, ) -from torchvision.models.shufflenetv2 import shufflenet_v2_x0_5, shufflenet_v2_x1_0 +from torchvision.models.shufflenetv2 import ( + shufflenet_v2_x0_5, + shufflenet_v2_x1_0, + shufflenet_v2_x1_5, + shufflenet_v2_x2_0, +) from torchvision.models.squeezenet import squeezenet1_0, squeezenet1_1 from torchvision.models.vgg import vgg11, vgg13, vgg16, vgg19, vgg11_bn, vgg13_bn, vgg16_bn, vgg19_bn from torchvision.models.vision_transformer import ( From b738c7dbcc59a433f5efa27b523bef6ee06dd5e9 Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Thu, 28 Apr 2022 10:21:47 +0100 Subject: [PATCH 09/12] Update readme for classification reference --- references/classification/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/references/classification/README.md b/references/classification/README.md index 676366fcda8..8ebed98cdea 100644 --- a/references/classification/README.md +++ b/references/classification/README.md @@ -247,6 +247,8 @@ torchrun --nproc_per_node=8 train.py \ ``` Here `$MODEL` is either `shufflenet_v2_x1_5` or `shufflenet_v2_x2_0`. +For the model `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` was contributed [from community](https://github.com/barrh/Shufflenet-v2-Pytorch/tree/v0.1.0). + ## Mixed precision training Automatic Mixed Precision (AMP) training on GPU for Pytorch can be enabled with the [torch.cuda.amp](https://pytorch.org/docs/stable/amp.html?highlight=amp#module-torch.cuda.amp). @@ -275,6 +277,21 @@ python train_quantization.py --device='cpu' --post-training-quantize --backend=' ``` Here `$MODEL` is one of `googlenet`, `inception_v3`, `resnet18`, `resnet50`, `resnext101_32x8d`, `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0`. +### Quantized ShuffleNet V2 + +Here are commands that we use to quantized the `shufflenet_v2_x1_5` and `shufflenet_v2_x2_0` models. +``` +# For shufflenet_v2_x1_5 +python train_quantization.py --device='cpu' --post-training-quantize --backend='fbgemm' \ + --model=shufflenet_v2_x1_5 --weights="ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1" \ + --train-crop-size 176 --val-resize-size 232 --data-path /datasets01_ontap/imagenet_full_size/061417/ + +# For shufflenet_v2_x2_0 +python train_quantization.py --device='cpu' --post-training-quantize --backend='fbgemm' \ + --model=shufflenet_v2_x1_5 --weights="ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1" \ + --train-crop-size 176 --val-resize-size 232 --data-path /datasets01_ontap/imagenet_full_size/061417/ +``` + ### QAT MobileNetV2 For Mobilenet-v2, the model was trained with quantization aware training, the settings used are: From de5a3b71d95eff134c912a8cb971ee3d53551c4d Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Thu, 28 Apr 2022 14:45:40 +0100 Subject: [PATCH 10/12] Fix reference classification readme --- references/classification/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/references/classification/README.md b/references/classification/README.md index 8ebed98cdea..7b779a47a29 100644 --- a/references/classification/README.md +++ b/references/classification/README.md @@ -247,7 +247,7 @@ torchrun --nproc_per_node=8 train.py \ ``` Here `$MODEL` is either `shufflenet_v2_x1_5` or `shufflenet_v2_x2_0`. -For the model `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` was contributed [from community](https://github.com/barrh/Shufflenet-v2-Pytorch/tree/v0.1.0). +The models `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` were contributed from community. See [PR-849](https://github.com/pytorch/vision/pull/849#issuecomment-483391686) for details. ## Mixed precision training @@ -288,7 +288,7 @@ python train_quantization.py --device='cpu' --post-training-quantize --backend=' # For shufflenet_v2_x2_0 python train_quantization.py --device='cpu' --post-training-quantize --backend='fbgemm' \ - --model=shufflenet_v2_x1_5 --weights="ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1" \ + --model=shufflenet_v2_x2_0 --weights="ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1" \ --train-crop-size 176 --val-resize-size 232 --data-path /datasets01_ontap/imagenet_full_size/061417/ ``` From dd97bc34887c49d737791f608d52c7abb3dff685 Mon Sep 17 00:00:00 2001 From: Yosua Michael Maranatha Date: Thu, 28 Apr 2022 14:52:33 +0100 Subject: [PATCH 11/12] Fix typo on readme --- references/classification/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/references/classification/README.md b/references/classification/README.md index 7b779a47a29..0af26e12e6e 100644 --- a/references/classification/README.md +++ b/references/classification/README.md @@ -247,7 +247,7 @@ torchrun --nproc_per_node=8 train.py \ ``` Here `$MODEL` is either `shufflenet_v2_x1_5` or `shufflenet_v2_x2_0`. -The models `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` were contributed from community. See [PR-849](https://github.com/pytorch/vision/pull/849#issuecomment-483391686) for details. +The models `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` were contributed by community. See [PR-849](https://github.com/pytorch/vision/pull/849#issuecomment-483391686) for details. ## Mixed precision training From c5551d7a63e0283e112d910130c66f32b1343c9e Mon Sep 17 00:00:00 2001 From: YosuaMichael Date: Thu, 28 Apr 2022 15:24:02 +0100 Subject: [PATCH 12/12] Update reference/classification/readme --- references/classification/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/references/classification/README.md b/references/classification/README.md index 0af26e12e6e..9eb95fd00e9 100644 --- a/references/classification/README.md +++ b/references/classification/README.md @@ -247,7 +247,7 @@ torchrun --nproc_per_node=8 train.py \ ``` Here `$MODEL` is either `shufflenet_v2_x1_5` or `shufflenet_v2_x2_0`. -The models `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` were contributed by community. See [PR-849](https://github.com/pytorch/vision/pull/849#issuecomment-483391686) for details. +The models `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` were contributed by the community. See [PR-849](https://github.com/pytorch/vision/pull/849#issuecomment-483391686) for details. ## Mixed precision training