"vscode:/vscode.git/clone" did not exist on "f14cfd4554abfcd4cbbb83cc4e666f6108c86417"
QuickStart.rst 4.73 KB
Newer Older
kvartet's avatar
kvartet committed
1
2
快速入门
===========
kvartet's avatar
kvartet committed
3

kvartet's avatar
kvartet committed
4
5
..  toctree::
    :hidden:
kvartet's avatar
kvartet committed
6

kvartet's avatar
kvartet committed
7
    教程 <Tutorial>
kvartet's avatar
kvartet committed
8
9


kvartet's avatar
kvartet committed
10
模型压缩通常包括三个阶段:1)预训练模型,2)压缩模型,3)微调模型。 NNI 主要关注于第二阶段,并为模型压缩提供非常简单的 API 遵循本指南,快速了解如何使用 NNI 压缩模型。 NNI 主要关注于第二阶段,并为模型压缩提供非常简单的 API 恭喜! 您已经通过 NNI 压缩了您的第一个模型。 更深入地了解 NNI 中的模型压缩,请查看 `Tutorial <./Tutorial.rst>`__ 
kvartet's avatar
kvartet committed
11

kvartet's avatar
kvartet committed
12
13
模型剪枝
-------------
kvartet's avatar
kvartet committed
14

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

kvartet's avatar
kvartet committed
17
18
Step1. 编写配置
^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
19

kvartet's avatar
kvartet committed
20
编写配置来指定要剪枝的层。以下配置表示剪枝所有的 ``default`` 操作,稀疏度设为 0.5,其它层保持不变。
kvartet's avatar
kvartet committed
21
22
23

.. code-block:: python

kvartet's avatar
kvartet committed
24
25
26
27
   config_list = [{
       'sparsity': 0.5,
       'op_types': ['default'],
   }]
kvartet's avatar
kvartet committed
28

kvartet's avatar
kvartet committed
29
配置说明在 `这里 <./Tutorial.rst#quantization-specific-keys>`__ 注意,不同的 Pruner 可能有自定义的配置字段,例如,AGP Pruner  ``start_epoch`` 详情参考每个 Pruner  `用法 <./Pruner.rst>`__,来调整相应的配置。
kvartet's avatar
kvartet committed
30

kvartet's avatar
kvartet committed
31
32
Step2. 选择 Pruner 来压缩模型
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
33

kvartet's avatar
kvartet committed
34
首先,使用模型来初始化 Pruner,并将配置作为参数传入,然后调用 ``compress()`` 来压缩模型。 请注意,有些算法可能会检查压缩的梯度,因此我们还定义了一个优化器并传递给 Pruner
kvartet's avatar
kvartet committed
35
36
37
38
39

.. code-block:: python

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

kvartet's avatar
kvartet committed
40
41
   pruner = LevelPruner(model, config_list, optimizer_finetune)
   model = pruner.compress()
kvartet's avatar
kvartet committed
42

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

kvartet's avatar
kvartet committed
45
注意,``pruner.compress`` 只会在模型权重上直接增加掩码,不包括调优的逻辑。 如果要想调优压缩后的模型,需要在 ``pruner.compress`` 后增加调优的逻辑。
kvartet's avatar
kvartet committed
46

kvartet's avatar
kvartet committed
47
例如:
kvartet's avatar
kvartet committed
48

kvartet's avatar
kvartet committed
49
.. code-block:: python
kvartet's avatar
kvartet committed
50

kvartet's avatar
kvartet committed
51
52
53
54
   for epoch in range(1, args.epochs + 1):
        pruner.update_epoch(epoch)
        train(args, model, device, train_loader, optimizer_finetune, epoch)
        test(model, device, test_loader)
kvartet's avatar
kvartet committed
55

kvartet's avatar
kvartet committed
56
更多关于微调的 API  `这里 <./Tutorial.rst#api>`__ 
kvartet's avatar
kvartet committed
57
58


kvartet's avatar
kvartet committed
59
60
Step3. 导出压缩结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
61

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

.. code-block:: python

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

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

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


kvartet's avatar
kvartet committed
73
74
模型量化
------------------
kvartet's avatar
kvartet committed
75

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

kvartet's avatar
kvartet committed
78
79
Step1. 编写配置
^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
80

kvartet's avatar
kvartet committed
81
.. code-block:: python
kvartet's avatar
kvartet committed
82

kvartet's avatar
kvartet committed
83
84
85
   config_list = [{
       'quant_types': ['weight'],
       'quant_bits': {
kvartet's avatar
kvartet committed
86
           'weight': 8,
kvartet's avatar
kvartet committed
87
88
89
90
91
92
93
94
       }, # 这里可以仅使用 `int`,因为所有 `quan_types` 使用了一样的位长,参考下方 `ReLu6` 配置。
       'op_types':['Conv2d', 'Linear']
   }, {
       'quant_types': ['output'],
       'quant_bits': 8,
       'quant_start_step': 7000,
       'op_types':['ReLU6']
   }]
kvartet's avatar
kvartet committed
95

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

kvartet's avatar
kvartet committed
98
99
Step2. 选择 Quantizer 来压缩模型
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
100

kvartet's avatar
kvartet committed
101
.. code-block:: python
kvartet's avatar
kvartet committed
102

kvartet's avatar
kvartet committed
103
   from nni.algorithms.compression.pytorch.quantization import QAT_Quantizer
kvartet's avatar
kvartet committed
104

kvartet's avatar
kvartet committed
105
106
   quantizer = QAT_Quantizer(model, config_list)
   quantizer.compress()
kvartet's avatar
kvartet committed
107
108


kvartet's avatar
kvartet committed
109
110
Step3. 导出压缩结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
111

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

.. code-block:: python

kvartet's avatar
kvartet committed
116
   calibration_config = quantizer.export_model(model_path, calibration_path, onnx_path, input_shape, device)
kvartet's avatar
kvartet committed
117
118

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

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