torchbenchmark/util/gen_torchvision_benchmarks.py (15 lines of code) (raw):

import os from pathlib import Path class_models = ['alexnet', 'vgg16', 'resnet18', 'resnet50', 'squeezenet1_1', 'densenet121', 'mobilenet_v2', 'mobilenet_v3_large', 'shufflenet_v2_x1_0', 'resnext50_32x4d', 'mnasnet1_0'] for class_model in class_models: folder = Path(class_model) if not os.path.isdir(folder): os.makedirs(folder) input_shape = (32, 3, 224, 224) example_inputs = f'(torch.randn({input_shape}).to(self.device),)' eval_inputs = 'example_inputs[0]' init_program = f""" # Generated by gen_torchvision_benchmark.py import torch import torch.optim as optim import torchvision.models as models from ...util.model import BenchmarkModel from torchbenchmark.tasks import COMPUTER_VISION ####################################################### # # DO NOT MODIFY THESE FILES DIRECTLY!!! # USE `gen_torchvision_benchmarks.py` # ####################################################### class Model(BenchmarkModel): task = COMPUTER_VISION.CLASSIFICATION optimized_for_inference = True def __init__(self, device=None, jit=False): super().__init__() self.device = device self.jit = jit self.model = models.{class_model}().to(self.device) self.eval_model = models.{class_model}().to(self.device) self.example_inputs = {example_inputs} if self.jit: if hasattr(torch.jit, '_script_pdt'): self.model = torch.jit._script_pdt(self.model, example_inputs=[self.example_inputs, ]) self.eval_model = torch.jit._script_pdt(self.eval_model) else: self.model = torch.jit.script(self.model, example_inputs=[self.example_inputs, ]) self.eval_model = torch.jit.script(self.eval_model) # model needs to in `eval` # in order to be optimized for inference self.eval_model.eval() self.eval_model = torch.jit.optimize_for_inference(self.eval_model) def get_module(self): return self.model, self.example_inputs # vision models have another model # instance for inference that has # already been optimized for inference def set_eval(self): pass def train(self, niter=3): optimizer = optim.Adam(self.model.parameters()) loss = torch.nn.CrossEntropyLoss() for _ in range(niter): optimizer.zero_grad() pred = self.model(*self.example_inputs) y = torch.empty(pred.shape[0], dtype=torch.long, device=self.device).random_(pred.shape[1]) loss(pred, y).backward() optimizer.step() def eval(self, niter=1): model = self.eval_model example_inputs = self.example_inputs example_inputs = {eval_inputs} for i in range(niter): model(example_inputs) if __name__ == "__main__": m = Model(device="cuda", jit=True) module, example_inputs = m.get_module() module(*example_inputs) m.train(niter=1) m.eval(niter=1) """ with open(folder / '__init__.py', 'w') as f: f.write(init_program) with open(folder / 'install.py', 'w') as f: pass