| 9 | |
| 10 | |
| 11 | class TestTFOptimizer(unittest.TestCase): |
| 12 | def _test(self, use_amp): |
| 13 | batch, in_features, out_features = 10, 20, 30 |
| 14 | net = nn.Linear(in_features, out_features, bias=True) |
| 15 | if use_amp: |
| 16 | device = torch.device('cuda') |
| 17 | else: |
| 18 | device = torch.device('cpu') |
| 19 | net.to(device=device) |
| 20 | parameters = net.parameters() |
| 21 | |
| 22 | # Create a pytorch optimizer |
| 23 | # (it will handle everything other than learning rate, |
| 24 | # e.g., normalization, momentum, etc) |
| 25 | _optimizer = torch.optim.Adam( |
| 26 | parameters, # parameters to optimize |
| 27 | lr=1e-3, # this will be overwritten by our optimzier |
| 28 | betas=(0.9, 0.98), |
| 29 | eps=1e-9) |
| 30 | |
| 31 | # wrap our learning rate scheduler |
| 32 | optimizer = TFOptimizer( |
| 33 | optimizer=_optimizer, |
| 34 | model_size=30, |
| 35 | factor=1.0, |
| 36 | warmup=4000, |
| 37 | init_step=0) |
| 38 | |
| 39 | if use_amp: |
| 40 | scaler = torch.cuda.amp.GradScaler() # only if using amp |
| 41 | else: |
| 42 | scaler = None |
| 43 | |
| 44 | for iter in range(10): |
| 45 | |
| 46 | # create a random input |
| 47 | x = torch.randn(batch, in_features).to(device=device) |
| 48 | |
| 49 | with torch.cuda.amp.autocast(enabled=use_amp): # only if using amp |
| 50 | loss = net(x).sum() |
| 51 | |
| 52 | # zero grad |
| 53 | optimizer.zero_grad() |
| 54 | |
| 55 | # compute gradient |
| 56 | if use_amp: |
| 57 | scaler.scale(loss).backward() |
| 58 | optimizer.unscale(scaler=scaler) # |
| 59 | else: |
| 60 | loss.backward() |
| 61 | |
| 62 | # if gradient clipping |
| 63 | nn.utils.clip_grad_norm_(parameters, 1e-3) |
| 64 | |
| 65 | # update parameters |
| 66 | optimizer.step(scaler=scaler) |
| 67 | |
| 68 | # update scaler |
nothing calls this directly
no outgoing calls
no test coverage detected