I expanded on the code of @shaabhishek to allow sequences of length zero, but ended up not using it anyway. Hope this might help someone else.
from typing import List, Tuple
import torch
import torch.nn.utils.rnn as rnn


def pack(sequence: List[torch.Tensor]) -> Tuple[rnn.PackedSequence, List[int]]:
    lengths = list(map(len, sequence))
    tensors = [tensor for length, tensor in zip(lengths, sequence) if length > 0]
    packed_sequence = rnn.pack_sequence(tensors)
    return packed_sequence, lengths


def unpack(packed_sequence: rnn.PackedSequence, lengths: List[int]) -> List[torch.Tensor]:
    trailing_dims = packed_sequence.data.shape[1:]
    unpacked_sequence = []
    idx_map = {}
    head = 0
    for b_idx, length in enumerate(lengths):
        unpacked_sequence.append(torch.zeros(length, *trailing_dims))
        if length > 0:
            idx_map[head] = b_idx
            head += 1
    head = 0
    for l_idx, b_size in enumerate(packed_sequence.batch_sizes):
        for b_idx in range(b_size):
            unpacked_sequence[idx_map[b_idx]][l_idx] = packed_sequence.data[head]
            head += 1
    return unpacked_sequence