| import pytest |
| import torch |
| from .fuser import set_fuser |
| from .runner import get_nn_runners |
| |
| @pytest.fixture(scope='class') |
| def modeldef(request, net_name, executor, fuser): |
| set_fuser(fuser, executor) |
| |
| # Given a 'net_name' provided by generate_tests, build the thing |
| name, rnn_creator, context = get_nn_runners(net_name)[0] |
| creator_args = creator_args = { |
| 'seqLength': 100, 'numLayers': 1, |
| 'inputSize': 512, 'hiddenSize': 512, |
| 'miniBatch': 64, 'device': 'cuda', 'seed': None |
| } |
| return rnn_creator(**creator_args) |
| |
| def cuda_sync(func, *args, **kwargs): |
| out = func(*args, **kwargs) |
| torch.cuda.synchronize() |
| return out |
| |
| @pytest.mark.benchmark( |
| warmup=True, |
| warmup_iterations=3, |
| disable_gc=True, |
| max_time=0.1, |
| group="fastrnns", |
| ) |
| class TestBenchNetwork: |
| # See 'modeldef' fixture, which provides the things to benchmark |
| def test_forward(self, modeldef, benchmark): |
| forward_output = benchmark(cuda_sync, modeldef.forward, *modeldef.inputs) |
| |
| def test_backward(self, modeldef, benchmark): |
| backward_input = modeldef.forward(*modeldef.inputs) |
| if modeldef.backward_setup is not None: |
| backward_input = modeldef.backward_setup(backward_input) |
| |
| if modeldef.backward is not None: |
| benchmark(cuda_sync, modeldef.backward, *backward_input, retain_graph=True) |
| |
| with torch.no_grad(): |
| for param in modeldef.params: |
| assert param.grad is not None |
| param.grad.zero_() |