Hi, I am struggling for several hours with the following issue:

I’ve got a lstm model in pytorch that I want to convert to TVM. Here is the 
sample code of the model. It includes one lstm layer. From what I’ve found 
until now, TVM does not support yet LSTM operators if converting from pytorch 
directly. Therefore I’ve tried to convert my model first to ONNX and then 
convert it to TVM, but the conversion doesn't work well.

Here is the code.

```Python:convert_lstm.py
    import torch
    import torch.nn as nn
    import numpy as np
    import onnxruntime as ort
    import onnx
    import tvm
    import tvm.relay as relay
    from tvm.contrib import graph_runtime
    from IPython import embed

    num_layers = 3
    num_hyperparams = 4
    batch = 1
    hidden_size = 20

    def to_numpy(tensor):
        return tensor.detach().numpy()

    class My_LSTM(nn.Module):
        def __init__(self, num_hyperparams, hidden_size, num_layers):
            super(My_LSTM, self).__init__()
            self.lstm = nn.LSTM(input_size=num_hyperparams,
                                hidden_size=hidden_size,
                                num_layers=num_layers)

        def forward(self, input, hn, cn):
            output, (hn, cn) = self.lstm(input, (hn, cn))
        
            return output, hn, cn

    model = My_LSTM(num_hyperparams, hidden_size, num_layers)

    input = torch.randn(1, batch, num_hyperparams)
    h0 = torch.zeros(num_layers, batch, hidden_size)
    c0 = torch.zeros(num_layers, batch, hidden_size)

    loop_num = 5
    hn = h0
    cn = c0
    output_torch = []

    for i in range(loop_num):
        output, hn, cn = model(input, hn, cn)
        output_torch.append(to_numpy(output[0]))


    onnx_path = 'temp.onnx'
    dummy_input = torch.randn(1, batch, num_hyperparams)
    dummy_h0 = torch.randn(num_layers, batch, hidden_size)
    dummy_c0 = torch.randn(num_layers, batch, hidden_size)

    torch.onnx.export(model, 
            (dummy_input, dummy_h0, dummy_c0),
            onnx_path,
            input_names=['input','h0','c0'],
            output_names=['output', 'hn', 'cn'],
            )

    sess = ort.InferenceSession(onnx_path)
    input_names = [item.name for item in sess.get_inputs()]

    hn = to_numpy(h0)
    cn = to_numpy(c0)
    output_onnx = []

    for i in range(loop_num):
        output, hn, cn = sess.run(None,
            {input_names[0]:to_numpy(input),
             input_names[1]:hn,
             input_names[2]:cn})
        output_onnx.append(output[0])


    onnx_model = onnx.load(onnx_path)
    mod, params = relay.frontend.from_onnx(onnx_model)

    with relay.build_config(opt_level=0):
        graph, lib, params_run = relay.build(mod,
                                         target = "llvm",
                                         params=params)
                                         
    ctx = tvm.cpu()
    m = graph_runtime.create(graph, lib, ctx)
    m.set_input(**params_run)

    hn = to_numpy(h0)
    cn = to_numpy(c0)
    output_tvm = []
    for i in range(loop_num):
        m.set_input('input', to_numpy(input))
        m.set_input('h0', hn)
        m.set_input('c0', cn)
        m.run()
        output_tvm.append(m.get_output(0).asnumpy()[0])
        hn=m.get_output(1)
        cn=m.get_output(2)

    for i in range(2):
        print("loop = %d"%i)
        print("Pytorch     : %f"%output_torch[i][0,0])
        print("OnnxRuntime : %f"%output_onnx[i][0,0])
        print("TVM         : %f"%output_tvm[i][0,0])
```
When you run this code, you will get output similar to the following:

    loop = 0
    Pytorch     : -0.022901
    OnnxRuntime : -0.022901
    TVM         : -0.022901
    loop = 1
    Pytorch     : -0.027888
    OnnxRuntime : -0.027888
    TVM         : -0.016093

This result indicates that if the LSTM has a hidden state of 0, the TVM works, 
otherwise it does not work. How can I load the pytorch lstm model with tvm 
properly?

My environment is below:
- OS: Ubuntu 18.04
- Pytorch: 1.6.0
- ONNX: 1.8.1
- TVM: 0.8.dev0
- onnxruntime: 1.7.0

Thank you.





---
[Visit 
Topic](https://discuss.tvm.apache.org/t/convert-pytorch-lstm-model-to-tvm-via-onnx/9542/1)
 to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click 
here](https://discuss.tvm.apache.org/email/unsubscribe/e512ce3e261d51d13285ec6a24080bce6f0f2c344194f054665c618a9029454b).

Reply via email to