By doing the above tricks, we are able to fuse the almost all LSTMCell forward graph (except the two gemm kernels) into a single fusion group, which corresponds to the prim::FusionGroup_0 in the above IR graph. It will then be launched into a single fused kernel for execution. With these optimizations the model performance improves significantly with average forward time reduced by around 17ms (1.7x speedup) to 10ms, and average backward time reduce by 37ms to 27ms (1.37x speed up). 
LSTM Layer (forward)
```python
class LSTMLayer(jit.ScriptModule):
    def init(self, cell, cell_args):
        super(LSTMLayer, self).init()
        self.cell = cell(cell_args)
@jit.script_method
def forward(self, input, state):
    # type: (Tensor, Tuple[Tensor, Tensor]) -> Tuple[Tensor, Tuple[Tensor, Tensor]]
    inputs = input.unbind(0)
    outputs = torch.jit.annotate(List[Tensor], [])
    for i in range(len(inputs)):
        out, state = self.cell(inputs[i], state)
