Skip to content

Commit eb72230

Browse files
committed
test(dschat): assert masked nonfinite logprobs have no policy gradient
1 parent 2cac0da commit eb72230

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
"""CPU regression checks for masked PPO policy log-ratios."""
5+
6+
import pytest
7+
import torch
8+
9+
from dschat.rlhf.ppo_trainer import DeepSpeedPPOTrainer
10+
11+
12+
@pytest.mark.parametrize("padding_case", ["negative_infinity", "nan"])
13+
def test_actor_loss_ignores_nonfinite_masked_logprobs(padding_case):
14+
trainer = DeepSpeedPPOTrainer.__new__(DeepSpeedPPOTrainer)
15+
trainer.cliprange = 0.2
16+
17+
old = torch.tensor([[-1.0, -1.0, -1.0]])
18+
logprobs = old.clone()
19+
if padding_case == "negative_infinity":
20+
old[0, 0] = float("-inf")
21+
logprobs[0, 0] = float("-inf")
22+
else:
23+
logprobs[0, 0] = float("nan")
24+
logprobs.requires_grad_()
25+
26+
mask = torch.tensor([[0.0, 1.0, 1.0]])
27+
loss = trainer.actor_loss_fn(logprobs, old, torch.ones_like(logprobs), mask)
28+
loss.backward()
29+
30+
torch.testing.assert_close(loss, torch.tensor(-1.0))
31+
torch.testing.assert_close(logprobs.grad, torch.tensor([[0.0, -0.5, -0.5]]))
32+
assert torch.isfinite(logprobs.grad).all()
33+
34+
35+
def test_actor_loss_keeps_normal_unmasked_gradient():
36+
trainer = DeepSpeedPPOTrainer.__new__(DeepSpeedPPOTrainer)
37+
trainer.cliprange = 0.2
38+
old = torch.tensor([[-1.0, -1.0]])
39+
logprobs = old.clone().requires_grad_(True)
40+
loss = trainer.actor_loss_fn(
41+
logprobs,
42+
old,
43+
torch.ones_like(logprobs),
44+
torch.ones_like(logprobs),
45+
)
46+
loss.backward()
47+
torch.testing.assert_close(loss, torch.tensor(-1.0))
48+
torch.testing.assert_close(logprobs.grad, torch.tensor([[-0.5, -0.5]]))

0 commit comments

Comments
 (0)