QuickStart.rst 4.95 KB
Newer Older
1
.. a67033195635ebcd510103eab8703b6a
2

kvartet's avatar
kvartet committed
3
4
快速入门
===========
kvartet's avatar
kvartet committed
5

kvartet's avatar
kvartet committed
6
7
..  toctree::
    :hidden:
kvartet's avatar
kvartet committed
8

9
    Notebook Example <compression_pipeline_example>
kvartet's avatar
kvartet committed
10
11


12
13
14
15
模型压缩通常包括三个阶段:1)预训练模型,2)压缩模型,3)微调模型。 NNI 主要关注于第二阶段,并为模型压缩提供易于使用的 API
遵循本指南,您将快速了解如何使用 NNI 来压缩模型。
更深入地了解 NNI 中的模型压缩模块,请查看 `Tutorial <./Tutorial.rst>`__
提供了一个在 Jupyter notebook 中进行完整的模型压缩流程的 `示例 <./compression_pipeline_example.rst>`__,参考 :githublink:`代码 <examples/notebooks/compression_pipeline_example.ipynb>`
kvartet's avatar
kvartet committed
16

kvartet's avatar
kvartet committed
17
18
模型剪枝
-------------
kvartet's avatar
kvartet committed
19

kvartet's avatar
kvartet committed
20
这里通过 `level pruner <../Compression/Pruner.rst#level-pruner>`__ 举例说明 NNI 中模型剪枝的用法。
kvartet's avatar
kvartet committed
21

kvartet's avatar
kvartet committed
22
23
Step1. 编写配置
^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
24

25
编写配置来指定要剪枝的层。以下配置表示剪枝所有的 ``default`` 层,稀疏度设为 0.5,其它层保持不变。
kvartet's avatar
kvartet committed
26
27
28

.. code-block:: python

kvartet's avatar
kvartet committed
29
30
31
32
   config_list = [{
       'sparsity': 0.5,
       'op_types': ['default'],
   }]
kvartet's avatar
kvartet committed
33

34
35
配置说明在 `这里 <./Tutorial.rst#specify-the-configuration>`__。注意,不同的 Pruner 可能有自定义的配置字段。
详情参考每个 Pruner  `具体用法 <./Pruner.rst>`__,来调整相应的配置。
kvartet's avatar
kvartet committed
36

kvartet's avatar
kvartet committed
37
38
Step2. 选择 Pruner 来压缩模型
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
39

40
41
首先,使用模型来初始化 Pruner,并将配置作为参数传入,然后调用 ``compress()`` 来压缩模型。
请注意,有些算法可能会检查训练过程中的梯度,因此我们可能会定义一组 trainer, optimizer, criterion 并传递给 Pruner
kvartet's avatar
kvartet committed
42
43
44
45
46

.. code-block:: python

   from nni.algorithms.compression.pytorch.pruning import LevelPruner

47
   pruner = LevelPruner(model, config_list)
kvartet's avatar
kvartet committed
48
   model = pruner.compress()
kvartet's avatar
kvartet committed
49

50
51
52
然后,使用正常的训练方法来训练模型 (如,SGD),剪枝在训练过程中是透明的。
有些 Pruner(如 L1FilterPrunerFPGMPruner)在开始时修剪一次,下面的训练可以看作是微调。
有些 Pruner(例如AGPPruner)会迭代的对模型剪枝,在训练过程中逐步修改掩码。
kvartet's avatar
kvartet committed
53

54
如果使用 Pruner 进行迭代剪枝,或者剪枝过程中需要训练或者推理,则需要将 finetune 逻辑传到 Pruner 中。
kvartet's avatar
kvartet committed
55

kvartet's avatar
kvartet committed
56
例如:
kvartet's avatar
kvartet committed
57

kvartet's avatar
kvartet committed
58
.. code-block:: python
kvartet's avatar
kvartet committed
59

60
   from nni.algorithms.compression.pytorch.pruning import AGPPruner
kvartet's avatar
kvartet committed
61

62
63
   pruner = AGPPruner(model, config_list, optimizer, trainer, criterion, num_iterations=10, epochs_per_iteration=1, pruning_algorithm='level')
   model = pruner.compress()
kvartet's avatar
kvartet committed
64
65


kvartet's avatar
kvartet committed
66
67
Step3. 导出压缩结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
68

kvartet's avatar
kvartet committed
69
训练之后,可将模型权重导出到文件,同时将生成的掩码也导出到文件, 也支持导出 ONNX 模型。
kvartet's avatar
kvartet committed
70
71
72

.. code-block:: python

kvartet's avatar
kvartet committed
73
   pruner.export_model(model_path='pruned_vgg19_cifar10.pth', mask_path='mask_vgg19_cifar10.pth')
kvartet's avatar
kvartet committed
74

kvartet's avatar
kvartet committed
75
参考 :githublink:`mnist 示例 <examples/model_compress/pruning/naive_prune_torch.py>` 获取代码。
kvartet's avatar
kvartet committed
76

kvartet's avatar
kvartet committed
77
更多剪枝算法的示例在 :githublink:`basic_pruners_torch <examples/model_compress/pruning/basic_pruners_torch.py>`  :githublink:`auto_pruners_torch <examples/model_compress/pruning/auto_pruners_torch.py>`
kvartet's avatar
kvartet committed
78
79


kvartet's avatar
kvartet committed
80
81
模型量化
------------------
kvartet's avatar
kvartet committed
82

kvartet's avatar
kvartet committed
83
这里通过 `QAT  Quantizer <../Compression/Quantizer.rst#qat-quantizer>`__ 举例说明在 NNI 中量化的用法。
kvartet's avatar
kvartet committed
84

kvartet's avatar
kvartet committed
85
86
Step1. 编写配置
^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
87

kvartet's avatar
kvartet committed
88
.. code-block:: python
kvartet's avatar
kvartet committed
89

kvartet's avatar
kvartet committed
90
   config_list = [{
91
       'quant_types': ['weight', 'input'],
kvartet's avatar
kvartet committed
92
       'quant_bits': {
kvartet's avatar
kvartet committed
93
           'weight': 8,
94
           'input': 8,
kvartet's avatar
kvartet committed
95
       }, # 这里可以仅使用 `int`,因为所有 `quan_types` 使用了一样的位长,参考下方 `ReLu6` 配置。
96
97
98
       'op_types':['Conv2d', 'Linear'],
       'quant_dtype': 'int',
       'quant_scheme': 'per_channel_symmetric'
kvartet's avatar
kvartet committed
99
100
101
102
   }, {
       'quant_types': ['output'],
       'quant_bits': 8,
       'quant_start_step': 7000,
103
104
105
       'op_types':['ReLU6'],
       'quant_dtype': 'uint',
       'quant_scheme': 'per_tensor_affine'
kvartet's avatar
kvartet committed
106
   }]
kvartet's avatar
kvartet committed
107

kvartet's avatar
kvartet committed
108
配置说明在 `这里 <./Tutorial.rst#quantization-specific-keys>`__
kvartet's avatar
kvartet committed
109

kvartet's avatar
kvartet committed
110
111
Step2. 选择 Quantizer 来压缩模型
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
112

kvartet's avatar
kvartet committed
113
.. code-block:: python
kvartet's avatar
kvartet committed
114

kvartet's avatar
kvartet committed
115
   from nni.algorithms.compression.pytorch.quantization import QAT_Quantizer
kvartet's avatar
kvartet committed
116

kvartet's avatar
kvartet committed
117
118
   quantizer = QAT_Quantizer(model, config_list)
   quantizer.compress()
kvartet's avatar
kvartet committed
119
120


kvartet's avatar
kvartet committed
121
122
Step3. 导出压缩结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
123

kvartet's avatar
kvartet committed
124
在训练和校准之后,你可以将模型权重导出到一个文件,并将生成的校准参数也导出到一个文件。 也支持导出 ONNX 模型。
kvartet's avatar
kvartet committed
125
126
127

.. code-block:: python

kvartet's avatar
kvartet committed
128
   calibration_config = quantizer.export_model(model_path, calibration_path, onnx_path, input_shape, device)
kvartet's avatar
kvartet committed
129
130

参考 :githublink:`mnist example <examples/model_compress/quantization/QAT_torch_quantizer.py>` 获取示例代码。
kvartet's avatar
kvartet committed
131

kvartet's avatar
kvartet committed
132
恭喜! 您已经通过 NNI 压缩了您的第一个模型。 更深入地了解 NNI 中的模型压缩,请查看 `Tutorial <./Tutorial.rst>`__