【发布时间】:2021-03-22 18:38:57
【问题描述】:
我正在使用 fastai 和 pytorch 来微调来自 huggingface 的 XLMRoberta。 我已经训练了模型,并且在我训练它的机器上一切正常。
但是当我尝试在另一台机器上加载模型时,我得到OSError - Not Found - No such file or directory 指向.cache/torch/transformers/。问题是vocab_file 的路径。
我使用 fastai 的 Learner.export 将模型导出到 .pkl 文件中,但我不认为这个问题与 fastai 有关,因为我发现 the same issue 出现在 flairNLP 中。
似乎在训练期间存储 vocab_file 的缓存文件夹的路径嵌入在 .pkl 文件中:
错误来自transformer的XLMRobertaTokenizer__setstate__:
def __setstate__(self, d):
self.__dict__ = d
self.sp_model = spm.SentencePieceProcessor()
self.sp_model.Load(self.vocab_file)
它尝试使用文件中的路径加载 vocab_file。
我尝试使用以下方法修补此方法:
pretrained_model_name = "xlm-roberta-base"
vocab_file = XLMRobertaTokenizer.from_pretrained(pretrained_model_name).vocab_file
def _setstate(self, d):
self.__dict__ = d
self.sp_model = spm.SentencePieceProcessor()
self.sp_model.Load(vocab_file)
XLMRobertaTokenizer.__setstate__ = MethodType(_setstate, XLMRobertaTokenizer(vocab_file))
这成功加载了模型,但导致了其他问题,例如缺少模型属性和其他不需要的问题。
有人可以解释一下为什么文件中嵌入了路径,有没有办法在不重新导出模型的情况下配置它,或者如果必须重新导出,如何使用 fastai、torch 和 huggingface 动态配置它。
【问题讨论】:
-
.cache/torch/transformers是默认缓存位置,不应用于加载模型。我实际上并不完全确定您要做什么,但是当 fastai(从未使用过它)有导出时,为什么不使用相应的导入?存储 hugginface 模型和标记器的正确方法是使用save_pretrained(location)。您可以稍后使用from_pretrained从此位置加载标记器和模型。 -
@cronoik 谢谢你的评论。是的,我知道 huggingface 中的
pretrained函数,但所有库都交织在一起,我必须覆盖 fastai 导出的某些部分。不管怎样,我会仔细看看我能做什么,但现在我通过创建 Docker 映像解决了这个问题。 -
我之前问过你,但是fastai没有导入功能吗?
标签: nlp pytorch huggingface-transformers fast-ai