19
19
import copy
20
20
import numpy as np
21
21
import paddle
22
- from paddle .fluid import framework , global_scope , program_guard , layers
22
+ from paddle .fluid import global_scope , program_guard , layers
23
23
from paddle .fluid .initializer import ConstantInitializer
24
24
from paddle .fluid .contrib import sparsity
25
- from paddle .fluid import core
26
25
27
26
__all__ = [
28
27
'decorate' , 'prune_model' , 'set_excluded_layers' , 'reset_excluded_layers'
@@ -36,6 +35,35 @@ def set_excluded_layers(main_program, param_names):
36
35
Args:
37
36
main_program (Program, optional): Program with model definition and its parameters.
38
37
param_names (list): A list contains names of parameters.
38
+ Examples:
39
+ .. code-block:: python
40
+
41
+ import paddle
42
+ from paddle.static import sparsity
43
+
44
+ paddle.enable_static()
45
+
46
+ main_program = paddle.static.Program()
47
+ startup_program = paddle.static.Program()
48
+
49
+ with paddle.static.program_guard(main_program, startup_program):
50
+ input_data = paddle.static.data(name='data', shape=[None, 128])
51
+ label = paddle.static.data(name='label', shape=[None, 10])
52
+ hidden = paddle.static.nn.fc(x=input_data, num_flatten_dims=-1, size=32, activation=None, name="need_sparse_fc")
53
+ hidden = paddle.static.nn.fc(x=hidden, num_flatten_dims=-1, size=32, activation=None, name="need_dense_fc")
54
+ prob = paddle.static.nn.fc(x=hidden, num_flatten_dims=-1, size=10, activation=None)
55
+ loss = paddle.mean(paddle.nn.functional.square_error_cost(prob, label))
56
+
57
+ # Setup exluded layers out from ASP workflow.
58
+ # Please note, excluded_layers must be set before calling `optimizer.minimize()`.
59
+ sparsity.set_excluded_layers(main_program, ["need_dense_fc"])
60
+
61
+ optimizer = paddle.optimizer.SGD(learning_rate=0.1)
62
+ optimizer = paddle.static.amp.decorate(optimizer )
63
+ # Calling sparsity.decorate() to wrap minimize() in optimizer, which
64
+ # will insert necessary masking operations for ASP workflow.
65
+ optimizer = sparsity.decorate(optimizer)
66
+ optimizer.minimize(loss, startup_program)
39
67
"""
40
68
ASPHelper .set_excluded_layers (
41
69
main_program = main_program , param_names = param_names )
@@ -48,6 +76,33 @@ def reset_excluded_layers(main_program=None):
48
76
49
77
Args:
50
78
main_program (Program, optional): Program with model definition and its parameters.
79
+ Examples:
80
+ .. code-block:: python
81
+
82
+ import paddle
83
+ from paddle.static import sparsity
84
+
85
+ paddle.enable_static()
86
+
87
+ main_program = paddle.static.Program()
88
+ startup_program = paddle.static.Program()
89
+
90
+ with paddle.static.program_guard(main_program, startup_program):
91
+ input_data = paddle.static.data(name='data', shape=[None, 128])
92
+ label = paddle.static.data(name='label', shape=[None, 10])
93
+ hidden = paddle.static.nn.fc(x=input_data, num_flatten_dims=-1, size=32, activation=None, name="my_first_fc")
94
+ hidden = paddle.static.nn.fc(x=hidden, num_flatten_dims=-1, size=32, activation=None, name="my_second_fc")
95
+ prob = paddle.static.nn.fc(x=hidden, num_flatten_dims=-1, size=10, activation=None)
96
+ loss = paddle.mean(paddle.nn.functional.square_error_cost(prob, label))
97
+
98
+ # Setup exluded layers out from ASP workflow.
99
+ # Please note, excluded_layers must be set before calling `optimizer.minimize()`.
100
+ sparsity.set_excluded_layers(main_program, ["my_second_fc"])
101
+ # Now the weights of "my_second_fc" would not be included in Automatic SParsity's workflow.
102
+
103
+ # Reset excluded_layers, all FC layers would be included into Automatic SParsity's workflow.
104
+ # Please note, reset_excluded_layers also must be called before calling `optimizer.minimize()`.
105
+ sparsity.reset_excluded_layers(main_program)
51
106
"""
52
107
ASPHelper .reset_excluded_layers (main_program = main_program )
53
108
@@ -65,22 +120,21 @@ def decorate(optimizer):
65
120
.. code-block:: python
66
121
67
122
import paddle
68
- import paddle.fluid as fluid
69
- from paddle.fluid.contrib import sparsity
123
+ from paddle.static import sparsity
70
124
71
- main_program = fluid .Program()
72
- startup_program = fluid .Program()
125
+ main_program = paddle.static .Program()
126
+ startup_program = paddle.static .Program()
73
127
74
128
paddle.enable_static()
75
129
76
- with fluid .program_guard(main_program, startup_program):
77
- input_data = fluid.layers .data(name='data', shape=[None, 128])
78
- label = fluid.layers .data(name='label', shape=[None, 10])
79
- hidden = fluid.layers. fc(input =input_data, num_flatten_dims=-1, size=32, act =None)
80
- prob = fluid.layers. fc(input =hidden, num_flatten_dims=-1, size=10, act =None)
81
- loss = fluid.layers. mean(fluid.layers .square_error_cost(prob, label))
130
+ with paddle.static .program_guard(main_program, startup_program):
131
+ input_data = paddle.static .data(name='data', shape=[None, 128])
132
+ label = paddle.static .data(name='label', shape=[None, 10])
133
+ hidden = paddle.static.nn. fc(x =input_data, num_flatten_dims=-1, size=32, activation =None)
134
+ prob = paddle.static.nn. fc(x =hidden, num_flatten_dims=-1, size=10, activation =None)
135
+ loss = paddle. mean(paddle.nn.functional .square_error_cost(prob, label))
82
136
83
- optimizer = fluid .optimizer.SGD(learning_rate=0.1)
137
+ optimizer = paddle .optimizer.SGD(learning_rate=0.1)
84
138
optimizer = sparsity.decorate(optimizer)
85
139
# if do sparse training with Fleet, please replace above decorate with:
86
140
# strategy = paddle.distributed.fleet.DistributedStrategy()
@@ -92,15 +146,14 @@ def decorate(optimizer):
92
146
return ASPHelper .decorate (optimizer )
93
147
94
148
95
- def prune_model (place ,
96
- main_program = None ,
149
+ def prune_model (main_program = None ,
97
150
n = 2 ,
98
151
m = 4 ,
99
- func_name = sparsity . MaskAlgo . MASK_1D ,
152
+ mask_algo = 'mask_1d' ,
100
153
with_mask = True ):
101
154
r"""
102
155
Pruning parameters of supported layers in :attr:`main_program` via
103
- specified mask generation function given by :attr:`func_name `. This
156
+ specified mask generation function given by :attr:`mask_algo `. This
104
157
function supports both training and inference controlled by :attr:`with_mask`.
105
158
If :attr:`with_mask` is True, it would also prune parameter related ASP mask Variables,
106
159
else only prunes parameters.
@@ -114,62 +167,70 @@ def prune_model(place,
114
167
inference only. To obtain OptimizerWithSparsityGuarantee, please see `sparsity.decoreate()`.
115
168
116
169
Args:
117
- place (fluid.CPUPlace()|fluid.CUDAPlace(N)): Device place for pruned parameter and mask Variables, and N means the GPU's id. It should be the same as created instance of Executor.
118
170
main_program (Program, optional): Program with model definition and its parameters. Default is `paddle.static.default_main_program()
119
171
n (int): n of `n:m` sparse pattern.
120
172
m (int): m of `n:m` sparse pattern.
121
- func_name (MaskAlgo, optional): The function name to generate spase mask. Default is `MaskAlgo.MASK_1D`. All options please refer to `MaskAlgo`.
173
+ mask_algo (string, optional): The function name to generate spase mask. Default is `mask_1d`.
174
+ The vaild inputs should be one of 'mask_1d', 'mask_2d_greedy' and 'mask_2d_best'.
122
175
with_mask (bool, optional): To prune mask Variables related to parameters or not. Ture is purning also, False is not. Defalut is True.
123
176
Returns:
124
177
dictionary: A dictionary with key: `parameter name` (string) and value: its corresponding mask Variable.
125
178
Examples:
126
179
.. code-block:: python
127
180
128
181
import paddle
129
- import paddle.fluid as fluid
130
- import paddle.fluid.core as core
131
- from paddle.fluid.contrib import sparsity
182
+ from paddle.static import sparsity
132
183
133
184
paddle.enable_static()
134
185
135
- main_program = fluid .Program()
136
- startup_program = fluid .Program()
186
+ main_program = paddle.static .Program()
187
+ startup_program = paddle.static .Program()
137
188
138
- place = paddle.CPUPlace()
139
- if core.is_compiled_with_cuda():
140
- place = paddle.CUDAPlace(0)
141
-
142
- with fluid.program_guard(main_program, startup_program):
143
- input_data = fluid.layers.data(name='data', shape=[None, 128])
144
- label = fluid.layers.data(name='label', shape=[None, 10])
145
- hidden = fluid.layers.fc(input=input_data, num_flatten_dims=-1, size=32, act=None, name="need_sparse")
146
- hidden = fluid.layers.fc(input=hidden, num_flatten_dims=-1, size=32, act=None, name="need_dense")
147
- prob = fluid.layers.fc(input=hidden, num_flatten_dims=-1, size=10, act=None)
148
- loss = fluid.layers.mean(fluid.layers.square_error_cost(prob, label))
189
+ with paddle.static.program_guard(main_program, startup_program):
190
+ input_data = paddle.static.data(name='data', shape=[None, 128])
191
+ label = paddle.static.data(name='label', shape=[None, 10])
192
+ hidden = paddle.static.nn.fc(x=input_data, num_flatten_dims=-1, size=32, activation=None, name="need_sparse_fc")
193
+ hidden = paddle.static.nn.fc(x=hidden, num_flatten_dims=-1, size=32, activation=None, name="need_dense_fc")
194
+ prob = paddle.static.nn.fc(x=hidden, num_flatten_dims=-1, size=10, activation=None)
195
+ loss = paddle.mean(paddle.nn.functional.square_error_cost(prob, label))
149
196
150
197
# Setup exluded layers out from ASP workflow.
151
198
# Please note, excluded_layers must be set before calling `optimizer.minimize()`.
152
- sparsity.set_excluded_layers(main_program, ["need_dense "])
199
+ sparsity.set_excluded_layers(main_program, ["need_dense_fc "])
153
200
154
- optimizer = fluid .optimizer.SGD(learning_rate=0.1)
155
- optimizer = fluid.contrib.mixed_precision.decorator .decorate(optimizer )
201
+ optimizer = paddle .optimizer.SGD(learning_rate=0.1)
202
+ optimizer = paddle.static.amp .decorate(optimizer )
156
203
# Calling sparsity.decorate() to wrap minimize() in optimizer, which
157
204
# will insert necessary masking operations for ASP workflow.
158
205
optimizer = sparsity.decorate(optimizer)
159
206
optimizer.minimize(loss, startup_program)
160
207
161
- exe = fluid.Executor(place)
208
+ device = paddle.device.get_device()
209
+ place = paddle.set_device(device)
210
+
211
+ exe = paddle.static.Executor(place)
162
212
exe.run(startup_program)
163
213
164
214
# Must call `exe.run(startup_program)` first before calling `sparsity.prune_model`
165
- sparsity.prune_model(place, main_program, func_name=sparsity.MaskAlgo.MASK_2D_BEST )
215
+ sparsity.prune_model(main_program, mask_algo='mask_2d_best' )
166
216
"""
217
+ device = paddle .device .get_device ()
218
+ place = paddle .set_device (device )
219
+
220
+ MaskAlgo_mapping = {
221
+ 'mask_1d' : sparsity .MaskAlgo .MASK_1D ,
222
+ 'mask_2d_greedy' : sparsity .MaskAlgo .MASK_2D_GREEDY ,
223
+ 'mask_2d_best' : sparsity .MaskAlgo .MASK_2D_BEST
224
+ }
225
+ assert (mask_algo in MaskAlgo_mapping ), \
226
+ 'The "mask_algo" should be one of ["mask_1d", "mask_2d_greedy", "mask_2d_best"]'
227
+
167
228
return ASPHelper .prune_model (
168
229
place = place ,
169
230
main_program = main_program ,
170
231
n = n ,
171
232
m = m ,
172
- func_name = func_name ,
233
+ mask_algo = MaskAlgo_mapping [ mask_algo ] ,
173
234
with_mask = with_mask )
174
235
175
236
@@ -256,12 +317,12 @@ def prune_model(cls,
256
317
main_program = None ,
257
318
n = 2 ,
258
319
m = 4 ,
259
- func_name = sparsity .MaskAlgo .MASK_1D ,
320
+ mask_algo = sparsity .MaskAlgo .MASK_1D ,
260
321
with_mask = True ):
261
322
r"""
262
323
This is the implementation of `sparsity.prune_model`, for details please see explanation in `sparsity.prune_model`.
263
324
"""
264
- checked_func_name = sparsity .CheckMethod .get_checking_method (func_name )
325
+ checked_func_name = sparsity .CheckMethod .get_checking_method (mask_algo )
265
326
266
327
if main_program is None :
267
328
main_program = paddle .static .default_main_program ()
@@ -284,7 +345,7 @@ def prune_model(cls,
284
345
# matrices beforce invoking create_mask. Then we transpose the result maks to make
285
346
# sure its shape to be the same as the input weight.
286
347
weight_sparse_mask = sparsity .create_mask (
287
- weight_nparray .T , func_name = func_name , n = n , m = m ).T
348
+ weight_nparray .T , func_name = mask_algo , n = n , m = m ).T
288
349
weight_pruned_nparray = np .multiply (weight_nparray ,
289
350
weight_sparse_mask )
290
351
weight_tensor .set (weight_pruned_nparray , place )
@@ -347,15 +408,14 @@ def _is_supported_layer(cls, main_program, param_name):
347
408
Examples:
348
409
.. code-block:: python
349
410
350
- import paddle.fluid as fluid
351
- from paddle.fluid.contrib.sparsity.asp import ASPHelper
411
+ from paddle.static.sparsity.asp import ASPHelper
352
412
353
- main_program = fluid .Program()
354
- startup_program = fluid .Program()
413
+ main_program = paddle.static .Program()
414
+ startup_program = paddle.static .Program()
355
415
356
- with fluid .program_guard(main_program, startup_program):
357
- input_data = fluid.layers .data(name='data', shape=[None, 128])
358
- fc = fluid.layers. fc(input =input_data, num_flatten_dims=-1, size=32, act =None)
416
+ with paddle.static .program_guard(main_program, startup_program):
417
+ input_data = paddle.static .data(name='data', shape=[None, 128])
418
+ fc = paddle.static.nn. fc(x =input_data, num_flatten_dims=-1, size=32, activation =None)
359
419
360
420
for param in main_program.global_block().all_parameters():
361
421
ASPHelper._is_supported_layer(main_program, param.name)
0 commit comments