From 7fb41d6f49aa69fcb2067258809b48a8f596bd11 Mon Sep 17 00:00:00 2001
From: Neta Zmora <neta.zmora@intel.com>
Date: Tue, 5 Mar 2019 12:38:52 +0200
Subject: [PATCH] AMC - added arguments: amc-ft-frequency, amc-reward-frequency
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

amc-ft-frequency:
Sometimes we may want to fine-tune the weights after
‘n’ number of episode steps (action-steps).   This new
argument  controls the frequency of this fine-tuning (FT)
How many action-steps between fine-tuning
By default, there is no fine-tuning between steps.

amc-reward-frequency:
By default, we only provide a non-zero reward at the end
episodes.  This argument allows us to provide rewards at
a higher frequency.

This commit also reorders the ResNet layer names, so that
layers are processed by near-topological order.  This is simply
to help interpret the data in the AMC Jupyter notebooks.
---
 examples/automated_deep_compression/ADC.py    | 39 ++++++++++---------
 .../automated_deep_compression/automl_args.py |  5 ++-
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/examples/automated_deep_compression/ADC.py b/examples/automated_deep_compression/ADC.py
index 6361941..33c7bb8 100755
--- a/examples/automated_deep_compression/ADC.py
+++ b/examples/automated_deep_compression/ADC.py
@@ -212,9 +212,6 @@ def amc_reward_fn(env, top1, top5, vloss, total_macs):
     return reward
 
 
-experimental_reward_fn = harmonic_mean_reward_fn
-
-
 def do_adc_internal(model, args, optimizer_data, validate_fn, save_checkpoint_fn, train_fn):
     dataset = args.dataset
     arch = args.arch
@@ -245,7 +242,8 @@ def do_adc_internal(model, args, optimizer_data, validate_fn, save_checkpoint_fn
             'num_ft_epochs': num_ft_epochs,
             'action_range': action_range,
             'conv_cnt': conv_cnt,
-            'reward_frequency': args.amc_reward_frequency})
+            'reward_frequency': args.amc_reward_frequency,
+            'ft_frequency': args.amc_ft_frequency})
 
     #net_wrapper = NetworkWrapper(model, app_args, services)
     #return sample_networks(net_wrapper, services)
@@ -260,7 +258,7 @@ def do_adc_internal(model, args, optimizer_data, validate_fn, save_checkpoint_fn
         amc_cfg.action_constrain_fn = DistillerWrapperEnvironment.get_action
     elif args.amc_protocol == "mac-constrained-experimental":
         amc_cfg.target_density = args.amc_target_density
-        amc_cfg.reward_fn = experimental_reward_fn
+        amc_cfg.reward_fn = amc_reward_fn
         amc_cfg.action_constrain_fn = None
     else:
         raise ValueError("{} is not supported currently".format(args.amc_protocol))
@@ -330,19 +328,21 @@ resnet50_params = ["module.layer1.0.conv1.weight", "module.layer1.0.conv2.weight
                    "module.layer4.1.conv1.weight", "module.layer4.1.conv2.weight",
                    "module.layer4.2.conv1.weight", "module.layer4.2.conv2.weight"]
 
-resnet20_params = ["module.layer1.0.conv1.weight", "module.layer2.0.conv1.weight", "module.layer3.0.conv1.weight",
-                   "module.layer1.1.conv1.weight", "module.layer2.1.conv1.weight", "module.layer3.1.conv1.weight",
-                   "module.layer1.2.conv1.weight", "module.layer2.2.conv1.weight", "module.layer3.2.conv1.weight"]
+resnet20_params = ["module.layer1.0.conv1.weight", "module.layer1.1.conv1.weight", "module.layer1.2.conv1.weight",
+                   "module.layer2.0.conv1.weight", "module.layer2.1.conv1.weight", "module.layer2.2.conv1.weight",
+                   "module.layer3.0.conv1.weight", "module.layer3.1.conv1.weight", "module.layer3.2.conv1.weight"]
+
+resnet56_params = ["module.layer1.0.conv1.weight", "module.layer1.1.conv1.weight", "module.layer1.2.conv1.weight",
+                   "module.layer1.3.conv1.weight", "module.layer1.4.conv1.weight", "module.layer1.5.conv1.weight",
+                   "module.layer1.6.conv1.weight", "module.layer1.7.conv1.weight", "module.layer1.8.conv1.weight",
 
-resnet56_params = [ "module.layer1.0.conv1.weight", "module.layer2.0.conv1.weight", "module.layer3.0.conv1.weight",
-                    "module.layer1.1.conv1.weight", "module.layer2.1.conv1.weight", "module.layer3.1.conv1.weight",
-                    "module.layer1.2.conv1.weight", "module.layer2.2.conv1.weight", "module.layer3.2.conv1.weight",
-                    "module.layer1.3.conv1.weight", "module.layer2.3.conv1.weight", "module.layer3.3.conv1.weight",
-                    "module.layer1.4.conv1.weight", "module.layer2.4.conv1.weight", "module.layer3.4.conv1.weight",
-                    "module.layer1.5.conv1.weight", "module.layer2.5.conv1.weight", "module.layer3.5.conv1.weight",
-                    "module.layer1.6.conv1.weight", "module.layer2.6.conv1.weight", "module.layer3.6.conv1.weight",
-                    "module.layer1.7.conv1.weight", "module.layer2.7.conv1.weight", "module.layer3.7.conv1.weight",
-                    "module.layer1.8.conv1.weight", "module.layer2.8.conv1.weight", "module.layer3.8.conv1.weight"]
+                   "module.layer2.0.conv1.weight", "module.layer2.1.conv1.weight", "module.layer2.2.conv1.weight",
+                   "module.layer2.3.conv1.weight", "module.layer2.4.conv1.weight", "module.layer2.5.conv1.weight",
+                   "module.layer2.6.conv1.weight", "module.layer2.7.conv1.weight", "module.layer2.8.conv1.weight",
+
+                   "module.layer3.0.conv1.weight", "module.layer3.1.conv1.weight", "module.layer3.2.conv1.weight",
+                   "module.layer3.3.conv1.weight", "module.layer3.4.conv1.weight", "module.layer3.5.conv1.weight",
+                   "module.layer3.6.conv1.weight", "module.layer3.7.conv1.weight", "module.layer3.8.conv1.weight"]
 
 resnet50_layers = [param[:-len(".weight")] for param in resnet50_params]
 resnet20_layers = [param[:-len(".weight")] for param in resnet20_params]
@@ -633,11 +633,12 @@ class DistillerWrapperEnvironment(gym.Env):
             normalized_nnz = total_nnz / self.dense_model_size * 100
             self.finalize_episode(top1, reward, total_macs, normalized_macs,
                                   normalized_nnz, self.action_history, self.agent_action_history)
-
             self.episode += 1
         else:
+            if self.amc_cfg.ft_frequency is not None and self.current_layer_id % self.amc_cfg.ft_frequency == 0:
+                self.net_wrapper.train(1, self.episode)
             observation = self.get_obs()
-            if self.amc_cfg.reward_frequency > 0 and self.current_layer_id % self.amc_cfg.reward_frequency == 0:
+            if self.amc_cfg.reward_frequency is not None and self.current_layer_id % self.amc_cfg.reward_frequency == 0:
                 reward, top1, total_macs, total_nnz = self.compute_reward(False)
             else:
                 reward = 0
diff --git a/examples/automated_deep_compression/automl_args.py b/examples/automated_deep_compression/automl_args.py
index a598189..80b732f 100755
--- a/examples/automated_deep_compression/automl_args.py
+++ b/examples/automated_deep_compression/automl_args.py
@@ -22,7 +22,7 @@ def add_automl_args(argparser, arch_choices=None, enable_pretrained=False):
                        help='The number of epochs for heatup/exploration')
     group.add_argument('--amc-training-epochs', type=int, default=300,
                        help='The number of epochs for training/exploitation')
-    group.add_argument('--amc-reward-frequency', type=int, default=-1,
+    group.add_argument('--amc-reward-frequency', type=int, default=None,
                        help='Reward computation frequency (measured in agent steps)')
     group.add_argument('--amc-target-density', type=float,
                        help='Target density of the network we are seeking')
@@ -34,3 +34,6 @@ def add_automl_args(argparser, arch_choices=None, enable_pretrained=False):
                        help="The agent algorithm to use")
     # group.add_argument('--amc-thinning', action='store_true', default=False,
     #                    help='Perform netowrk thinning after altering each layer')
+    group.add_argument('--amc-ft-frequency', type=int, default=None,
+                       help='How many action-steps between fine-tuning.\n'
+                       'By default there is no fine-tuning between steps.')
-- 
GitLab