| 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_() |