# ------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. # -------------------------------------------------------------------------- import torch from torch.onnx import _OrtBackend, _OrtBackendOptions def make_aot_ort(): """Implements an autograd backend for torch.compile based on onnxrt backend.""" options = _OrtBackendOptions() ort_backend = _OrtBackend(options=options) return ort_backend def train_loop(model, *args, loss_fn=None, optimizer=None): """Implements a training loop to be used in tests.""" if loss_fn is None: loss_fn = torch.nn.MSELoss() if optimizer is None: optimizer = torch.optim.SGD(model.parameters(), lr=1e-3) # Set the model to training mode - important for batch normalization and dropout layers # Unnecessary in this situation but added for best practices model.train() # Compute prediction and loss pred = model(*args) if isinstance(pred, tuple): v = pred[0] elif hasattr(pred, "last_hidden_state"): v = pred.last_hidden_state else: v = pred loss = loss_fn(v, torch.ones_like(v)) # Backpropagation loss.backward() optimizer.step() # skip that part to retrieve the gradients # optimizer.zero_grad() # returns the gradients res = tuple(p.grad for p in model.parameters() if p.grad is not None) assert len(res) > 0, f"No gradient, loss is {loss}" return res