torchbenchmark/util/gen_hf_generative.py (27 lines of code) (raw):

import os from pathlib import Path class_models = [ ('hf_GPT2', (4, 512), 1024, 'AutoConfig.from_pretrained("gpt2")', 'AutoModelForCausalLM'), ('hf_T5', (2, 1024), 2048, 'AutoConfig.from_pretrained("t5-small")', 'AutoModelForSeq2SeqLM'), ('hf_Bart', (4, 512), 512, 'AutoConfig.from_pretrained("facebook/bart-base")', 'AutoModelForSeq2SeqLM'), ('hf_Reformer', (8, 4096), 4096, 'ReformerConfig()', 'AutoModelForMaskedLM'), ('hf_BigBird', (2, 1024), 4096, 'BigBirdConfig(attention_type="block_sparse",)', 'AutoModelForMaskedLM'), ('hf_Albert', (8, 512), 512, 'AutoConfig.from_pretrained("albert-base-v2")', 'AutoModelForMaskedLM'), ('hf_DistilBert', (8, 512), 512, 'AutoConfig.from_pretrained("distilbert-base-uncased")', 'AutoModelForMaskedLM'), ('hf_Longformer', (2, 1024), 4096, 'AutoConfig.from_pretrained("allenai/longformer-base-4096")', 'AutoModelForMaskedLM'), ('hf_Bert', (4, 512), 512, 'BertConfig()', 'AutoModelForMaskedLM') ] for name, input_shape, eval_length, config, model in class_models: folder = Path(name) if not os.path.isdir(folder): os.makedirs(folder) init_program = f""" #################################### # Generated by gen_hf_generative.py# #################################### import torch import torch.optim as optim import torchvision.models as models from ...util.model import BenchmarkModel from torchbenchmark.tasks import NLP from transformers import * from datasets import load_dataset class Model(BenchmarkModel): task = NLP.LANGUAGE_MODELING def __init__(self, device=None, jit=False): super().__init__() self.device = device self.jit = jit torch.manual_seed(42) config = {config} self.model = {model}.from_config(config).to(device) self.optimizer = optim.Adam(self.model.parameters(), lr=0.001) input_ids = torch.randint(0, config.vocab_size, {input_shape}).to(device) decoder_ids = torch.randint(0, config.vocab_size, {input_shape}).to(device) eval_context = torch.randint(0, config.vocab_size, (1, {eval_length})).to(device) self.train_inputs = {{'input_ids': input_ids, 'labels': decoder_ids}} self.eval_inputs = {{'input_ids': eval_context, {"'decoder_input_ids': eval_context" if model == 'AutoModelForSeq2SeqLM' else ''}}} def get_module(self): if self.jit: raise NotImplementedError() return self.model, self.eval_inputs def train(self, niter=3): if self.jit: raise NotImplementedError() self.model.train() for _ in range(niter): outputs = self.model(**self.train_inputs) loss = outputs.loss loss.backward() self.optimizer.step() def eval(self, niter=1): if self.jit: raise NotImplementedError() self.model.eval() with torch.no_grad(): for _ in range(niter): out = self.model(**self.eval_inputs) if __name__ == "__main__": import time m = Model(device="cuda") module, example_inputs = m.get_module() m.train(niter=1) torch.cuda.synchronize() begin = time.time() m.train(niter=1) torch.cuda.synchronize() print(time.time()-begin) begin = time.time() m.eval(niter=1) torch.cuda.synchronize() print(time.time()-begin) """ with open(folder / '__init__.py', 'w') as f: f.write(init_program) with open(folder / 'install.py', 'w') as f: pip_install_str = """ import subprocess import sys def pip_install_requirements(): subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-q', '-r', 'requirements.txt']) if __name__ == '__main__': pip_install_requirements() """ f.write(pip_install_str) with open(folder / 'requirements.txt', 'w') as f: f.write('transformers==4.5.0\n') f.write('sentencepiece\n') f.write('datasets\n')