Skip to content

Commit 1af0ccd

Browse files
committed
add arg differentiable for Optimizer, SGD
1 parent 4ce8ac4 commit 1af0ccd

3 files changed

Lines changed: 30 additions & 1 deletion

File tree

python/paddle/optimizer/optimizer.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ def __init__(
218218
weight_decay: float | WeightDecayRegularizer | None = None,
219219
grad_clip: GradientClipBase | None = None,
220220
name: str | None = None,
221+
*,
222+
differentiable: bool = False,
221223
) -> None:
222224
if parameters is not None:
223225
# paddle.Tensor is also iterable, so here we don't check whether
@@ -331,6 +333,13 @@ def __init__(
331333
self._fuse_buffer_version = 0
332334
self.merged_model_params = None
333335

336+
grad_decorator = (
337+
imperative_base.enable_grad()
338+
if differentiable
339+
else imperative_base.no_grad()
340+
)
341+
self.step = grad_decorator(self.step)
342+
334343
def _create_master_grad_states(self):
335344
# master gradients states
336345
if in_pir_mode():
@@ -2040,7 +2049,6 @@ def _declarative_step(self):
20402049
params_grads = [(param, param.grad) for param in parameters]
20412050
optimize_ops = self.apply_gradients(params_grads)
20422051

2043-
@imperative_base.no_grad()
20442052
@framework.non_static_only
20452053
def step(
20462054
self, closure: Callable[[], Tensor] | None = None

python/paddle/optimizer/sgd.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ def __init__(
9898
grad_clip: GradientClipBase | None = None,
9999
multi_precision: bool = False,
100100
name: str | None = None,
101+
*,
102+
differentiable: bool = False,
101103
) -> None:
102104
if learning_rate is None:
103105
raise ValueError("learning_rate is not set")
@@ -107,6 +109,7 @@ def __init__(
107109
weight_decay=weight_decay,
108110
grad_clip=grad_clip,
109111
name=name,
112+
differentiable=differentiable,
110113
)
111114
self.type = "sgd"
112115
self._multi_precision = multi_precision

test/legacy_test/test_optimizer.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,24 @@ def test_weight_decay_int(self):
182182
adam.step()
183183
adam.zero_grad(False)
184184

185+
def test_differentiable(self):
186+
paddle.seed(100)
187+
numpy.random.seed(100)
188+
paddle.disable_static()
189+
x = paddle.arange(26, dtype="float32").reshape([2, 13])
190+
x.stop_gradient = False
191+
linear = paddle.nn.Linear(13, 5)
192+
optimizer = paddle.optimizer.SGD(
193+
learning_rate=0.01,
194+
parameters=linear.parameters(),
195+
differentiable=True,
196+
)
197+
optimizer.zero_grad()
198+
output = linear(x)
199+
loss = paddle.mean(output)
200+
loss.backward()
201+
optimizer.step()
202+
185203
def test_step_without_closure(self):
186204
paddle.seed(100)
187205
numpy.random.seed(100)

0 commit comments

Comments
 (0)