model(X_train_torch)[0] gives:
tensor([[-355.4695, -424.0195, -681.5226],
        [-339.5056, -432.3004, -696.3847],
        [-359.5927, -438.7826, -705.6765],
        [-346.2557, -439.3127, -707.5528],
        [-359.3715, -437.6559, -703.8282],
        [-356.7079, -443.8343, -714.3834],
        [-357.2831, -442.1734, -711.5266],
        [-355.7645, -442.3993, -712.0264],
        [-359.3816, -440.9185, -709.2794],
        [-357.2108, -443.9724, -714.5976],
        [-355.9514, -443.8340, -714.3595],
        [-359.4459, -440.7137, -708.9507],
        [-359.6165, -440.2903, -708.2195],
        [-357.3955, -443.4591, -713.6996],
        [-359.5545, -442.3593, -711.6683],
        [-356.2823, -443.2863, -713.4790],
        [-359.6244, -439.4549, -706.8243],
        [-358.2084, -445.1720, -716.4835],
        [-359.5984, -437.4826, -703.5777],
        [-356.8849, -442.9969, -712.9752]], grad_fn=<SelectBackward>)

which is shape:
torch.Size([20, 3])

Made a change as ptrblck suggested and I have become closer to truth data of output. At least it looks better. Going deeper in what ptrblck said.
tensor([[0.0890, 0.0380, 0.0673],
        [0.0890, 0.0379, 0.0674],
        [0.0891, 0.0380, 0.0674],
        [0.0891, 0.0379, 0.0674],
        [0.0891, 0.0379, 0.0674],
        [0.0892, 0.0380, 0.0675],
        [0.0891, 0.0380, 0.0675],
        [0.0891, 0.0378, 0.0673],
        [0.0891, 0.0378, 0.0673],
        [0.0891, 0.0379, 0.0676],
        [0.0890, 0.0379, 0.0674],
        [0.0890, 0.0379, 0.0675],
        [0.0891, 0.0379, 0.0674],
        [0.0892, 0.0379, 0.0675],
        [0.0891, 0.0379, 0.0674],
        [0.0892, 0.0380, 0.0675],
        [0.0891, 0.0380, 0.0675],
        [0.0891, 0.0379, 0.0675],
        [0.0891, 0.0379, 0.0674],
        [0.0892, 0.0379, 0.0675]], grad_fn=<SelectBackward>)

Obviously problem with seq_len because 20 is seq_len not a batch_size:
torch.Size([20, 3])

Trying to change input data to match manual [seq_len, batch_size, *]. Got an error:
ValueError: Expected input batch_size (20) to match target batch_size (27).

Will try to debug.
Shape of output from model(input) is still:
torch.Size([20, 27, 3])

Strange we did self.lstm1(x)[0]) that should destroy dimension 20.
Obviously, I should change the code in lstm part of my model to match dimension, it seems that tanh make it fit for the next lstm which is not right because I want to feed it to Linear. As was suggested to me earlier. Will try to debug the model.
According to the manual tanh doesn’t change output:
input (Tensor) – the input tensor
out (Tensor, optional) – the output tensor

Will try to look manual for lstm.
Changing model to:
        x = torch.tanh(self.lstm1(x))
        x = torch.tanh(self.lstm2(x))
        x = torch.tanh(self.lstm3(x))
        x = torch.tanh(self.lstm4(x)[0])

Didn’t help. Got error:
TypeError: tanh(): argument 'input' (position 1) must be Tensor, not tuple

What if I try:
    class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()
        self.lstm1 = nn.LSTM(input_size=87, hidden_size=256)
        self.lstm2 = nn.LSTM(input_size=256, hidden_size=128)
        self.lstm3 = nn.LSTM(input_size=128, hidden_size=64)
        self.lstm4 = nn.LSTM(input_size=64, hidden_size=32)
        self.fc1 = nn.Linear(in_features=32, out_features=128)
        self.fc2 = nn.Linear(in_features=128, out_features=64)
        self.fc3 = nn.Linear(in_features=64, out_features=32)
        self.fc4 = nn.Linear(in_features=32, out_features=3)

    def forward(self, x):
        x = torch.tanh(self.lstm1(x)[0])
        x = torch.tanh(self.lstm2(x)[0])
        x = torch.tanh(self.lstm3(x)[0])
        x = torch.tanh(self.lstm4(x)[0][0])
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = self.fc4(x)
        return x

Oh my God, it finally worked 
And acc:
Training accuracy: 100.0%
Testing accuracy: 100.0%


Thank you very much ptrblck,all is good!