QuickStart_zh.rst 4.97 KB
Newer Older
1
.. 98b0285bbfe1a01c90b9ba6a9b0d6caa
2

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

6
.. code-block::
kvartet's avatar
kvartet committed
7

8
9
   ..  toctree::
      :hidden:
kvartet's avatar
kvartet committed
10

11
      Notebook Example <compression_pipeline_example>
kvartet's avatar
kvartet committed
12

13
14
15
16

模型压缩通常包括三个阶段: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
17

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

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

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

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

.. code-block:: python

kvartet's avatar
kvartet committed
30
31
32
33
   config_list = [{
       'sparsity': 0.5,
       'op_types': ['default'],
   }]
kvartet's avatar
kvartet committed
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
首先,使用模型来初始化 Pruner,并将配置作为参数传入,然后调用 ``compress()`` 来压缩模型。请注意,有些算法可能会检查训练过程中的梯度,因此我们可能会定义一组 trainer, optimizer, criterion 并传递给 Pruner
kvartet's avatar
kvartet committed
41
42
43
44
45

.. code-block:: python

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

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

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

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

kvartet's avatar
kvartet committed
53
例如:
kvartet's avatar
kvartet committed
54

kvartet's avatar
kvartet committed
55
.. code-block:: python
kvartet's avatar
kvartet committed
56

57
   from nni.algorithms.compression.pytorch.pruning import AGPPruner
kvartet's avatar
kvartet committed
58

59
60
   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
61

kvartet's avatar
kvartet committed
62
63
Step3. 导出压缩结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
64

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

.. code-block:: python

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

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

kvartet's avatar
kvartet committed
73
更多剪枝算法的示例在 :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
74
75


kvartet's avatar
kvartet committed
76
77
模型量化
------------------
kvartet's avatar
kvartet committed
78

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

kvartet's avatar
kvartet committed
81
82
Step1. 编写配置
^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
83

kvartet's avatar
kvartet committed
84
.. code-block:: python
kvartet's avatar
kvartet committed
85

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

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

kvartet's avatar
kvartet committed
106
107
Step2. 选择 Quantizer 来压缩模型
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
108

kvartet's avatar
kvartet committed
109
.. code-block:: python
kvartet's avatar
kvartet committed
110

kvartet's avatar
kvartet committed
111
   from nni.algorithms.compression.pytorch.quantization import QAT_Quantizer
kvartet's avatar
kvartet committed
112

kvartet's avatar
kvartet committed
113
114
   quantizer = QAT_Quantizer(model, config_list)
   quantizer.compress()
kvartet's avatar
kvartet committed
115
116


kvartet's avatar
kvartet committed
117
118
Step3. 导出压缩结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
119

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

.. code-block:: python

kvartet's avatar
kvartet committed
124
   calibration_config = quantizer.export_model(model_path, calibration_path, onnx_path, input_shape, device)
kvartet's avatar
kvartet committed
125
126

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

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