#
# Copyright (c) 2021 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

model:
  name: gradient_sensitivity_prune
  framework: pytorch
pruning:
  approach:
    weight_compression:
      start_epoch: 0
      end_epoch: 1
      pruners:
        - !Pruner
            start_epoch: 0
            end_epoch: 1
            prune_type: gradient_sensitivity
            update_frequency: 1
            names: [
                     'bert.encoder.layer.*.attention.self.query.weight',
                     'bert.encoder.layer.*.attention.self.query.bias',
                     'bert.encoder.layer.*.attention.self.key.weight',
                     'bert.encoder.layer.*.attention.self.key.bias',
                     'bert.encoder.layer.*.attention.self.value.weight',
                     'bert.encoder.layer.*.attention.self.value.bias',
                   ]
            parameters: {
                          target: 8,
                          normalize: True,
                          stride: 64,
                          transpose: False,
                          importance_inputs: ['head_mask'],
                          importance_metric: abs_gradient
                        }

        - !Pruner
            start_epoch: 0
            end_epoch: 1
            prune_type: gradient_sensitivity
            update_frequency: 1
            names: [
                     'bert.encoder.layer.*.attention.output.dense.weight',
                   ]
            parameters: {
                          target: 8,
                          normalize: True,
                          stride: 64,
                          transpose: True,
                          importance_inputs: ['head_mask'],
                          importance_metric: abs_gradient
                        }

        - !Pruner
            prune_type: gradient_sensitivity
            names: [
                     'bert.encoder.layer.*.intermediate.dense.weight',
                     'bert.encoder.layer.*.intermediate.dense.bias',
                   ]
            parameters: {
                          target: 2000,
                          normalize: False,
                          stride: 1,
                          transpose: False,
                          importance_inputs: [
                                       'bert.encoder.layer.*.intermediate.dense.weight',
                                       'bert.encoder.layer.*.intermediate.dense.bias',
                                      ],
                          importance_metric: weighted_gradient
                        }

        - !Pruner
            prune_type: gradient_sensitivity
            names: [
                     'bert.encoder.layer.*.output.dense.weight',
                   ]
            parameters: {
                          target: 2000,
                          normalize: False,
                          stride: 1,
                          transpose: True,
                          importance_inputs: [
                                       'bert.encoder.layer.*.intermediate.dense.weight',
                                       'bert.encoder.layer.*.intermediate.dense.bias',
                                      ],
                          importance_metric: weighted_gradient
                        }

tuning:
  accuracy_criterion:
    relative: 0.1                             # only verifying workflow, accuracy loss percentage: 10%
  exit_policy:
    timeout: 0                                   # tuning timeout (seconds)
  random_seed: 9527                            # random seed
