Quantizer.rst 7.2 KB
Newer Older
kvartet's avatar
kvartet committed
1
2
3
4
5
6
7
8
9
10
支持的量化算法
========================================

支持的量化算法列表


* `Naive Quantizer <#naive-quantizer>`__
* `QAT Quantizer <#qat-quantizer>`__
* `DoReFa Quantizer <#dorefa-quantizer>`__
* `BNN Quantizer <#bnn-quantizer>`__
kvartet's avatar
kvartet committed
11
* `LSQ Quantizer <#lsq-quantizer>`__
kvartet's avatar
kvartet committed
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

Naive Quantizer
---------------

Naive Quantizer  Quantizer 权重默认设置为 8 位,可用它来测试量化算法。

用法
^^^^^

PyTorch

.. code-block:: python

   model = nni.algorithms.compression.pytorch.quantization.NaiveQuantizer(model).compress()

----

QAT Quantizer
-------------

 `Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference <http://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf>`__ 中,作者 Benoit Jacob  Skirmantas Kligys 提出了一种算法在训练中量化模型。

..

   我们提出了一种方法,在训练的前向过程中模拟量化效果。 此方法不影响反向传播,所有权重和偏差都使用了浮点数保存,因此能很容易的进行量化。 然后,前向传播通过实现浮点算法的舍入操作,来在推理引擎中模拟量化的推理。


   * 权重在与输入卷积操作前进行量化。 如果在层中使用了批量归一化(参考 [17]),批量归一化参数会被在量化前被“折叠”到权重中。
   * 激活操作在推理时会被量化。 例如,在激活函数被应用到卷积或全连接层输出之后,或在增加旁路连接,或连接多个层的输出之后(如:ResNet)。


用法
^^^^^

可在训练代码前将模型量化为 8 位。

PyTorch 代码

.. code-block:: python

   from nni.algorithms.compression.pytorch.quantization import QAT_Quantizer
   model = Mnist()

   config_list = [{
       'quant_types': ['weight'],
       'quant_bits': {
           'weight': 8,
       }, # 这里可以仅使用 `int`,因为所有 `quan_types` 使用了一样的位长,参考下方 `ReLu6` 配置。
       'op_types':['Conv2d', 'Linear']
   }, {
       'quant_types': ['output'],
       'quant_bits': 8,
       'quant_start_step': 7000,
       'op_types':['ReLU6']
   }]
   quantizer = QAT_Quantizer(model, config_list)
   quantizer.compress()

查看示例进一步了解

QAT Quantizer 的用户配置
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

压缩算法的公共配置可在 `config_list 说明 <./QuickStart.rst>`__ 中找到。

此算法所需的配置:


* **quant_start_step:** int

在运行到某步骤前,对模型禁用量化。这让网络在进入更稳定的
状态后再激活量化,这样不会配除掉一些分数显著的值,默认为 0

注意
^^^^

当前不支持批处理规范化折叠。

kvartet's avatar
kvartet committed
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
----

LSQ Quantizer
-------------

 `可训练的步长量化 <https://arxiv.org/pdf/1902.08153.pdf>`__\ 中,作者 Steven K. Esser  Jeffrey L. McKinstry 提供一种算法来训练带有梯度的尺度。

..

   作者介绍了一种新颖的方法来估计和缩放每个权重和激活层的量化器步长的任务损失梯度,使得它可以与其他网络参数结合使用。


用法
^^^^^
您可以在训练代码之前添加下面的代码。 必须完成三件事:


1. 配置哪一层要被量化,以及该层的哪个张量(输入/输出/权重)要被量化。
2. 构建 lsq quantizer
3. 调用 `compress` API


PyTorch 代码

.. code-block:: python

    from nni.algorithms.compression.pytorch.quantization import LsqQuantizer
    model = Mnist()

    configure_list = [{
            'op_types': 'default'
            'quant_bits': {
                'weight': 8,
                'input': 8,
            },
            'op_names': ['conv1']
        }, {
            'quant_types': ['output'],
            'quant_bits': {'output': 8,},
            'op_names': ['relu1']
    }]

    quantizer = LsqQuantizer(model, configure_list, optimizer)
    quantizer.compress()

查看示例了解更多信息 :githublink:`examples/model_compress/quantization/LSQ_torch_quantizer.py <examples/model_compress/quantization/LSQ_torch_quantizer.py>`

LSQ Quantizer 的用户配置
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

压缩算法的公共配置可在 `config_list 说明 <./QuickStart.rst>`__ 中找到。

此算法所需的配置:


kvartet's avatar
kvartet committed
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
----

DoReFa Quantizer
----------------

 `DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients <https://arxiv.org/abs/1606.06160>`__ 中,作者 Shuchang Zhou  Yuxin Wu 提出了 DoReFa 算法在训练时量化权重,激活函数和梯度。

用法
^^^^^

要实现 DoReFa Quantizer,在训练代码前加入以下代码。

PyTorch 代码

.. code-block:: python

   from nni.algorithms.compression.pytorch.quantization import DoReFaQuantizer
   config_list = [{ 
       'quant_types': ['weight'],
       'quant_bits': 8, 
kvartet's avatar
kvartet committed
165
       'op_types': ['default'] 
kvartet's avatar
kvartet committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
   }]
   quantizer = DoReFaQuantizer(model, config_list)
   quantizer.compress()

查看示例进一步了解

DoReFa Quantizer 的用户配置
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

压缩算法的公共配置可在 `config_list 说明 <./QuickStart.rst>`__ 中找到。

此算法所需的配置:

----

BNN Quantizer
-------------

 `Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1 <https://arxiv.org/abs/1602.02830>`__  

..

   引入了一种训练二进制神经网络(BNN)的方法 - 神经网络在运行时使用二进制权重。 在训练时,二进制权重和激活用于计算参数梯度。  forward 过程中,BNN 会大大减少内存大小和访问,并将大多数算术运算替换为按位计算,可显著提高能源效率。


用法
^^^^^

PyTorch 代码

.. code-block:: python

   from nni.algorithms.compression.pytorch.quantization import BNNQuantizer
   model = VGG_Cifar10(num_classes=10)

   configure_list = [{
       'quant_bits': 1,
       'quant_types': ['weight'],
       'op_types': ['Conv2d', 'Linear'],
       'op_names': ['features.0', 'features.3', 'features.7', 'features.10', 'features.14', 'features.17', 'classifier.0', 'classifier.3']
   }, {
       'quant_bits': 1,
       'quant_types': ['output'],
       'op_types': ['Hardtanh'],
       'op_names': ['features.6', 'features.9', 'features.13', 'features.16', 'features.20', 'classifier.2', 'classifier.5']
   }]

   quantizer = BNNQuantizer(model, configure_list)
   model = quantizer.compress()

kvartet's avatar
kvartet committed
216
可以查看 :githublink:`示例 <examples/model_compress/quantization/BNN_quantizer_cifar10.py>` 了解更多信息。
kvartet's avatar
kvartet committed
217
218

BNN Quantizer 的用户配置
kvartet's avatar
kvartet committed
219
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
kvartet's avatar
kvartet committed
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239

压缩算法的公共配置可在 `config_list 说明 <./QuickStart.rst>`__ 中找到。

此算法所需的配置:

实验
^^^^^^^^^^

我们实现了 `Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1 <https://arxiv.org/abs/1602.02830>`__ 中的一个实验,对 CIFAR-10 上的 **VGGNet** 进行了量化操作。 我们的实验结果如下:

.. list-table::
   :header-rows: 1
   :widths: auto

   * - 模型
     - 准确率
   * - VGGNet
     - 86.93%


kvartet's avatar
kvartet committed
240
实验代码在 :githublink:`examples/model_compress/BNN_quantizer_cifar10.py <examples/model_compress/quantization/BNN_quantizer_cifar10.py>`