minor update to quantization docs & scritps. support for external model in classifica...
authorManu Mathew <a0393608@ti.com>
Tue, 19 May 2020 14:25:16 +0000 (19:55 +0530)
committerManu Mathew <a0393608@ti.com>
Tue, 19 May 2020 14:26:40 +0000 (19:56 +0530)
docs/Quantization.md
modules/pytorch_jacinto_ai/engine/train_classification.py
run_quantization.sh
run_quantization_example.sh

index e33af7ec0eb04fd90b93a494662486a9675fd0fd..803b2a6aba35467235fec4ca6412823d3f02ac32 100644 (file)
@@ -26,7 +26,7 @@ To get best accuracy at the quantization stage, it is important that the model i
 ## Implementation Notes, Limitations & Recommendations
 - **Please read carefully** - closely following these recommendations can save hours or days of debug related to quantization accuracy issues.
 - **Use Modules instead of functions** (by Module we mean classes derived from torch.nn.Module). We make use of Modules heavily in our quantization tools - in order to do range collection, in order to merge Convolution/BN/ReLU in order to decide whether to quantize a certain tensor and so on. For example use torch.nn.ReLU instead of torch.nn.functional.relu(), torch.nn.AdaptiveAvgPool2d() instead of torch.nn.functional.adaptive_avg_pool2d(), torch.nn.Flatten() instead of torch.nn.functional.flatten() etc.<br>
-- **The same module should not be re-used multiple times within the module** in order that the feature map range estimation is correct. Unfortunately, in the torchvision ResNet models, the ReLU module in the BasicBlock and BottleneckBlock are re-used multiple times. We have corrected this by defining separate ReLU modules. This change is minor and **does not** affect the loading of existing pretrained weights. See the [our modified ResNet model definition here](./modules/pytorch_jacinto_ai/vision/models/resnet.py).<br>
+- **The same module should not be re-used multiple times within the module** in order that the feature map range estimation is correct. Unfortunately, in the torchvision ResNet models, the ReLU module in the BasicBlock and BottleneckBlock are re-used multiple times. We have corrected this by defining separate ReLU modules. This change is minor and **does not** affect the loading of existing pretrained weights. See the [our modified ResNet model definition here](../modules/pytorch_jacinto_ai/vision/models/resnet.py).<br>
 - If you have done QAT and is getting poor accuracy either in the Python code or during inference in the platform, please inspect your model carefully to see if the above recommendations have been followed - some of these can be easily missed by oversight - and can result in painful debugging that could have been avoided.<br>
 - However, if a function does not change the range of feature map, it is not critical to use it in Module form. An example of this is torch.nn.functional.interpolate<br>
 - **Multi-GPU training/calibration/validation with DataParallel is not yet working with our quantization modules** QuantTrainModule/QuantCalibrateModule/QuantTestModule. We recommend not to wrap the modules in DataParallel if you are training/calibrating/testing with quantization - i.e. if your model is wrapped in QuantTrainModule/QuantCalibrateModule/QuantTestModule.<br>
index a11798fd1192bbe22aeb6f121f48c5f24d773ab5..89f08b6cea894848a1551dc781e0da5b8aeec5c7 100644 (file)
@@ -40,7 +40,8 @@ def get_config():
 
     args.data_path = './data/datasets/ilsvrc'           # path to dataset
     args.model_name = 'mobilenetv2_tv_x1'     # model architecture'
-    args.dataset_name = 'imagenet_classification'   # image folder classification
+    args.model = None                                   #if mdoel is crated externaly 
+    args.dataset_name = 'imagenet_classification'       # image folder classification
     args.save_path = None                               # checkpoints save path
     args.phase = 'training'                             # training/calibration/validation
     args.date = None                                    # date to add to save path. if this is None, current date will be added.
@@ -222,7 +223,8 @@ def main(args):
     #################################################
     # create model
     print("=> creating model '{}'".format(args.model_name))
-    model = vision.models.classification.__dict__[args.model_name](args.model_config)
+    
+    model = vision.models.classification.__dict__[args.model_name](args.model_config) if args.model == None else args.model
 
     # check if we got the model as well as parameters to change the names in pretrained
     model, change_names_dict = model if isinstance(model, (list,tuple)) else (model,None)
index 914dcd2611ddc9cb8eb141364a7b53e64e927fbc..8956fccf856e229e1084d5b7a17fd57ec3fe131b 100755 (executable)
@@ -12,7 +12,7 @@
 #
 #### Image Classification - Quantization Aware Training - MobileNetV2(Shicai) - a TOUGH MobileNetV2 pretrained model
 #python ./scripts/train_classification_main.py --dataset_name image_folder_classification --model_name mobilenetv2_shicai_x1 --data_path ./data/datasets/image_folder_classification \
-#--pretrained ./data/modelzoo/experimental/pytorch/others/shicai/MobileNet-Caffe/mobilenetv2_shicai_rgb.pth \
+#--pretrained ./data/modelzoo/pytorch/image_classification/imagenet1k/shicai/mobilenetv2_shicai_rgb.pth \
 #--batch_size 64 --quantize True --epochs 25 --epoch_size 0.1 --lr 1e-5 --evaluate_start False
 #
 #
@@ -43,7 +43,7 @@
 
 #### Image Classification - Accuracy Estimation with Post Training Quantization - A TOUGH MobileNetV2 pretrained model
 #python ./scripts/train_classification_main.py --phase validation --dataset_name image_folder_classification --model_name mobilenetv2_shicai_x1 --data_path ./data/datasets/image_folder_classification \
-#--pretrained ./data/modelzoo/pytorch/semantic_seg/cityscapes/jacinto_ai/deeplabv3lite_mobilenetv2_tv_768x384_best.pth \
+#--pretrained ./data/modelzoo/pytorch/image_classification/imagenet1k/shicai/mobilenetv2_shicai_rgb.pth \
 #--batch_size 64 --quantize True
 
 #### Semantic Segmentation - Accuracy Estimation with Post Training Quantization - MobileNetV2+DeeplabV3Lite
index 519bb8e3f09fc8ef9261e9758a6d2045f2c7808a..688c025a0582a89aaf2b20d51590686b967bb6ae 100755 (executable)
@@ -32,8 +32,8 @@ declare -A model_pretrained=(
 lr=1e-5             # initial learning rate for quantization aware training - recommend to use 1e-5 (or at max 5e-5)
 batch_size=64       # use a relatively smaller batch size as quantization aware training does not use multi-gpu
 epochs=10           # numerb of epochs to train
-epoch_size=0.1      # artificially limit one training epoch to this many iterations - this argument is only used to limit the training time and may hurt acuracy - set to 0 to use the full training epoch
-epoch_size_val=0    # validation epoch size - set to 0 for full validation epoch
+epoch_size=0.1      # use a fraction to limit the number of images used in one epoch - set to 0 to use the full training epoch
+epoch_size_val=0    # use a fraction to limit the number of images used in one epoch - set to 0 to use the full validation epoch
 
 
 # ----------------------------------