From 47f277effe9da84ce0e681894c636ff6c9a189b3 Mon Sep 17 00:00:00 2001 From: Chengmin Chi Date: Tue, 30 Jun 2020 00:03:49 +0800 Subject: [PATCH 1/6] Refactor compressor documentation --- docs/en_US/Compressor/CustomizeCompressor.md | 181 ++++++++++ docs/en_US/Compressor/Framework.md | 247 +++++--------- docs/en_US/Compressor/Pruner.md | 330 +++++++++---------- docs/en_US/model_compression.rst | 1 + docs/img/compressor_framework.jpg | Bin 0 -> 93903 bytes 5 files changed, 412 insertions(+), 347 deletions(-) create mode 100644 docs/en_US/Compressor/CustomizeCompressor.md create mode 100644 docs/img/compressor_framework.jpg diff --git a/docs/en_US/Compressor/CustomizeCompressor.md b/docs/en_US/Compressor/CustomizeCompressor.md new file mode 100644 index 0000000000..77034f1b38 --- /dev/null +++ b/docs/en_US/Compressor/CustomizeCompressor.md @@ -0,0 +1,181 @@ +# Customize A New Compression Algorithm + +```eval_rst +.. contents:: +``` + +To simplify writing a new compression algorithm, we design programming interfaces which are simple but flexible enough. There are interfaces for pruning and quantization respectively. Below, we first demonstrate how to customize a new pruning algorithm and then demonstrate how to customize a new quantization algorithm. + +To better demonstrate how to customize a new pruning/quantization algorithm, it is necessary for users to first understand the framework for supporting various pruning algorithms in NNI. Reference [Framework overview of model compression](https://nni.readthedocs.io/en/latest/Compressor/Framework.html) + + +## Customize a new pruning algorithm + +Implementing a new pruning algorithm requires implementing a `weight masker` class which shoud be a subclass of `WeightMasker`, and a `pruner` class, which should be a subclass `Pruner`. + +An implementation of `weight masker` may look like this: + +```python +class MyMasker(WeightMasker): + def __init__(self, model, pruner): + super().__init__(model, pruner) + # You can do some initialization here, such as collecting some statistics data + # if it is necessary for your algorithms to calculate the masks. + + def calc_mask(self, sparsity, wrapper, wrapper_idx=None): + # calculate the masks based on the wrapper.weight, and sparsity, + # and anything else + # mask = ... + return {'weight_mask': mask} +``` + +You can reference nni provided [weight masker](https://github.com/microsoft/nni/blob/master/src/sdk/pynni/nni/compression/torch/pruning/structured_pruning.py) implementations to implement your own weight masker. + +A basic `pruner` looks likes this: + +```python +class MyPruner(Pruner): + def __init__(self, model, config_list, optimizer): + super().__init__(model, config_list, optimizer) + self.set_wrappers_attribute("if_calculated", False) + # construct a weight masker instance + self.masker = MyMasker(model, self) + + def calc_mask(self, wrapper, wrapper_idx=None): + sparsity = wrapper.config['sparsity'] + if wrapper.if_calculated: + # Already pruned, do not prune again as a one-shot pruner + return None + else: + # call your masker to actually calcuate the mask for this layer + masks = self.masker.calc_mask(sparsity=sparsity, wrapper=wrapper, wrapper_idx=wrapper_idx) + wrapper.if_calculated = True + return masks + +``` + +Reference nni provided [pruner](https://github.com/microsoft/nni/blob/master/src/sdk/pynni/nni/compression/torch/pruning/one_shot.py) implementations to implement your own pruner class. + + +*** + +## Customize a new quantization algorithm + +To write a new quantization algorithm, you can write a class that inherits `nni.compression.torch.Quantizer`. Then, override the member functions with the logic of your algorithm. The member function to override is `quantize_weight`. `quantize_weight` directly returns the quantized weights rather than mask, because for quantization the quantized weights cannot be obtained by applying mask. + +```python +from nni.compression.torch import Quantizer + +class YourQuantizer(Quantizer): + def __init__(self, model, config_list): + """ + Suggest you to use the NNI defined spec for config + """ + super().__init__(model, config_list) + + def quantize_weight(self, weight, config, **kwargs): + """ + quantize should overload this method to quantize weight tensors. + This method is effectively hooked to :meth:`forward` of the model. + + Parameters + ---------- + weight : Tensor + weight that needs to be quantized + config : dict + the configuration for weight quantization + """ + + # Put your code to generate `new_weight` here + + return new_weight + + def quantize_output(self, output, config, **kwargs): + """ + quantize should overload this method to quantize output. + This method is effectively hooked to `:meth:`forward` of the model. + + Parameters + ---------- + output : Tensor + output that needs to be quantized + config : dict + the configuration for output quantization + """ + + # Put your code to generate `new_output` here + + return new_output + + def quantize_input(self, *inputs, config, **kwargs): + """ + quantize should overload this method to quantize input. + This method is effectively hooked to :meth:`forward` of the model. + + Parameters + ---------- + inputs : Tensor + inputs that needs to be quantized + config : dict + the configuration for inputs quantization + """ + + # Put your code to generate `new_input` here + + return new_input + + def update_epoch(self, epoch_num): + pass + + def step(self): + """ + Can do some processing based on the model or weights binded + in the func bind_model + """ + pass +``` + +### Customize backward function + +Sometimes it's necessary for a quantization operation to have a customized backward function, such as [Straight-Through Estimator](https://stackoverflow.com/questions/38361314/the-concept-of-straight-through-estimator-ste), user can customize a backward function as follow: + +```python +from nni.compression.torch.compressor import Quantizer, QuantGrad, QuantType + +class ClipGrad(QuantGrad): + @staticmethod + def quant_backward(tensor, grad_output, quant_type): + """ + This method should be overrided by subclass to provide customized backward function, + default implementation is Straight-Through Estimator + Parameters + ---------- + tensor : Tensor + input of quantization operation + grad_output : Tensor + gradient of the output of quantization operation + quant_type : QuantType + the type of quantization, it can be `QuantType.QUANT_INPUT`, `QuantType.QUANT_WEIGHT`, `QuantType.QUANT_OUTPUT`, + you can define different behavior for different types. + Returns + ------- + tensor + gradient of the input of quantization operation + """ + + # for quant_output function, set grad to zero if the absolute value of tensor is larger than 1 + if quant_type == QuantType.QUANT_OUTPUT: + grad_output[torch.abs(tensor) > 1] = 0 + return grad_output + + +class YourQuantizer(Quantizer): + def __init__(self, model, config_list): + super().__init__(model, config_list) + # set your customized backward function to overwrite default backward function + self.quant_grad = ClipGrad + +``` + +If you do not customize `QuantGrad`, the default backward is Straight-Through Estimator. +_Coming Soon_ ... \ No newline at end of file diff --git a/docs/en_US/Compressor/Framework.md b/docs/en_US/Compressor/Framework.md index 66083197be..16abb0566f 100644 --- a/docs/en_US/Compressor/Framework.md +++ b/docs/en_US/Compressor/Framework.md @@ -1,18 +1,18 @@ -# Customize A New Compression Algorithm +# Framework overview of model compression ```eval_rst .. contents:: ``` -To simplify writing a new compression algorithm, we design programming interfaces which are simple but flexible enough. There are interfaces for pruning and quantization respectively. Below, we first demonstrate how to customize a new pruning algorithm and then demonstrate how to customize a new quantization algorithm. +Below picture shows the components overview of model compression framework. -## Customize a new pruning algorithm +![](../../img/compressor_framework.jpg) -To better demonstrate how to customize a new pruning algorithm, it is necessary for users to first understand the framework for supporting various pruning algorithms in NNI. +There are 3 major components/classes in NNI model compression framework: `Compressor`, `Pruner` and `Quantizer`. Let's look at them in detail one by one: -### Framework overview for pruning algorithms +## Compressor -Following example shows how to use a pruner: +Compressor is the base class for pruner and quntizer, it provides a unified interface for pruner and quantizer for end users, so that pruner and quantizer can be used in the same way. For example, to use a pruner: ```python from nni.compression.torch import LevelPruner @@ -32,82 +32,24 @@ model = pruner.compress() # the model will be pruned during training automatically ``` -A pruner receives `model`, `config_list` and `optimizer` as arguments. It prunes the model per the `config_list` during training loop by adding a hook on `optimizer.step()`. - -From implementation perspective, a pruner consists of a `weight masker` instance and multiple `module wrapper` instances. - -#### Weight masker - -A `weight masker` is the implementation of pruning algorithms, it can prune a specified layer wrapped by `module wrapper` with specified sparsity. - -#### Module wrapper - -A `module wrapper` is a module containing: - -1. the origin module -2. some buffers used by `calc_mask` -3. a new forward method that applies masks before running the original forward method. - -the reasons to use `module wrapper`: - -1. some buffers are needed by `calc_mask` to calculate masks and these buffers should be registered in `module wrapper` so that the original modules are not contaminated. -2. a new `forward` method is needed to apply masks to weight before calling the real `forward` method. - -#### Pruner - -A `pruner` is responsible for: - -1. Manage / verify config_list. -2. Use `module wrapper` to wrap the model layers and add hook on `optimizer.step` -3. Use `weight masker` to calculate masks of layers while pruning. -4. Export pruned model weights and masks. - -### Implement a new pruning algorithm - -Implementing a new pruning algorithm requires implementing a `weight masker` class which shoud be a subclass of `WeightMasker`, and a `pruner` class, which should be a subclass `Pruner`. - -An implementation of `weight masker` may look like this: - +To use a quntizer: ```python -class MyMasker(WeightMasker): - def __init__(self, model, pruner): - super().__init__(model, pruner) - # You can do some initialization here, such as collecting some statistics data - # if it is necessary for your algorithms to calculate the masks. - - def calc_mask(self, sparsity, wrapper, wrapper_idx=None): - # calculate the masks based on the wrapper.weight, and sparsity, - # and anything else - # mask = ... - return {'weight_mask': mask} -``` - -You can reference nni provided [weight masker](https://github.com/microsoft/nni/blob/master/src/sdk/pynni/nni/compression/torch/pruning/structured_pruning.py) implementations to implement your own weight masker. - -A basic `pruner` looks likes this: +from nni.compression.torch import DoReFaQuantizer -```python -class MyPruner(Pruner): - def __init__(self, model, config_list, optimizer): - super().__init__(model, config_list, optimizer) - self.set_wrappers_attribute("if_calculated", False) - # construct a weight masker instance - self.masker = MyMasker(model, self) - - def calc_mask(self, wrapper, wrapper_idx=None): - sparsity = wrapper.config['sparsity'] - if wrapper.if_calculated: - # Already pruned, do not prune again as a one-shot pruner - return None - else: - # call your masker to actually calcuate the mask for this layer - masks = self.masker.calc_mask(sparsity=sparsity, wrapper=wrapper, wrapper_idx=wrapper_idx) - wrapper.if_calculated = True - return masks +configure_list = [{ + 'quant_types': ['weight'], + 'quant_bits': { + 'weight': 8, + }, + 'op_types':['Conv2d', 'Linear'] +}] +optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9, weight_decay=1e-4) +quantizer = DoReFaQuantizer(model, configure_list, optimizer) +quantizer.compress() ``` -Reference nni provided [pruner](https://github.com/microsoft/nni/blob/master/src/sdk/pynni/nni/compression/torch/pruning/one_shot.py) implementations to implement your own pruner class. +`Compressor` class provides some utility methods for subclass and users: ### Set wrapper attribute @@ -148,130 +90,103 @@ collector_id = self.pruner.add_activation_collector(collector) self.pruner.remove_activation_collector(collector_id) ``` -### Multi-GPU support -On multi-GPU training, buffers and parameters are copied to multiple GPU every time the `forward` method runs on multiple GPU. If buffers and parameters are updated in the `forward` method, an `in-place` update is needed to ensure the update is effective. -Since `calc_mask` is called in the `optimizer.step` method, which happens after the `forward` method and happens only on one GPU, it supports multi-GPU naturally. +## Pruner + +A pruner receives `model`, `config_list` and `optimizer` as arguments. It prunes the model per the `config_list` during training loop by adding a hook on `optimizer.step()`. + +Pruner class is a subclass of Compressor, so it contains everything in the Compressor class and some additional components only for pruning, it contains: + +### Weight masker + +A `weight masker` is the implementation of pruning algorithms, it can prune a specified layer wrapped by `module wrapper` with specified sparsity. + +### Pruning module wrapper + +A `pruning module wrapper` is a module containing: + +1. the origin module +2. some buffers used by `calc_mask` +3. a new forward method that applies masks before running the original forward method. + +the reasons to use `module wrapper`: + +1. some buffers are needed by `calc_mask` to calculate masks and these buffers should be registered in `module wrapper` so that the original modules are not contaminated. +2. a new `forward` method is needed to apply masks to weight before calling the real `forward` method. + +### Pruning hook + +A pruning hook is installed on a pruner when the pruner is constructed, it is used to call pruner's calc_mask method at `optimizer.step()` is invoked. + *** -## Customize a new quantization algorithm +## Quantizer -To write a new quantization algorithm, you can write a class that inherits `nni.compression.torch.Quantizer`. Then, override the member functions with the logic of your algorithm. The member function to override is `quantize_weight`. `quantize_weight` directly returns the quantized weights rather than mask, because for quantization the quantized weights cannot be obtained by applying mask. +Quantizer class is also a subclass of `Compressor`, it is used to compress models by reducing the number of bits required to represent weights or activations, which can reduce the computations and the inference time. It contains: -```python -from nni.compression.torch import Quantizer +### Quantization module wrapper -class YourQuantizer(Quantizer): - def __init__(self, model, config_list): - """ - Suggest you to use the NNI defined spec for config - """ - super().__init__(model, config_list) +Each module/layer of the model to be quantized is wrapped by a quantization module wrapper, it provides a new `forward` method to quantize the original module's weight, input and output. + +### Quantization hook + +A quantization hook is installed on a quntizer when it is constructed, it is call at `optimizer.step()`. + +### Quantization methods + +`Quantizer` class provides following methods for subclass to implement quantization algorithms: - def quantize_weight(self, weight, config, **kwargs): +```python +class Quantizer(Compressor): + """ + Base quantizer for pytorch quantizer + """ + def quantize_weight(self, weight, wrapper, **kwargs): """ - quantize should overload this method to quantize weight tensors. + quantize should overload this method to quantize weight. This method is effectively hooked to :meth:`forward` of the model. - Parameters ---------- weight : Tensor weight that needs to be quantized - config : dict - the configuration for weight quantization + wrapper : QuantizerModuleWrapper + the wrapper for origin module """ + raise NotImplementedError('Quantizer must overload quantize_weight()') - # Put your code to generate `new_weight` here - - return new_weight - - def quantize_output(self, output, config, **kwargs): + def quantize_output(self, output, wrapper, **kwargs): """ quantize should overload this method to quantize output. - This method is effectively hooked to `:meth:`forward` of the model. - + This method is effectively hooked to :meth:`forward` of the model. Parameters ---------- output : Tensor output that needs to be quantized - config : dict - the configuration for output quantization + wrapper : QuantizerModuleWrapper + the wrapper for origin module """ + raise NotImplementedError('Quantizer must overload quantize_output()') - # Put your code to generate `new_output` here - - return new_output - - def quantize_input(self, *inputs, config, **kwargs): + def quantize_input(self, *inputs, wrapper, **kwargs): """ quantize should overload this method to quantize input. This method is effectively hooked to :meth:`forward` of the model. - Parameters ---------- inputs : Tensor inputs that needs to be quantized - config : dict - the configuration for inputs quantization + wrapper : QuantizerModuleWrapper + the wrapper for origin module """ + raise NotImplementedError('Quantizer must overload quantize_input()') - # Put your code to generate `new_input` here - - return new_input - - def update_epoch(self, epoch_num): - pass - - def step(self): - """ - Can do some processing based on the model or weights binded - in the func bind_model - """ - pass ``` -### Customize backward function - -Sometimes it's necessary for a quantization operation to have a customized backward function, such as [Straight-Through Estimator](https://stackoverflow.com/questions/38361314/the-concept-of-straight-through-estimator-ste), user can customize a backward function as follow: - -```python -from nni.compression.torch.compressor import Quantizer, QuantGrad, QuantType - -class ClipGrad(QuantGrad): - @staticmethod - def quant_backward(tensor, grad_output, quant_type): - """ - This method should be overrided by subclass to provide customized backward function, - default implementation is Straight-Through Estimator - Parameters - ---------- - tensor : Tensor - input of quantization operation - grad_output : Tensor - gradient of the output of quantization operation - quant_type : QuantType - the type of quantization, it can be `QuantType.QUANT_INPUT`, `QuantType.QUANT_WEIGHT`, `QuantType.QUANT_OUTPUT`, - you can define different behavior for different types. - Returns - ------- - tensor - gradient of the input of quantization operation - """ - - # for quant_output function, set grad to zero if the absolute value of tensor is larger than 1 - if quant_type == QuantType.QUANT_OUTPUT: - grad_output[torch.abs(tensor) > 1] = 0 - return grad_output - +*** -class YourQuantizer(Quantizer): - def __init__(self, model, config_list): - super().__init__(model, config_list) - # set your customized backward function to overwrite default backward function - self.quant_grad = ClipGrad +## Multi-GPU support -``` +On multi-GPU training, buffers and parameters are copied to multiple GPU every time the `forward` method runs on multiple GPU. If buffers and parameters are updated in the `forward` method, an `in-place` update is needed to ensure the update is effective. +Since `calc_mask` is called in the `optimizer.step` method, which happens after the `forward` method and happens only on one GPU, it supports multi-GPU naturally. -If you do not customize `QuantGrad`, the default backward is Straight-Through Estimator. -_Coming Soon_ ... \ No newline at end of file diff --git a/docs/en_US/Compressor/Pruner.md b/docs/en_US/Compressor/Pruner.md index fcc17fe2b0..0d86d7bc70 100644 --- a/docs/en_US/Compressor/Pruner.md +++ b/docs/en_US/Compressor/Pruner.md @@ -1,27 +1,26 @@ # Supported Pruning Algorithms on NNI -We provide several pruning algorithms that support fine-grained weight pruning and structural filter pruning. **Weight pruning** generally results in unstructured models, which need specialized haredware or software to speed up the sparse network. **Filter Pruning** achieves acceleratation by removing the entire filter. We also provide an algorithm to control the **pruning schedule**. +We provide several pruning algorithms that support fine-grained weight pruning and structural filter pruning. **Fine-grained Pruning** generally results in unstructured models, which need specialized haredware or software to speed up the sparse network. **Filter Pruning** achieves acceleratation by removing the entire filter. We also provide an algorithm to control the **pruning schedule**. -**Weight Pruning** +**Fine-grained Pruning** * [Level Pruner](#level-pruner) -* [Lottery Ticket Hypothesis](#lottery-ticket-hypothesis) **Filter Pruning** * [Slim Pruner](#slim-pruner) -* [Filter Pruners with Weight Rank](#weightrankfilterpruner) - * [FPGM Pruner](#fpgm-pruner) - * [L1Filter Pruner](#l1filter-pruner) - * [L2Filter Pruner](#l2filter-pruner) -* [Filter Pruners with Activation Rank](#activationrankfilterpruner) - * [APoZ Rank Pruner](#activationapozrankfilterpruner) - * [Activation Mean Rank Pruner](#activationmeanrankfilterpruner) -* [Filter Pruners with Gradient Rank](#gradientrankfilterpruner) - * [Taylor FO On Weight Pruner](#taylorfoweightfilterpruner) - +* [FPGM Pruner](#fpgm-pruner) +* [L1Filter Pruner](#l1filter-pruner) +* [L2Filter Pruner](#l2filter-pruner) +* [APoZ Rank Pruner](#activationapozrankfilterpruner) +* [Activation Mean Rank Pruner](#activationmeanrankfilterpruner) +* [Taylor FO On Weight Pruner](#taylorfoweightfilterpruner) + **Pruning Schedule** * [AGP Pruner](#agp-pruner) +**Others** +* [Lottery Ticket Hypothesis](#lottery-ticket-hypothesis) + ## Level Pruner This is one basic one-shot pruner: you can set a target sparsity level (expressed as a fraction, 0.6 means we will prune 60%). @@ -51,126 +50,6 @@ pruner.compress() *** -## AGP Pruner -This is an iterative pruner, In [To prune, or not to prune: exploring the efficacy of pruning for model compression](https://arxiv.org/abs/1710.01878), authors Michael Zhu and Suyog Gupta provide an algorithm to prune the weight gradually. - ->We introduce a new automated gradual pruning algorithm in which the sparsity is increased from an initial sparsity value si (usually 0) to a final sparsity value sf over a span of n pruning steps, starting at training step t0 and with pruning frequency ∆t: -![](../../img/agp_pruner.png) ->The binary weight masks are updated every ∆t steps as the network is trained to gradually increase the sparsity of the network while allowing the network training steps to recover from any pruning-induced loss in accuracy. In our experience, varying the pruning frequency ∆t between 100 and 1000 training steps had a negligible impact on the final model quality. Once the model achieves the target sparsity sf , the weight masks are no longer updated. The intuition behind this sparsity function in equation - -### Usage -You can prune all weight from 0% to 80% sparsity in 10 epoch with the code below. - -Tensorflow code -```python -from nni.compression.tensorflow import AGP_Pruner -config_list = [{ - 'initial_sparsity': 0, - 'final_sparsity': 0.8, - 'start_epoch': 0, - 'end_epoch': 10, - 'frequency': 1, - 'op_types': 'default' -}] -pruner = AGP_Pruner(tf.get_default_graph(), config_list) -pruner.compress() -``` -PyTorch code -```python -from nni.compression.torch import AGP_Pruner -config_list = [{ - 'initial_sparsity': 0, - 'final_sparsity': 0.8, - 'start_epoch': 0, - 'end_epoch': 10, - 'frequency': 1, - 'op_types': ['default'] -}] -pruner = AGP_Pruner(model, config_list, pruning_algorithm='level') -pruner.compress() -``` - -AGP pruner uses `LevelPruner` algorithms to prune the weight by default, however you can set `pruning_algorithm` parameter to other values to use other pruning algorithms: -* `level`: LevelPruner -* `slim`: SlimPruner -* `l1`: L1FilterPruner -* `l2`: L2FilterPruner -* `fpgm`: FPGMPruner -* `taylorfo`: TaylorFOWeightFilterPruner -* `apoz`: ActivationAPoZRankFilterPruner -* `mean_activation`: ActivationMeanRankFilterPruner - -You should add code below to update epoch number when you finish one epoch in your training code. - -Tensorflow code -```python -pruner.update_epoch(epoch, sess) -``` -PyTorch code -```python -pruner.update_epoch(epoch) -``` -You can view example for more information - -#### User configuration for AGP Pruner -* **initial_sparsity:** This is to specify the sparsity when compressor starts to compress -* **final_sparsity:** This is to specify the sparsity when compressor finishes to compress -* **start_epoch:** This is to specify the epoch number when compressor starts to compress, default start from epoch 0 -* **end_epoch:** This is to specify the epoch number when compressor finishes to compress -* **frequency:** This is to specify every *frequency* number epochs compressor compress once, default frequency=1 - -*** - -## Lottery Ticket Hypothesis -[The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks](https://arxiv.org/abs/1803.03635), authors Jonathan Frankle and Michael Carbin,provides comprehensive measurement and analysis, and articulate the *lottery ticket hypothesis*: dense, randomly-initialized, feed-forward networks contain subnetworks (*winning tickets*) that -- when trained in isolation -- reach test accuracy comparable to the original network in a similar number of iterations. - -In this paper, the authors use the following process to prune a model, called *iterative prunning*: ->1. Randomly initialize a neural network f(x;theta_0) (where theta_0 follows D_{theta}). ->2. Train the network for j iterations, arriving at parameters theta_j. ->3. Prune p% of the parameters in theta_j, creating a mask m. ->4. Reset the remaining parameters to their values in theta_0, creating the winning ticket f(x;m*theta_0). ->5. Repeat step 2, 3, and 4. - -If the configured final sparsity is P (e.g., 0.8) and there are n times iterative pruning, each iterative pruning prunes 1-(1-P)^(1/n) of the weights that survive the previous round. - -### Usage - -PyTorch code -```python -from nni.compression.torch import LotteryTicketPruner -config_list = [{ - 'prune_iterations': 5, - 'sparsity': 0.8, - 'op_types': ['default'] -}] -pruner = LotteryTicketPruner(model, config_list, optimizer) -pruner.compress() -for _ in pruner.get_prune_iterations(): - pruner.prune_iteration_start() - for epoch in range(epoch_num): - ... -``` - -The above configuration means that there are 5 times of iterative pruning. As the 5 times iterative pruning are executed in the same run, LotteryTicketPruner needs `model` and `optimizer` (**Note that should add `lr_scheduler` if used**) to reset their states every time a new prune iteration starts. Please use `get_prune_iterations` to get the pruning iterations, and invoke `prune_iteration_start` at the beginning of each iteration. `epoch_num` is better to be large enough for model convergence, because the hypothesis is that the performance (accuracy) got in latter rounds with high sparsity could be comparable with that got in the first round. - - -*Tensorflow version will be supported later.* - -#### User configuration for LotteryTicketPruner - -* **prune_iterations:** The number of rounds for the iterative pruning, i.e., the number of iterative pruning. -* **sparsity:** The final sparsity when the compression is done. - -### Reproduced Experiment - -We try to reproduce the experiment result of the fully connected network on MNIST using the same configuration as in the paper. The code can be referred [here](https://github.com/microsoft/nni/tree/master/examples/model_compress/lottery_torch_mnist_fc.py). In this experiment, we prune 10 times, for each pruning we train the pruned model for 50 epochs. - -![](../../img/lottery_ticket_mnist_fc.png) - -The above figure shows the result of the fully connected network. `round0-sparsity-0.0` is the performance without pruning. Consistent with the paper, pruning around 80% also obtain similar performance compared to non-pruning, and converges a little faster. If pruning too much, e.g., larger than 94%, the accuracy becomes lower and convergence becomes a little slower. A little different from the paper, the trend of the data in the paper is relatively more clear. - -*** - ## Slim Pruner This is an one-shot pruner, In ['Learning Efficient Convolutional Networks through Network Slimming'](https://arxiv.org/pdf/1708.06519.pdf), authors Zhuang Liu, Jianguo Li, Zhiqiang Shen, Gao Huang, Shoumeng Yan and Changshui Zhang. @@ -208,10 +87,7 @@ The experiments code can be found at [examples/model_compress]( https://github.c *** -## WeightRankFilterPruner -WeightRankFilterPruner is a series of pruners which prune the filters with the smallest importance criterion calculated from the weights in convolution layers to achieve a preset level of network sparsity - -### FPGM Pruner +## FPGM Pruner This is an one-shot pruner, FPGM Pruner is an implementation of paper [Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration](https://arxiv.org/pdf/1811.00250.pdf) @@ -221,7 +97,7 @@ FPGMPruner prune filters with the smallest geometric median >Previous works utilized “smaller-norm-less-important” criterion to prune filters with smaller norm values in a convolutional neural network. In this paper, we analyze this norm-based criterion and point out that its effectiveness depends on two requirements that are not always met: (1) the norm deviation of the filters should be large; (2) the minimum norm of the filters should be small. To solve this problem, we propose a novel filter pruning method, namely Filter Pruning via Geometric Median (FPGM), to compress the model regardless of those two requirements. Unlike previous methods, FPGM compresses CNN models by pruning filters with redundancy, rather than those with “relatively less” importance. -#### Usage +### Usage Tensorflow code ```python @@ -243,26 +119,14 @@ config_list = [{ pruner = FPGMPruner(model, config_list) pruner.compress() ``` -Note: FPGM Pruner is used to prune convolutional layers within deep neural networks, therefore the `op_types` field supports only convolutional layers. - -You should add code below to update epoch number at beginning of each epoch. - -Tensorflow code -```python -pruner.update_epoch(epoch, sess) -``` -PyTorch code -```python -pruner.update_epoch(epoch) -``` -You can view example for more information #### User configuration for FPGM Pruner -* **sparsity:** How much percentage of convolutional filters are to be pruned. +- **sparsity:** How much percentage of convolutional filters are to be pruned. +- **op_types:** Only Conv2d is supported in L1Filter Pruner *** -### L1Filter Pruner +## L1Filter Pruner This is an one-shot pruner, In ['PRUNING FILTERS FOR EFFICIENT CONVNETS'](https://arxiv.org/abs/1608.08710), authors Hao Li, Asim Kadav, Igor Durdanovic, Hanan Samet and Hans Peter Graf. @@ -280,7 +144,7 @@ This is an one-shot pruner, In ['PRUNING FILTERS FOR EFFICIENT CONVNETS'](https: > 4. A new kernel matrix is created for both the ![](http://latex.codecogs.com/gif.latex?i)th and ![](http://latex.codecogs.com/gif.latex?i+1)th layers, and the remaining kernel > weights are copied to the new model. -#### Usage +### Usage PyTorch code @@ -294,9 +158,9 @@ pruner.compress() #### User configuration for L1Filter Pruner - **sparsity:** This is to specify the sparsity operations to be compressed to -- **op_types:** Only Conv1d and Conv2d is supported in L1Filter Pruner +- **op_types:** Only Conv2d is supported in L1Filter Pruner -#### Reproduced Experiment +### Reproduced Experiment We implemented one of the experiments in ['PRUNING FILTERS FOR EFFICIENT CONVNETS'](https://arxiv.org/abs/1608.08710) with **L1FilterPruner**, we pruned **VGG-16** for CIFAR-10 to **VGG-16-pruned-A** in the paper, in which $64\%$ parameters are pruned. Our experiments results are as follows: @@ -309,11 +173,11 @@ The experiments code can be found at [examples/model_compress]( https://github.c *** -### L2Filter Pruner +## L2Filter Pruner This is a structured pruning algorithm that prunes the filters with the smallest L2 norm of the weights. It is implemented as a one-shot pruner. -#### Usage +### Usage PyTorch code @@ -324,25 +188,22 @@ pruner = L2FilterPruner(model, config_list) pruner.compress() ``` -#### User configuration for L2Filter Pruner +### User configuration for L2Filter Pruner - **sparsity:** This is to specify the sparsity operations to be compressed to -- **op_types:** Only Conv1d and Conv2d is supported in L2Filter Pruner +- **op_types:** Only Conv2d is supported in L2Filter Pruner *** -## ActivationRankFilterPruner -ActivationRankFilterPruner is a series of pruners which prune the filters with the smallest importance criterion calculated from the output activations of convolution layers to achieve a preset level of network sparsity. +## ActivationAPoZRankFilterPruner -### ActivationAPoZRankFilterPruner - -We implemented it as a one-shot pruner, it prunes convolutional layers based on the criterion `APoZ` which is explained in the paper [Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures](https://arxiv.org/abs/1607.03250). Iterative pruning based on `APoZ` will be supported in future release. +ActivationAPoZRankFilterPruner is a pruner which prunes the filters with the smallest importance criterion `APoZ` calculated from the output activations of convolution layers to achieve a preset level of network sparsity. The pruning criterion `APoZ` is explained in the paper [Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures](https://arxiv.org/abs/1607.03250). The APoZ is defined as: ![](../../img/apoz.png) -#### Usage +### Usage PyTorch code @@ -360,18 +221,18 @@ Note: ActivationAPoZRankFilterPruner is used to prune convolutional layers withi You can view example for more information -#### User configuration for ActivationAPoZRankFilterPruner +### User configuration for ActivationAPoZRankFilterPruner - **sparsity:** How much percentage of convolutional filters are to be pruned. - **op_types:** Only Conv2d is supported in ActivationAPoZRankFilterPruner *** -### ActivationMeanRankFilterPruner +## ActivationMeanRankFilterPruner -We implemented it as a one-shot pruner, it prunes convolutional layers based on the criterion `mean activation` which is explained in section 2.2 of the paper[Pruning Convolutional Neural Networks for Resource Efficient Inference](https://arxiv.org/abs/1611.06440). Other pruning criteria mentioned in this paper will be supported in future release. +ActivationMeanRankFilterPruner is a pruner which prunes the filters with the smallest importance criterion `mean activation` calculated from the output activations of convolution layers to achieve a preset level of network sparsity. The pruning criterion `mean activation` is explained in section 2.2 of the paper[Pruning Convolutional Neural Networks for Resource Efficient Inference](https://arxiv.org/abs/1611.06440). Other pruning criteria mentioned in this paper will be supported in future release. -#### Usage +### Usage PyTorch code @@ -381,7 +242,7 @@ config_list = [{ 'sparsity': 0.5, 'op_types': ['Conv2d'] }] -pruner = ActivationMeanRankFilterPruner(model, config_list) +pruner = ActivationMeanRankFilterPruner(model, config_list, statistics_batch_num=1) pruner.compress() ``` @@ -389,26 +250,22 @@ Note: ActivationMeanRankFilterPruner is used to prune convolutional layers withi You can view example for more information -#### User configuration for ActivationMeanRankFilterPruner +### User configuration for ActivationMeanRankFilterPruner - **sparsity:** How much percentage of convolutional filters are to be pruned. - **op_types:** Only Conv2d is supported in ActivationMeanRankFilterPruner. *** -## GradientRankFilterPruner - -GradientRankFilterPruner is a series of pruners which prune the filters with the smallest importance criterion calculated from the gradients of convolution layers to achieve a preset level of network sparsity. +## TaylorFOWeightFilterPruner -### TaylorFOWeightFilterPruner - -We implemented it as a one-shot pruner, it prunes convolutional layers based on the first order taylor expansion on weights. The estimated importance of filters is defined as the paper [Importance Estimation for Neural Network Pruning](http://jankautz.com/publications/Importance4NNPruning_CVPR19.pdf). Other pruning criteria mentioned in this paper will be supported in future release. +TaylorFOWeightFilterPruner is a pruner which prunes convolutional layers based on estimated importance calculated from the first order taylor expansion on weights to achieve a preset level of network sparsity. The estimated importance of filters is defined as the paper [Importance Estimation for Neural Network Pruning](http://jankautz.com/publications/Importance4NNPruning_CVPR19.pdf). Other pruning criteria mentioned in this paper will be supported in future release. > ![](../../img/importance_estimation_sum.png) -#### Usage +### Usage PyTorch code @@ -418,17 +275,128 @@ config_list = [{ 'sparsity': 0.5, 'op_types': ['Conv2d'] }] -pruner = TaylorFOWeightFilterPruner(model, config_list, optimizer) +pruner = TaylorFOWeightFilterPruner(model, config_list, statistics_batch_num=1) pruner.compress() ``` You can view example for more information -#### User configuration for GradientWeightSumFilterPruner +### User configuration for TaylorFOWeightFilterPruner - **sparsity:** How much percentage of convolutional filters are to be pruned. - **op_types:** Currently only Conv2d is supported in TaylorFOWeightFilterPruner. +*** + +## AGP Pruner +This is an iterative pruner, In [To prune, or not to prune: exploring the efficacy of pruning for model compression](https://arxiv.org/abs/1710.01878), authors Michael Zhu and Suyog Gupta provide an algorithm to prune the weight gradually. + +>We introduce a new automated gradual pruning algorithm in which the sparsity is increased from an initial sparsity value si (usually 0) to a final sparsity value sf over a span of n pruning steps, starting at training step t0 and with pruning frequency ∆t: +![](../../img/agp_pruner.png) +>The binary weight masks are updated every ∆t steps as the network is trained to gradually increase the sparsity of the network while allowing the network training steps to recover from any pruning-induced loss in accuracy. In our experience, varying the pruning frequency ∆t between 100 and 1000 training steps had a negligible impact on the final model quality. Once the model achieves the target sparsity sf , the weight masks are no longer updated. The intuition behind this sparsity function in equation + +### Usage +You can prune all weight from 0% to 80% sparsity in 10 epoch with the code below. + +PyTorch code +```python +from nni.compression.torch import AGP_Pruner +config_list = [{ + 'initial_sparsity': 0, + 'final_sparsity': 0.8, + 'start_epoch': 0, + 'end_epoch': 10, + 'frequency': 1, + 'op_types': ['default'] +}] + +# load a pretrained model or train a model before using a pruner +# model = MyModel() +# model.load_state_dict(torch.load('mycheckpoint.pth')) + +# AGP pruner prunes model while fine tuning the model by adding a hook on +# optimizer.step(), so an optimizer is required to prune the model. +optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9, weight_decay=1e-4) + +pruner = AGP_Pruner(model, config_list, optimizer, pruning_algorithm='level') +pruner.compress() +``` + +AGP pruner uses `LevelPruner` algorithms to prune the weight by default, however you can set `pruning_algorithm` parameter to other values to use other pruning algorithms: +* `level`: LevelPruner +* `slim`: SlimPruner +* `l1`: L1FilterPruner +* `l2`: L2FilterPruner +* `fpgm`: FPGMPruner +* `taylorfo`: TaylorFOWeightFilterPruner +* `apoz`: ActivationAPoZRankFilterPruner +* `mean_activation`: ActivationMeanRankFilterPruner + +You should add code below to update epoch number when you finish one epoch in your training code. + +PyTorch code +```python +pruner.update_epoch(epoch) +``` +You can view example for more information + +#### User configuration for AGP Pruner +* **initial_sparsity:** This is to specify the sparsity when compressor starts to compress +* **final_sparsity:** This is to specify the sparsity when compressor finishes to compress +* **start_epoch:** This is to specify the epoch number when compressor starts to compress, default start from epoch 0 +* **end_epoch:** This is to specify the epoch number when compressor finishes to compress +* **frequency:** This is to specify every *frequency* number epochs compressor compress once, default frequency=1 + +*** + +## Lottery Ticket Hypothesis +[The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks](https://arxiv.org/abs/1803.03635), authors Jonathan Frankle and Michael Carbin,provides comprehensive measurement and analysis, and articulate the *lottery ticket hypothesis*: dense, randomly-initialized, feed-forward networks contain subnetworks (*winning tickets*) that -- when trained in isolation -- reach test accuracy comparable to the original network in a similar number of iterations. + +In this paper, the authors use the following process to prune a model, called *iterative prunning*: +>1. Randomly initialize a neural network f(x;theta_0) (where theta_0 follows D_{theta}). +>2. Train the network for j iterations, arriving at parameters theta_j. +>3. Prune p% of the parameters in theta_j, creating a mask m. +>4. Reset the remaining parameters to their values in theta_0, creating the winning ticket f(x;m*theta_0). +>5. Repeat step 2, 3, and 4. + +If the configured final sparsity is P (e.g., 0.8) and there are n times iterative pruning, each iterative pruning prunes 1-(1-P)^(1/n) of the weights that survive the previous round. + +### Usage + +PyTorch code +```python +from nni.compression.torch import LotteryTicketPruner +config_list = [{ + 'prune_iterations': 5, + 'sparsity': 0.8, + 'op_types': ['default'] +}] +pruner = LotteryTicketPruner(model, config_list, optimizer) +pruner.compress() +for _ in pruner.get_prune_iterations(): + pruner.prune_iteration_start() + for epoch in range(epoch_num): + ... +``` + +The above configuration means that there are 5 times of iterative pruning. As the 5 times iterative pruning are executed in the same run, LotteryTicketPruner needs `model` and `optimizer` (**Note that should add `lr_scheduler` if used**) to reset their states every time a new prune iteration starts. Please use `get_prune_iterations` to get the pruning iterations, and invoke `prune_iteration_start` at the beginning of each iteration. `epoch_num` is better to be large enough for model convergence, because the hypothesis is that the performance (accuracy) got in latter rounds with high sparsity could be comparable with that got in the first round. + + +*Tensorflow version will be supported later.* + +#### User configuration for LotteryTicketPruner + +* **prune_iterations:** The number of rounds for the iterative pruning, i.e., the number of iterative pruning. +* **sparsity:** The final sparsity when the compression is done. + +### Reproduced Experiment + +We try to reproduce the experiment result of the fully connected network on MNIST using the same configuration as in the paper. The code can be referred [here](https://github.com/microsoft/nni/tree/master/examples/model_compress/lottery_torch_mnist_fc.py). In this experiment, we prune 10 times, for each pruning we train the pruned model for 50 epochs. + +![](../../img/lottery_ticket_mnist_fc.png) + +The above figure shows the result of the fully connected network. `round0-sparsity-0.0` is the performance without pruning. Consistent with the paper, pruning around 80% also obtain similar performance compared to non-pruning, and converges a little faster. If pruning too much, e.g., larger than 94%, the accuracy becomes lower and convergence becomes a little slower. A little different from the paper, the trend of the data in the paper is relatively more clear. +   \ No newline at end of file diff --git a/docs/en_US/model_compression.rst b/docs/en_US/model_compression.rst index a1d4f01b8c..e297f0e60e 100644 --- a/docs/en_US/model_compression.rst +++ b/docs/en_US/model_compression.rst @@ -22,4 +22,5 @@ For details, please refer to the following tutorials: Automatic Model Compression Model Speedup Compression Utilities + Compression Framework Customize Compression Algorithms diff --git a/docs/img/compressor_framework.jpg b/docs/img/compressor_framework.jpg new file mode 100644 index 0000000000000000000000000000000000000000..116eaa7111e26765067e0bb85363f8bfd2b25c6f GIT binary patch literal 93903 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

  • &@s}iy9Ha4u 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 Date: Tue, 30 Jun 2020 02:01:29 +0800 Subject: [PATCH 2/6] update picture --- docs/img/compressor_framework.jpg | Bin 93903 -> 105277 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/img/compressor_framework.jpg b/docs/img/compressor_framework.jpg index 116eaa7111e26765067e0bb85363f8bfd2b25c6f..4528f3a49eb1e54281f3c7c166c249e6b1e040df 100644 GIT binary patch literal 105277 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 OpPljfd*;Aq@Bahf;kgI^ literal 93903 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

  • &@s}iy9Ha4u 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 Date: Tue, 30 Jun 2020 02:04:59 +0800 Subject: [PATCH 3/6] updates --- docs/en_US/Compressor/Framework.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en_US/Compressor/Framework.md b/docs/en_US/Compressor/Framework.md index 16abb0566f..b80aaa8bf3 100644 --- a/docs/en_US/Compressor/Framework.md +++ b/docs/en_US/Compressor/Framework.md @@ -32,7 +32,7 @@ model = pruner.compress() # the model will be pruned during training automatically ``` -To use a quntizer: +To use a quantizer: ```python from nni.compression.torch import DoReFaQuantizer @@ -90,6 +90,7 @@ collector_id = self.pruner.add_activation_collector(collector) self.pruner.remove_activation_collector(collector_id) ``` +*** ## Pruner From 7c955dcacce84863a4dffe56003e7e58541928c5 Mon Sep 17 00:00:00 2001 From: Chengmin Chi Date: Tue, 30 Jun 2020 02:08:28 +0800 Subject: [PATCH 4/6] updates --- docs/en_US/model_compression.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en_US/model_compression.rst b/docs/en_US/model_compression.rst index e297f0e60e..e594ba1fb7 100644 --- a/docs/en_US/model_compression.rst +++ b/docs/en_US/model_compression.rst @@ -23,4 +23,4 @@ For details, please refer to the following tutorials: Model Speedup Compression Utilities Compression Framework - Customize Compression Algorithms + Customize Compression Algorithms From b3b5c9983f358c3d4d30ed45ab89033a44e9703a Mon Sep 17 00:00:00 2001 From: Chengmin Chi Date: Tue, 30 Jun 2020 12:15:51 +0800 Subject: [PATCH 5/6] updates --- docs/en_US/Compressor/Framework.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en_US/Compressor/Framework.md b/docs/en_US/Compressor/Framework.md index b80aaa8bf3..6b271343b5 100644 --- a/docs/en_US/Compressor/Framework.md +++ b/docs/en_US/Compressor/Framework.md @@ -48,6 +48,7 @@ quantizer = DoReFaQuantizer(model, configure_list, optimizer) quantizer.compress() ``` +View [example code](https://github.com/microsoft/nni/tree/master/examples/model_compress) for more information. `Compressor` class provides some utility methods for subclass and users: From b4586235e39c6303c85cbf9464e36435c0038715 Mon Sep 17 00:00:00 2001 From: Scarlett Li <39592018+scarlett2018@users.noreply.github.com> Date: Tue, 30 Jun 2020 13:51:04 +0800 Subject: [PATCH 6/6] Update CustomizeCompressor.md --- docs/en_US/Compressor/CustomizeCompressor.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en_US/Compressor/CustomizeCompressor.md b/docs/en_US/Compressor/CustomizeCompressor.md index 77034f1b38..407e103677 100644 --- a/docs/en_US/Compressor/CustomizeCompressor.md +++ b/docs/en_US/Compressor/CustomizeCompressor.md @@ -1,12 +1,12 @@ -# Customize A New Compression Algorithm +# Customize New Compression Algorithm ```eval_rst .. contents:: ``` -To simplify writing a new compression algorithm, we design programming interfaces which are simple but flexible enough. There are interfaces for pruning and quantization respectively. Below, we first demonstrate how to customize a new pruning algorithm and then demonstrate how to customize a new quantization algorithm. +In order to simplify the process of writing new compression algorithms, we have designed simple and flexible programming interface, which covers pruning and quantization. Below, we first demonstrate how to customize a new pruning algorithm and then demonstrate how to customize a new quantization algorithm. -To better demonstrate how to customize a new pruning/quantization algorithm, it is necessary for users to first understand the framework for supporting various pruning algorithms in NNI. Reference [Framework overview of model compression](https://nni.readthedocs.io/en/latest/Compressor/Framework.html) +**Important Note** To better understand how to customize new pruning/quantization algorithms, users should first understand the framework that supports various pruning algorithms in NNI. Reference [Framework overview of model compression](https://nni.readthedocs.io/en/latest/Compressor/Framework.html) ## Customize a new pruning algorithm @@ -178,4 +178,4 @@ class YourQuantizer(Quantizer): ``` If you do not customize `QuantGrad`, the default backward is Straight-Through Estimator. -_Coming Soon_ ... \ No newline at end of file +_Coming Soon_ ...