如何保存和加载transformer模型,以便进一步训练和生成文本?PyTorch

r1zhe5dt  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(228)

请告诉我如何保存和加载变压器模型进一步培训?
这篇文章是我写的-https://wingedsheep.com/building-a-language-model
下面是它的代码-https://github.com/wingedsheep/transformer
我希望能够在经过一些训练后保存该模型,以便能够进行微调、训练并将其用于文本生成。
这就是这篇文章的作者所说的:

训练模型后,如果您可以保存它,则会很有用,因此您不必每次都训练新模型。

为此,我们将以下代码添加到WebageModel类中。

def save_checkpoint(self, path):
    print(f'Saving checkpoint {path}')
    torch.save({
        'number_of_tokens': self.number_of_tokens,
        'max_sequence_length': self.max_sequence_length,
        'embedding_dimension': self.embedding_dimension,
        'number_of_layers': self.number_of_layers,
        'number_of_heads': self.number_of_heads,
        'feed_forward_dimension': self.feed_forward_dimension,
        'dropout_rate': self.dropout_rate,
        'model_state_dict': self.state_dict()
    }, path)

@staticmethod
def load_checkpoint(path) -> 'LanguageModel':
    checkpoint = torch.load(path)
    model = LanguageModel(
        number_of_tokens=checkpoint['number_of_tokens'],
        max_sequence_length=checkpoint['max_sequence_length'],
        embedding_dimension=checkpoint['embedding_dimension'],
        number_of_layers=checkpoint['number_of_layers'],
        number_of_heads=checkpoint['number_of_heads'],
        feed_forward_dimension=checkpoint['feed_forward_dimension'],
        dropout_rate=checkpoint['dropout_rate']
    )
    model.load_state_dict(checkpoint['model_state_dict'])
    return model

由于我们使用AutoregressiveWrapper作为便利类,我们也可以给予这个 Package 器保存和加载方法。

def save_checkpoint(self, path):
    self.model.save_checkpoint(path)

@staticmethod
def load_checkpoint(path) -> 'AutoregressiveWrapper':
    model = LanguageModel.load_checkpoint(path)
    return AutoregressiveWrapper(model)
This makes it possible to easily save and load a trained model using.

model.save_checkpoint('./trained_model')
model = model.load_checkpoint('./trained_model')

但这并不奏效

脚本在加载创建、训练和保存的模型并尝试再次训练模型后返回一些错误。

RuntimeError: The size of tensor a (257) must match the size of tensor b (256) at non-singleton dimension 1

我理解,它,也许,但只是一点,在训练模型时,我们需要将其扩展一个单例维度,所以如果它的Tensor大小为256,它将是257,如果我们试图在代码中加载257,它希望大小为256 -我们会得到一个错误。

input_tensor.size() = torch.Size([16, 257]), mask_tensor.size() = torch.Size([16, 257])
RuntimeError: The size of tensor a (257) must match the size of tensor b (256) at non-singleton dimension 1

(+)如果你愿意自己尝试代码-在cuda上运行它会很好。你可以看看指南如何做到这一点与部分所谓的代码“在GPU上运行”。
也许我们需要保存例如一个.txt文件与Tensor大小的数字,使变量出来,但我仍然不知道该怎么办. * 请帮我弄明白 *

abithluo

abithluo1#

你能尝试用下面的代码加载保存的模型吗?

model = AutoregressiveWrapper.load_checkpoint('./trained_model')

这也可能是由于代码中的更新引起的。如果您保存了模型,然后更改了代码,则可能无法再加载它。例如,如果你改变了词汇表的大小。

相关问题